我试图从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/

    10-11 21:05