0

これは私が以前にうまく書いたものを書き直したコードです。

ウェブカメラから aa roi を使用し、他のウェブカメラ フレームに対して cvMatchTemplate と一致させることを想定しています...ガイドラインに従って短くするためにトラックバーとウィンドウを取り出しましたが、オリジナルではトラックバーを移動してフレームのセクションを選択できました左上のウィンドウと左下のウィンドウにテンプレートが表示されました。これは、その外観の写真です。

http://i983.photobucket.com/albums/ae313/edmoney777/Screenshotfrom2013-10-21112021_zpsae11e3f0.png

これがエラーです。srcの深さを32Fに変更しようとしましたが、うまくいきませんでした... templmatch.cppの384行目を読んでください。

 OpenCV Error: Assertion failed (result.size() == cv::Size(std::abs
 (img.cols - templ.cols) + 1, std::abs(img.rows - templ.rows) + 1) 
 && result.type() == CV_32F) in cvMatchTemplat

私はopencvが初めてで、以下のコードのデバッグに少し役立つかもしれません

 #include <cv.h>
 #include <highgui.h>
 using namespace std;


 int main(){
   CvCapture* capture =0;       

   capture = cvCaptureFromCAM(0);
   if(!capture){
     printf("Capture failure\n");
     return -1;
   }

   IplImage* frame=0;
   double width=640.0;
   double height=480.0;
   cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, width);
   cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, height);

       while(true){

     frame = cvQueryFrame(capture);           
     if(!frame) break;

     frame=cvCloneImage(frame); 
     IplImage *src, *templ, *ftmp[6]; // ftmp will hold results
     int i;
     CvRect roi;
     int rectx = 0;
     int recty = 0;
     int rectwidth = frame->width /10;
     int rectheight = frame->height /10;
     IplImage* img = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);

     // Read in the source image to be searched
     src = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);

     roi=cvRect(rectx, recty, rectwidth, rectheight);

     img = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
     src = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 3);
     cvCopy(frame, img);
     cvSetImageROI(frame, roi);

     cvShowImage( "b", img );
     cvReleaseImage(&img);
      // Allocate Output Images:
     int iwidth = src->width - frame->width + 1;
     int iheight = src->height - frame->height + 1;

     for(i = 0; i < 6; ++i){
       ftmp[i]= cvCreateImage( cvSize( iwidth, iheight ), 32, 1 );
     }

     // Do the matching of the template with the image
     for( i = 0; i < 6; ++i ){
       cvMatchTemplate( src, frame, ftmp[i], i );
       cvNormalize( ftmp[i], ftmp[i], 1, 0, CV_MINMAX );
     }       
     // DISPLAY

     cvReleaseImage(&src);                 
     cvResetImageROI(frame);
     cvReleaseImage(&frame);


     //Wait 50mS
     int c = cvWaitKey(10);
     //If 'ESC' is pressed, break the loop
     if((char)c==27 ) break;      
   }

   cvDestroyAllWindows() ;
   cvReleaseCapture(&capture);     

   return 0;
 }

私は OpenCV を初めて使用するので、このエラー メッセージをどう処理すればよいかわかりません。何をすべきかアイデア/ポインターは誰ですか? あなたの助けは非常に高く評価されています! 乾杯、

4

1 に答える 1

0

画像の選択した ROI に対してテンプレート マッチングを実行しているため、ROI のサイズに応じて出力画像を作成する必要があります。

// Allocate Output Images:
int iwidth = src->width - rectwidth + 1;
int iheight = src->height - rectheight + 1;

コードにメモリ リークが含まれているため、プログラムがクラッシュする可能性があります。たとえば、6 つのイメージすべてftmpが各反復で割り当てられますが、どこにも解放されません。反復の最後にイメージを解放するか、whileループの前に一度だけ作成します。

また、OpenCV のドキュメントには、 によって返されるフレームを変更しないことが明示的に記載されていcvQueryFrameます。したがって、削除を検討してcvReleaseImage(&frame);ください。詳細については、この回答を確認してください。

于 2013-10-22T06:30:38.167 に答える