gpt4 book ai didi

c - 使用摄像机源中的 ROI 作为 cvMatchTemplate 的模板

转载 作者:行者123 更新时间:2023-11-30 17:45:54 25 4
gpt4 key购买 nike

这是我重写之前成功编写的代码。

它应该使用来自网络摄像头的 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 新手,真的不知道如何处理此错误消息。有人知道该怎么做吗?非常感谢您的帮助!干杯,

最佳答案

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

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

您的代码包含内存泄漏,这可能会导致程序崩溃,例如ftmp 的所有 6 个图像都会在每次迭代中分配,但不会在任何地方释放。要么在迭代结束时释放图像,要么在 while 循环之前仅创建一次图像。

此外,OpenCV 文档明确指出不要修改 cvQueryFrame 返回的帧。因此您可以考虑删除cvReleaseImage(&frame);。检查this answer了解详情。

关于c - 使用摄像机源中的 ROI 作为 cvMatchTemplate 的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19503239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com