问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mfc中使用opencv显示图片并释放内存

发布网友 发布时间:2022-04-25 01:16

我来回答

1个回答

热心网友 时间:2023-10-19 04:24

前一天把系统整个重写了一遍,脉络清晰了很多,也终于解决了以前很多崩溃,异常退出的问题。这里小小总结一下自己遇到的麻烦。

1、内存泄露
内存泄露是说没有释放已经不能使用的内存,这里一般指堆的内存才需要显示的释放。比如用malloc,calloc,realloc,new分配的内存是在堆上的,需要用free,delete显示的回收。内存泄露最明显的一是程序很慢,在运行程序时你可以启动任务管理器,会看到程序占用的内存一直“砰砰砰”的往上涨:

最后直接崩溃,或者你关闭程序的时候也会异常退出,出现

Debug Assertion Failed!
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

之类的问题。

除了new的对象我们知道要delete。OpenCV中使用cvCreateImage()新建一个IplImage*,以及使用cvCreateMat()新建一个CvMat*,都需要cvReleaseImage() cvReleaseMat()显示的释放

[cpp] view plaincopyprint?IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->height)*scale), 8, 3 );
CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);

IplImage* subImg=cvCreateImage( cvSize((img->width)*scale,(img->height)*scale), 8, 3 );
CvMat *tempMat=cvCreateMat((img->width)*scale,(maxFace->height)*scale,CV_MAKETYPE(image->depth,image->nChannels));
cvReleaseImage(&subImg);
cvReleaseMat(&tempMat);另外一些函数要用到 CvSeq*来存放结果(通常这些都要用cvCreateMemStorage()事先分配一块内存CvMemStorage*),都要是释放掉相应的内存,这是很难找的。

比如从二值图像中寻找轮廓的函数cvFindContours():

[cpp] view plaincopyprint?CvMemStorage* m_storage=cvCreateMemStorage(0);
CvSeq * m_contour=0;
cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//释放内存
cvReleaseMemStorage(&m_storage);

CvMemStorage* m_storage=cvCreateMemStorage(0);
CvSeq * m_contour=0;
cvFindContours( img, m_storage, &m_contour, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
//释放内存
cvReleaseMemStorage(&m_storage);
以及人脸识别中检测人脸的函数:

[cpp] view plaincopyprint?CvMemStorage* m_storage=cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2, 0,cvSize(30, 30) );
//释放内存
cvReleaseMemStorage( &faces->storage);
cvReleaseHaarClassifierCascade( &cascade );

CvMemStorage* m_storage=cvCreateMemStorage(0);
CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
CvSeq* faces = cvHaarDetectObjects( img, cascade, m_storage,1.1, 2, 0,cvSize(30, 30) );
//释放内存
cvReleaseMemStorage( &faces->storage);
cvReleaseHaarClassifierCascade( &cascade );
注意这里我们可以使用
cvReleaseMemStorage( &faces->storage);
来释放m_storate,也可以使用:
cvReleaseMemStorage(&m_storage);
释放内存,这是等效的,但一定不要用两次!!

2、一块内存多次释放
对应没有释放内存,对应就是一个内存释放多次,如同上面的 cvReleaseMemStorage用了两次。可能报错的地方:

[cpp] view plaincopyprint?__declspec(noinline)
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_mmy so that the function is not folded in retail */
(_Reserved);
_debugger_hook_mmy = 0;
}

__declspec(noinline)
void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved)
{
/* assign 0 to _debugger_hook_mmy so that the function is not folded in retail */
(_Reserved);
_debugger_hook_mmy = 0;
}或者: Unhandled exception at XXXXXXXXXX in XXX.exe: XXXXXXXXXXX: 堆已损坏。

除了上述的MemStorge问题,使用cvQueryFrame()取出CvCapture*每帧图像,只需在最后释放CvCapture*,不需要释放IplImage*

[cpp] view plaincopyprint?CvCapture* pCapture = cvCreateCameraCapture(-1);
IplImage* pFrame=cvQueryFrame( pCapture );
cvReleaseCapture(&pCapture);

CvCapture* pCapture = cvCreateCameraCapture(-1);
IplImage* pFrame=cvQueryFrame( pCapture );
cvReleaseCapture(&pCapture);
*这篇是以前写的,其实还是建议大家用C++接口的OpenCV,内存问题很少了~追问

谢了兄弟,还有一个问题我把wingdi。h包含进来,编译结果大量报错

是什么情况?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
国家对腾讯已经作出解除音乐版权处罚,为什么网易云还是很 市场监管总局依法对腾讯控股有限公司作出责令解除网络音乐 腾讯放弃音乐独家版权,绝大部分独家协议已按期解约 高级BEC和中级口译哪个难? 三级口译是什么样的水平 高级日语口译大概是什么水平 高级口译常用谚语 品牌型号怎么填写 送刀剑是什么风水 送礼送菜刀是什么意思 python opencv 显示图片 未响应 OpenCV测试案例运行时不显示图片,只显示窗口? 我告诉你什么是豆腐猫砂 Python显示图片cv2.waitKey(0)报错问题 海带有几种吃法 海带的吃法有多少 海带吃法 国家秘密密级分为哪三类 国家秘密通常分为哪四类? 我国的国家秘密的密级分为哪三个等级 国家秘密的密级是如何划分的? 大象成语有哪些 大象有哪些知识 有哪些关于大象的趣事? 神奇的大象想象作文大全 关于大象的成语大全 为人类工作的大象有哪些? 大象有多少,名字大全 有关大象的资料 大象的特点和外形描述有哪些? 大家有用过百氏派的豆腐猫砂吗?觉得怎么样? opencv怎么指定显示图 纸屑猫砂和豆腐猫砂有什么优缺点? opencv读取图片显示不出来 OpenCV中的cvShowImage()如何将图片显示在制定的控件中。 opencv显示图像要把图像放在哪里 倔强的尾巴豆腐猫砂怎么样,好用吗? opencv测试不显示图片 python 怎样将opencv处理的图像显示在label标签上 在opencv中,如何将二维数组转化为一副图像进行显示? ...stdio中配置opencv之后输入程序(读取并显示图片)为什么我读入大尺寸... 怎样在MFC中使用opencv进行图像显示 品牌代理分销一件代发是公司基本经营模式 货捕头怎么一件代发 一件代发操作流程是怎样的? 求品牌货源一件代发 一件代发到底怎么发? 哪里有阿迪达斯、耐克之类的运动鞋一件代发? 淘宝一件代发操作流程是怎么样的 公众号怎样设置“被关注后就自动推送一篇文章给用户”,另外想问下推送消息里怎样添加超链接?