Visual Studio 2013 Express
 Visual C++( アンマネージドコード )
 OpenCV 3.1

■288.OpenCV 画像のテンプレートマッチング Prev Top Next
関連ページ:

画像のテンプレートマッチングを行います。これはあらかじめ用意したテンプレートと入力画像がどれくらい似ているかの類似度を単純に比較するものです。


---main.cpp---

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>

#pragma comment( lib, "opencv_world300d.lib" )

int main(int argc, const char* argv[])
{
   int hr = -1;

   try
   {
      cv::Mat img, tmp, result;

      // 画像読み込み
      img = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/50/Texture.png", cv::IMREAD_COLOR);
      tmp = cv::imread("D:/TEMP/MaverickProj/Image/OpenCV/50/Texture1.png", cv::IMREAD_COLOR);

      cv::namedWindow("img", 1);
      imshow("img", img);
      
      // テンプレートと,それに重なった画像領域とを比較
      cv::matchTemplate(
         img,                 // テンプレートの探索対象となる画像.8ビットまたは32ビットの浮動小数点型.
         tmp,                 // 探索されるテンプレート.探索対象となる画像以下のサイズで,同じデータ型でなければならない
         result,              // 比較結果のマップ
         CV_TM_SQDIFF_NORMED  // 比較手法
         );

      double val;
      cv::Point pt;

      // 配列全体あるいは部分配列に対する,大域的最小値
      cv::minMaxLoc(result, &val, nullptr, &pt, nullptr);

      // 結果が小さいほど一致率が高いと判断する
      if (val < 0.01)
      {
         // 矩形を描画
         cv::rectangle(img,
            pt,                                   // 矩形の1つの頂点座標
            pt + cv::Point(tmp.cols, tmp.rows),   // 矩形の反対側の頂点座標
            cv::Scalar(0, 0, 255),                // 色
            2,                                    // 矩形の枠線の太さ
            cv::LINE_8                            // 枠線の種類
            );
      }

      cv::namedWindow("img2", 1);
      imshow("img2", img);

      cv::namedWindow("tmp", 1);
      cv::imshow("tmp", tmp);

      cv::waitKey(0);

      hr = 0;
   }

   catch (cv::Exception ex)
   {
      std::cout << ex.err << std::endl;
   }

   // ウィンドウの破棄
   cv::destroyAllWindows();

   return hr;
}

検索対象の画像

検索される画像

結果


Prev Top Next
inserted by FC2 system