opencvでテンプレートマッチングを行っていると、画像のエラーが出ます。
以下のプログラムになるのですが、エラーの箇所を調べていると、
プログラム内の
cvMatchTemplate(copy_img1,temp_up,dst1,CV_TM_CCOEFF_NORMED); //テンプレートマッチング cvMatchTemplate(copy_img2,temp_side,dst2,CV_TM_CCOEFF_NORMED); //テンプレートマッチング
の部分でエラーが出ることが分かりました。
この部分では、テンプレートマッチングを行っているだけなので、
その上の部分の
dst1=cvCreateImage(cvSize(abs(rect3.width-temp_up->width)+1,abs(rect3.height-temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保 dst2=cvCreateImage(cvSize(abs(rect4.width-temp_side->width)+1,abs(rect4.height-temp_side->height)+1),IPL_DEPTH_32F,1); //領域確保
の定義が正しくないのかなと考えます。
しかし、解決方法がわからないのでよろしくお願い致します。
変更しました。
先ほどのプログラムが正常に動作したため、以下のプログラムに変更しました。すると、
img.depth()==CV_8U||img.depth()==CV_32F) && img.type()==templ.type())
というエラーが出ます。
順番に確かめていったところ
scale_img=cvCreateImage(cvSize((int)(img->widthSCALE_X), (int)(img->heightSCALE_Y)), IPL_DEPTH_8U, 3);
以上の部分がおかしいと考えています。
1チャンネルで定義すると、scale_imgを表示しようとするとエラーが出ます。しかし、3チャンネルに変更すると、画像を表示できても、最終的にエラーが出ます。
どのような変更が必要なのでしょうか?
//---------テンプレート画像を読み込む------- temp_up=cvLoadImage("C:\\opencv_ICImage\\2017-1-12\\銀小ネジ\\ver2\\背景差分\\temp_up.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み temp_side=cvLoadImage("C:\\opencv_ICImage\\2017-1-12\\銀小ネジ\\ver2\\背景差分\\temp_side.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み for ( int number =1; number<717;++number) { int64 start = cv::getTickCount();//所要時間計測 //------------------------原画像読み込み------------------------------- std::stringstream filename; filename << "C:\\opencv_ICImage\\2017-1-12\\銀小ネジ\\ver2\\背景差分\\静止画\\sabun" << std::setfill('0') << std::setw(4) << number << ".bmp"; std::cout << "filename=" << filename.str() << std::endl; IplImage* img=cvLoadImage(filename.str().c_str()); //-------------------------------------------------------------------------- //変換画像用IplImage scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3); //変換 cvResize(img, scale_img, CV_INTER_LINEAR); //原画像コピー copy_img1=cvCloneImage(scale_img); copy_img2=cvCloneImage(scale_img); //赤枠で囲む cvRectangle(scale_img,cvPoint(112,68),cvPoint(151,128),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT); cvRectangle(scale_img,cvPoint(218,70),cvPoint(258,125),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);//左上、右下 //-----------------ROIの設定---------------------- CvRect rect1; rect1.x = 112; rect1.y = 68; rect1.width = 39; rect1.height = 60; cvSetImageROI(copy_img1,rect1); CvRect rect2; rect2.x = 218; rect2.y = 70; rect2.width = 40; rect2.height = 55; cvSetImageROI(copy_img2,rect2);//左上、幅、高さ //---------------------------------------------------- dst1=cvCreateImage(cvSize(abs(rect1.width-temp_up->width)+1,abs(rect1.height-temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保 dst2=cvCreateImage(cvSize(abs(rect2.width-temp_side->width)+1,abs(rect2.height-temp_side->height)+1),IPL_DEPTH_32F,1); //領域確保 cvMatchTemplate(copy_img1,temp_up,dst1,CV_TM_CCOEFF_NORMED); //テンプレートマッチング cvMatchTemplate(copy_img2,temp_side,dst2,CV_TM_CCOEFF_NORMED); //テンプレートマッチング cvNamedWindow("result",CV_WINDOW_AUTOSIZE); cvShowImage("result",dst2); printf("%d,%d\n",abs(rect2.width-temp_side->width)+1,abs(rect2.height-temp_side->height)+1); //printf("%d,%d\n",img->width,img->height); cvWaitKey(0);
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/24 12:10
2017/01/24 12:43
2017/01/24 12:49 編集
2017/01/25 02:05
2017/01/25 02:14
2017/01/25 02:49
2017/01/25 02:51
2017/01/25 03:04
2017/01/25 03:12 編集
2017/01/25 03:15
2017/01/25 03:17
2017/01/25 03:30
2017/01/25 03:51