質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

0回答

5188閲覧

opencvを利用した複数枚のテンプレートマッチング

yamata

総合スコア36

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/06/23 04:16

編集2022/01/12 10:55

opencvを利用して、カメラで写真を撮り、撮った写真に対してテンプレートマッチングを行うプログラムを作っています。

現状では、キーボードを押すと写真を撮り、その写真に対してマッチングを行うことまでできました。

解決したいことは、
・キーボードを押すと5秒おきに写真を自動で撮影し、自動的にマッチングを行う
・1つの写真に対して、5枚くらいのテンプレートをあてはめてマッチングを行いたい(撮影した写真に5枚のテンプレートをマッチングさせて判断)
・写真を撮ってから、マッチングまでの時間を計測したい→解決しました!
の2点があります。

初心者な為、教えていただけたらと思います。

使用環境は、opencv2.4.9、VC++2010Expressです。

以下に現状のプログラムをのせます。(include部分は省略)
よろしくお願いします。

using namespace cv; //静止画像をマッチング int _tmain( int argc , _TCHAR* argv[]) { int key;//キー入力用の変数 CvCapture *capture;//カメラキャプチャ用の構造体 IplImage *frameImage;//キャプチャ画像用IplImage char windowNameCapture[] = "Capture";//キャプチャした画像を表示するウィンドウの名前 int counter = 0; char str[32]; //カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { //カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } //Windowの生成 cvNamedWindow("Show", CV_WINDOW_AUTOSIZE); //カメラ・デバイスから画像を取得 frameImage=cvQueryFrame(capture); //メインループ while ( 1 ) { //カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); //画像を表示する cvShowImage( windowNameCapture, frameImage ); //'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } else if( key == 'c') { sprintf_s(str, "sign.bmp", counter++); cvSaveImage(str, frameImage ); //--------原画像を読み込む--------- Mat src_image = imread("sign.bmp"); namedWindow("原画像"); imshow("原画像", src_image); //---------テンプレート画像を読み込む------- Mat temp_image = imread("temp.png"); namedWindow("テンプレート画像"); imshow("テンプレート画像",temp_image); //Mat temp1_image = imread("temp1.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像1",temp1_image); //Mat temp2_image = imread("temp2.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像2",temp2_image); //Mat temp3_image = imread("temp3.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像3",temp3_image); //Mat temp4_image = imread("temp4.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像4",temp4_image); //Mat temp5_image = imread("temp5.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像5",temp5_image); //Mat temp6_image = imread("temp6.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像6",temp6_image); //Mat temp7_image = imread("temp7.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像7",temp7_image); //Mat temp8_image = imread("temp8.png"); //namedWindow("テンプレート画像"); //imshow("テンプレート画像8",temp8_image); //-------テンプレートマッチングを取る----- Mat result; matchTemplate(src_image,temp_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像",result); //Mat result1; //matchTemplate(src_image,temp1_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像1",result1); //Mat result2; //matchTemplate(src_image,temp2_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像2",result2); //Mat result3; //matchTemplate(src_image,temp3_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像3",result3); //Mat result4; //matchTemplate(src_image,temp4_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像4",result4); //Mat result5; //matchTemplate(src_image,temp5_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像5",result5); //Mat result6; //matchTemplate(src_image,temp6_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像6",result6); //Mat result7; //matchTemplate(src_image,temp7_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像7",result7); //Mat result8; //matchTemplate(src_image,temp8_image,result,TM_CCORR_NORMED); //namedWindow("マッチング画像"); //imshow("マッチング画像8",result8); //-----------マッチング点を求める--------- Point maxPt; minMaxLoc(result,0,0,0,&maxPt); //------マッチングを表示する----- rectangle(src_image,maxPt,Point(maxPt.x + temp_image.cols,maxPt.y+temp_image.rows),Scalar(0,255,255),2,8,0); namedWindow("マッチング表示画像"); imshow("マッチング表示画像",src_image); waitKey(0); destroyAllWindows(); return 0; } } } コード

また、その改良版を作ってみました。
すると、R6010、Array Should be CvMat or IplImage
という警告がでました。
どの部分で重複しているのかわかりません。
R6010の解決方法を教えていただけたらと思います。

よろしくお願いします。

int

1{ 2 int key;//キー入力用の変数 3 CvCapture *capture;//カメラキャプチャ用の構造体 4 IplImage *frameImage;//キャプチャ画像用IplImage 5 char windowNameCapture[] = "Capture";//キャプチャした画像を表示するウィンドウの名前 6 7 IplImage * temp = NULL; 8 IplImage * dst = NULL; 9 IplImage * img = NULL; 10 IplImage * grey = NULL; 11 12 13 double max_inter1inkage=0; 14 double min_inter1inkage=0; 15 16 CvPoint max_point; 17 CvPoint min_point; 18 CvPoint corner_point; 19 20 int counter = 0; 21 char str[32]; 22 23 24 //カメラを初期化する 25 if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) 26 { 27 //カメラが見つからなかった場合 28 printf( "カメラが見つかりません\n" ); 29 return -1; 30 } 31 32 33 //Windowの生成 34 cvNamedWindow("Show", CV_WINDOW_AUTOSIZE); 35 36 //カメラ・デバイスから画像を取得 37 //frameImage=cvQueryFrame(capture); 38 39 //テンプレート・マッチングに用いる相関値データを格納する画像の領域確保 40 //グレー・スケール画像用に領域確保 41 grey=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 42 dst =cvCreateImage(cvSize(img->width-temp->width+1,img->height-temp->height+1),IPL_DEPTH_32F,1); 43 44 //メインループ 45 while ( 1 ) 46 { 47 //カメラからの入力画像1フレームをframeImageに格納する 48 frameImage = cvQueryFrame( capture ); 49 50 //画像を表示する 51 cvShowImage( windowNameCapture, frameImage ); 52 53 //'q'キーが入力されたらループを抜ける 54 key = cvWaitKey( 1 ); 55 56 if ( key == 'q' ) 57 { 58 break; 59 } 60 else if( key == 'c') 61 { 62 int64 start = cv::getTickCount();//所要時間計測 63 64 sprintf_s(str, "sign.bmp", counter++); 65 cvSaveImage(str, frameImage ); 66 67 68 //--------原画像を読み込む--------- 69 img=cvLoadImage("sign.png",0); 70 //namedWindow("原画像"); 71 //imshow("原画像", src_image); 72 73 //---------テンプレート画像を読み込む------- 74 temp=cvLoadImage("temp.png",0); 75 //temp=cvLoadImage("temp2.png",0); 76 //temp=cvLoadImage("temp3.png",0); 77 //temp=cvLoadImage("temp7.png",0); 78 //temp=cvLoadImage("temp8.png",0); 79 80 //グレー・スケールに変換して格納 81 cvCvtColor(img,grey,CV_BGR2GRAY); 82 83 //-------テンプレートマッチングを取る----- 84 grey=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 85 dst =cvCreateImage(cvSize(img->width-temp->width+1,img->height-temp->height+1),IPL_DEPTH_32F,1); 86 cvMatchTemplate(img,temp,dst,CV_TM_CCOEFF_NORMED); 87 88 //-----------マッチング点を求める--------- 89 cvMinMaxLoc(dst,&min_inter1inkage,&max_inter1inkage, 90 &min_point,&max_point,NULL); 91 92 //------マッチングを表示する----- 93 //相関値0.75以下ならばLostを表示して次に行く 94 95 if(max_inter1inkage>0.75) 96 { 97 //座標を見やすく代入(直接代入でもよい) 98 corner_point=cvPoint(max_point.x+temp->width, 99 max_point.y+temp->height); 100 101 //マッチング箇所を四角で描画 102 cvRectangle(img,max_point,corner_point,CV_RGB(255,0,0),2); 103 printf("Detection\n"); 104 } 105 106 else 107 { 108 printf("Lost\n"); 109 } 110 111 int64 end = cv::getTickCount(); 112 double elapsedMsec = ( end - start )*1000/cv::getTickFrequency(); 113 114 std::cout << elapsedMsec <<"ms" <<std::endl; 115 } 116 } 117 118 //メモリ開放 119 cvReleaseCapture(&capture); 120 cvDestroyWindow("windowNameCapture"); 121 return 0; 122 123} 124コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2016/06/23 12:31

やりたいことは判りますが、そのために何を調べて、どこがわからないかを明確にしたほうが、アドバイスする側も答えやすいと思います。
yamata

2016/06/24 03:04

ありがとうございます。 まずは、R6010の解決方法を教えていただけたらと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問