openCV中的cvReleaseImage出现错误
There is an error when it comes to cvReleaseImage from openCV
我试图从通常称为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;
}
...
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'