我试图从Image(通常称为OCR)获取数字。
但是当我使用cvMatchTemplate()
时,出现错误(vshost32.exe操作已停止。)
我花了大约2个小时的时间才能找到原因。幸运的是,我发现此错误来自cvReleaseImage()
。
由于我的英语水平较低,因此我无法在互联网上理解与此问题相关的问题。
所以我需要你的帮助。谢谢。
下面是我的代码。我使用类似于C++ dll的OpenCV。
extern "C" __declspec(dllexport) int opencv_UV()
{
double min, max;
double _max;
int index[4];
CvPoint left_top;
IplImage *B[10];
IplImage *C;
B[0]=cvLoadImage("Reference_UV\\0.bmp", -1);
B[1]=cvLoadImage("Reference_UV\\1.bmp", -1);
B[2]=cvLoadImage("Reference_UV\\2.bmp", -1);
B[3]=cvLoadImage("Reference_UV\\3.bmp", -1);
B[4]=cvLoadImage("Reference_UV\\4.bmp", -1);
B[5]=cvLoadImage("Reference_UV\\5.bmp", -1);
B[6]=cvLoadImage("Reference_UV\\6.bmp", -1);
B[7]=cvLoadImage("Reference_UV\\7.bmp", -1);
B[8]=cvLoadImage("Reference_UV\\8.bmp", -1);
B[9]=cvLoadImage("Reference_UV\\9.bmp", -1);
for(int i=0; i<4; i++)
{
char name[20];
strcpy(name,"../Debug");
char a[1];
itoa(i,a,1);
strcat(name, a);
strcat(name, ".bmp");
IplImage *A = cvLoadImage(name, -1);
for(int j=0; j<10; j++)
{
C = cvCreateImage( cvSize( A->width - B[j]->width+1, A->height - B[j]->height+1 ), IPL_DEPTH_32F, 1 );
cvMatchTemplate(A, B[j], C, CV_TM_CCOEFF_NORMED);
cvMinMaxLoc(C, &min, &max, NULL, &left_top);
if(_max<max)
{
_max=max;
index[i]=j;
}
cvReleaseImage(&C); // I checked there was no error until this point.
}
cvReleaseImage(&A);
}
for(int k=0; k<10; k++)
{
cvReleaseImageHeader(&B[k]);
}
int result=index[0]*1000 + index[1]*100 + index[2]*10 + index[3];
return result;
}
最佳答案
图片 header 和图片数据是不同的东西。
cvCreateImage()
is equivalent to执行:
header = cvCreateImageHeader(size, depth, channels);
cvCreateData(header);
和
cvReleaseImage()
can be seen as快捷方式:if(*image )
{
cvReleaseData(*image);
cvReleaseImageHeader(image);
}
考虑到这一点,以下功能可以成对使用:
cvLoadImage()
兄弟是cvReleaseImage()
; cvCreateImage()
兄弟也是cvReleaseImage()
; cvCreateImageHeader()
是cvReleaseImageHeader()
的兄弟; 调整您的代码以遵守这些规则。
另一件事:
cvLoadImage()
可能会失败!这意味着最好对进行防御代码并测试此函数的返回值:B[0]=cvLoadImage("Reference_UV\\0.bmp", -1);
if (B[0] == NULL) {
// Most probably, the file doesn't exist. Deal with error and
return;
}
B[1]=cvLoadImage("Reference_UV\\1.bmp", -1);
if (B[1] == NULL) {
// Most probably, the file doesn't exist. Deal with error and
return;
}
...
关于c++ - 来自openCV的cvReleaseImage出现错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25912615/