opencv在MFC下使用的问题
2012-12-04 17:28
369 查看
现在我碰到了左右为难的问题:
1.如果用静态库dll解决这个问题,那么在有vector作为输入参数调用opencv就会出现析构问题,因为已经跨栈了
运行到下面会卡住:
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
我代码里有做sift检测:
{
vector<KeyPoint> pt;
m_Detector.detect( (*it2)->pImage, pt );
}运行到这里析构pt的时候就会报错
2.如果用共享库ll,就是内存泄露的问题
Detected memory leaks!
Dumping objects ->
{1139} normal block at 0x01891A58, 512 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{1138} normal block at 0x01891A10, 8 bytes long.
Data: <, > 2C 10 89 01 00 00 00 00
{1137} normal block at 0x018919C8, 8 bytes long.
Data: < > 00 10 89 01 00 00 00 00
{1136} normal block at 0x01891980, 8 bytes long.
Data: < > E0 0F 89 01 00 00 00 00
{1135} normal block at 0x01891938, 8 bytes long.
Data: < > B0 0F 89 01 00 00 00 00
{1134} normal block at 0x018918F0, 8 bytes long.
Data: < > 90 0F 89 01 00 00 00 00
{1133} normal block at 0x01891860, 80 bytes long.
Data: <` ` ` > 60 18 89 01 60 18 89 01 60 18 89 01 CD CD CD CD
{1132} normal block at 0x01891818, 8 bytes long.
Data: <| > 7C 0F 89 01 00 00 00 00
{1131} normal block at 0x018917D0, 8 bytes long.
Data: <\ > 5C 0F 89 01 00 00 00 00
{1130} normal block at 0x01891788, 8 bytes long.
Data: <8 > 38 0F 89 01 00 00 00 00
{1129} normal block at 0x01891740, 8 bytes long.
Data: < > 18 0F 89 01 00 00 00 00
{1128} normal block at 0x018916F8, 8 bytes long.
Data: < > F0 0E 89 01 00 00 00 00
{1127} normal block at 0x018916B0, 8 bytes long.
Data: < > D0 0E 89 01 00 00 00 00
{1123} normal block at 0x01891590, 8 bytes long.
Data: < > 1C 0E 89 01 00 00 00 00
{1122} normal block at 0x01891548, 8 bytes long.
...
下面还有很多。
十分悲剧,对于这个问题,难道不能两全其美了么
经过在这里发帖自己思考后,解决了,原帖如下:
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=23564&p=68153#p68153
已解决该问题:
1.使用静态库
配置属性-》C++->代码生成->运行库 多线程调试 (/MTd)
2.这个不是opencv的问题,是调用dll的问题,dll中给vector分配成员空间,无论你是传引用,还是指针,只要vector的初始化容器大小,放不下成员,在dll中就会给vector增加空间,故解决方法如下:
vector<KeyPoint> pt(1000);
m_Detector.detect( (*it2)->pImage, pt );
预先在自己程序中分配好,1000只是个估值,根据实际大小最大值来设置
1.如果用静态库dll解决这个问题,那么在有vector作为输入参数调用opencv就会出现析构问题,因为已经跨栈了
运行到下面会卡住:
/*
* If this ASSERT fails, a bad pointer has been passed in. It may be
* totally bogus, or it may have been allocated from another heap.
* The pointer MUST come from the 'local' heap.
*/
_ASSERTE(_CrtIsValidHeapPointer(pUserData));
我代码里有做sift检测:
{
vector<KeyPoint> pt;
m_Detector.detect( (*it2)->pImage, pt );
}运行到这里析构pt的时候就会报错
2.如果用共享库ll,就是内存泄露的问题
Detected memory leaks!
Dumping objects ->
{1139} normal block at 0x01891A58, 512 bytes long.
Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
{1138} normal block at 0x01891A10, 8 bytes long.
Data: <, > 2C 10 89 01 00 00 00 00
{1137} normal block at 0x018919C8, 8 bytes long.
Data: < > 00 10 89 01 00 00 00 00
{1136} normal block at 0x01891980, 8 bytes long.
Data: < > E0 0F 89 01 00 00 00 00
{1135} normal block at 0x01891938, 8 bytes long.
Data: < > B0 0F 89 01 00 00 00 00
{1134} normal block at 0x018918F0, 8 bytes long.
Data: < > 90 0F 89 01 00 00 00 00
{1133} normal block at 0x01891860, 80 bytes long.
Data: <` ` ` > 60 18 89 01 60 18 89 01 60 18 89 01 CD CD CD CD
{1132} normal block at 0x01891818, 8 bytes long.
Data: <| > 7C 0F 89 01 00 00 00 00
{1131} normal block at 0x018917D0, 8 bytes long.
Data: <\ > 5C 0F 89 01 00 00 00 00
{1130} normal block at 0x01891788, 8 bytes long.
Data: <8 > 38 0F 89 01 00 00 00 00
{1129} normal block at 0x01891740, 8 bytes long.
Data: < > 18 0F 89 01 00 00 00 00
{1128} normal block at 0x018916F8, 8 bytes long.
Data: < > F0 0E 89 01 00 00 00 00
{1127} normal block at 0x018916B0, 8 bytes long.
Data: < > D0 0E 89 01 00 00 00 00
{1123} normal block at 0x01891590, 8 bytes long.
Data: < > 1C 0E 89 01 00 00 00 00
{1122} normal block at 0x01891548, 8 bytes long.
...
下面还有很多。
十分悲剧,对于这个问题,难道不能两全其美了么
经过在这里发帖自己思考后,解决了,原帖如下:
http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=23564&p=68153#p68153
已解决该问题:
1.使用静态库
配置属性-》C++->代码生成->运行库 多线程调试 (/MTd)
2.这个不是opencv的问题,是调用dll的问题,dll中给vector分配成员空间,无论你是传引用,还是指针,只要vector的初始化容器大小,放不下成员,在dll中就会给vector增加空间,故解决方法如下:
vector<KeyPoint> pt(1000);
m_Detector.detect( (*it2)->pImage, pt );
预先在自己程序中分配好,1000只是个估值,根据实际大小最大值来设置
相关文章推荐
- Opencv 2.4.6 +VS2010 MFC + StaticLib使用问题
- 在静态库下使用MFC和共享DLL下使用MFC 这两种情况 opencv的配置,以及配置opencv配置中容易出现的问题
- MFC和opencv一起使用时会莫名奇妙出现内存泄露问题
- opencv2.0在mfc中使用vector崩溃问题
- Opencv 2.4.6 +VS2010 MFC + StaticLib使用问题
- 《在MFC中使用OpenCV》例程编译问题解决方法
- 在静态库下使用MFC和共享DLL下使用MFC 这两种情况 opencv的配置,以及配置opencv配置中容易出现的问题
- VS2010中使用MFC控制隐藏WMP的问题
- MFC中InvalidateRect 、GetCursorPos、静态或全局变量使用、 error RC1121 四个问题
- 使用MFC CImage类绘制PNG图片时遇到的问题
- 使用OpenCv库的MFC程序在退出后报内存泄露 可能解决方法
- MFC使用CEF并实现js与C++交互功能,解决Render进程中OnContextCreated绑定与OnWebKitInitialized的js扩展无法回调问题
- VS2008下使用MFC,做托盘以及气泡提示,shellapi.h的问题。。
- 使用opencv_traincascade训练遇到的问题总汇
- 使用openCV对JPEG图像内存进行解码及时间过长问题;
- vlc 嵌入到 MFC 使用步骤以及相关问题解决方法
- 在使用MFC双向链表模板类CList中Find问题
- 记WIN32使用duilib时添加MFC类库发现内存泄露的问题解决
- Opencv中使用ocl模块遇到的问题
- MFC中CRectTracker在CScrollView中使用时问题的解决办法