opencvを用いて、カメラで写真を撮影しその写真に対してテンプレートマッチングを
行うプログラムを作りました。
実行してみると、R6010のエラーがでました。
解決方法を教えていただきたいと思います。
動作環境はVC++2010Express、opencv2.4.9です。
以下にプログラムをのせます。よろしくお願いします。(include部分は省略。)
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コード
回答1件
あなたの回答
tips
プレビュー