openCV中的cvReleaseImage出现错误

There is an error when it comes to cvReleaseImage from openCV

本文关键字:错误 cvReleaseImage 中的 openCV      更新时间:2023-10-16

我试图从通常称为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;
}

我发布了一个答案,因为我不能添加评论(声誉问题)。您必须先释放标头,然后释放图像数据。如果你用另一种方式,即释放图像数据,然后调用cvReleaseImageHeader()函数,那么它似乎有效。但在内部,它会泄漏内存,过一段时间你的应用程序就会崩溃。你也可以一步一步地调试,看看IplImage*C的值,看看它是否为null,这可能是它崩溃的原因。

Image标头和Imagedata是不同的东西。

cvCreateImage()相当于执行:

header = cvCreateImageHeader(size, depth, channels);
cvCreateData(header);

CCD_ 4可视为的快捷方式

if(*image )
{
    cvReleaseData(*image);
    cvReleaseImageHeader(image);
}

考虑到这一点,以下功能成对工作:

  • CCD_ 5的兄弟是CCD_
  • CCD_ 7的兄弟也是CCD_
  • 但只有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;
}
...