Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用摄影机提要中的ROI作为cvMatchTemplate的模板_C_Opencv - Fatal编程技术网

使用摄影机提要中的ROI作为cvMatchTemplate的模板

使用摄影机提要中的ROI作为cvMatchTemplate的模板,c,opencv,C,Opencv,这是我重写的代码,也是我以前成功编写的代码 它假设使用一个网络摄像头的roi,并将其与cvMatchTemplate与其他网络摄像头框架相匹配……我按照指南取出轨迹栏和窗口以保持其简短,但在最初的版本中,您可以移动轨迹栏,在左上角窗口和左下角窗口中选择框架的一部分,您可以看到您的模板 下面是一张它看起来像什么的图片: 这是我得到的错误 我尝试将src的深度更改为32F,但没有成功…请阅读templmatch.cpp 第384行mssg给了我错误,但没有帮助 OpenCV Error: Ass

这是我重写的代码,也是我以前成功编写的代码

它假设使用一个网络摄像头的roi,并将其与cvMatchTemplate与其他网络摄像头框架相匹配……我按照指南取出轨迹栏和窗口以保持其简短,但在最初的版本中,您可以移动轨迹栏,在左上角窗口和左下角窗口中选择框架的一部分,您可以看到您的模板 下面是一张它看起来像什么的图片:

这是我得到的错误 我尝试将src的深度更改为32F,但没有成功…请阅读templmatch.cpp 第384行mssg给了我错误,但没有帮助

 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;
 }
#包括
#包括
使用名称空间std;
int main(){
CvCapture*capture=0;
捕获=cvCaptureFromCAM(0);
如果(!捕获){
printf(“捕获失败\n”);
返回-1;
}
IplImage*frame=0;
双倍宽度=640.0;
双倍高度=480.0;
cvSetCaptureProperty(捕获,CV_CAP_PROP_FRAME_WIDTH,WIDTH);
cvSetCaptureProperty(捕捉、CV_CAP_PROP_FRAME_高度、高度);
while(true){
帧=cvQueryFrame(捕获);
如果(!帧)中断;
frame=cvCloneImage(frame);
IplImage*src,*templ,*ftmp[6];//ftmp将保存结果
int i;
CvRect-roi;
int rectx=0;
int-recty=0;
int rectwidth=frame->width/10;
int rectheight=帧->高度/10;
IplImage*img=cvCreateImage(cvGetSize(帧),IPL_DEPTH_8U,3);
//读入要搜索的源图像
src=cvCreateImage(cvGetSize(帧),IPL_深度_8U,3);
roi=cvRect(rectx、recty、rectwidth、rectheight);
img=cvCreateImage(cvGetSize(帧),IPL_深度_8U,3);
src=cvCreateImage(cvGetSize(帧),IPL_深度_8U,3);
cvCopy(帧,img);
cvSetImageROI(帧,roi);
cvShowImage(“b”,img);
cvReleaseImage(&img);
//分配输出图像:
intiWidth=src->width-frame->width+1;
intiheight=src->height-frame->height+1;
对于(i=0;i<6;++i){
ftmp[i]=cvCreateImage(cvSize(iwidth,iheight),32,1);
}
//将模板与图像进行匹配
对于(i=0;i<6;++i){
cvMatchTemplate(src,frame,ftmp[i],i);
cvNormalize(ftmp[i],ftmp[i],1,0,CV_MINMAX);
}       
//展示
cvReleaseImage(&src);
cvResetImageROI(帧);
cvReleaseImage(&frame);
//等待50毫秒
int c=cvWaitKey(10);
//如果按下“ESC”,则断开循环
如果((char)c==27)中断;
}
cvallwindows();
cvReleaseCapture(&capture);
返回0;
}

我是OpenCV新手,真的不知道如何处理这个错误消息。有人知道该怎么办吗?非常感谢你的帮助!干杯,

当您在图像的选定ROI上执行模板匹配时,您必须根据ROI的大小创建输出图像

// Allocate Output Images:
int iwidth = src->width - rectwidth + 1;
int iheight = src->height - rectheight + 1;
您的代码包含内存泄漏,这可能会使程序崩溃,例如,
ftmp
的所有6个图像都在每次迭代中分配,但不会在任何地方发布。要么在迭代结束时释放图像,要么在循环之前只创建一次


此外,OpenCV文档明确声明不要修改
cvQueryFrame
返回的帧。因此,您可以考虑删除<代码> CVRelaseIMAGE(和框架);<代码>。查看详细信息。

你能试着不要使用不推荐的c-api吗?@需要将c-its用于需要它的项目……你能帮我解决这个错误吗?如果一个傻瓜那样自食其果,任何项目都不会从中获益。你能给出具体的理由,为什么你需要那些不推荐的东西吗?