Author Topic: opencv gpu和cinder一起使用的bug?  (Read 6902 times)

o2co2

  • Newbie
  • *
  • Posts: 12
opencv gpu和cinder一起使用的bug?
« on: November 17, 2013, 12:51:40 PM »
使用cmake重新编译opencv gpu模块,和cinder一起使用时,debug下编译cv :: findContours函数会报断言错误,
错误如下:
--------------------
Debug Assertion Failed!

Program: ... \ cinder_0.8.5_vc2012 \ app \ ocvCapture \ vc11 \ Debug \ ocvCapture.exe
File: f: \ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c
Line: 1322

Expression: _CrtIsValidHeapPointer (pUserData)

For information on how your program can cause an assertion
failure, see the Visual C + + documentation on asserts.
--------------------
在网上我查过,应该是和cindr的项目设置有冲突,因为opencv编译时动态库 md/mdd 的形式编译的,而cinder的编译运行库的参数确是 mt/mtd ,所以应该是由此导致的问题,
我也尝试opencv使用mt/mtd编译,但是总是出现错误无法编译成功。
还请大家能否有好的解决方法或者经验,先谢谢了!

vinjn

  • Moderator 版主
  • Hero Member
  • *****
  • Posts: 587
Re: opencv gpu和cinder一起使用的bug?
« Reply #1 on: November 17, 2013, 06:23:26 PM »
几个问题

1. 非 gpu 的 opencv 库的会出错不?
2. release 模式会出错不?
3. opencv使用mt/mtd的时候编译是什么错误?

o2co2

  • Newbie
  • *
  • Posts: 12
Re: opencv gpu和cinder一起使用的bug?
« Reply #2 on: November 17, 2013, 09:39:56 PM »
几个问题

1. 非 gpu 的 opencv 库的会出错不?
2. release 模式会出错不?
3. opencv使用mt/mtd的时候编译是什么错误?

1.非gpu opencv 不会出错。
2.release模式 不会出错。
3.编译不成功 具体忘了 要重新编译才能告诉你。

vinjn

  • Moderator 版主
  • Hero Member
  • *****
  • Posts: 587
Re: opencv gpu和cinder一起使用的bug?
« Reply #3 on: November 18, 2013, 08:58:02 AM »
debug / release 的库没有混用吧,这是很常见的错误

o2co2

  • Newbie
  • *
  • Posts: 12
Re: opencv gpu和cinder一起使用的bug?
« Reply #4 on: November 18, 2013, 11:57:21 AM »
debug / release 的库没有混用吧,这是很常见的错误
没有混用,用opencv2.4.4 官方编译的gpu库测试 还是一样会有这个错误,我是在win8 x64系统下用vs2012

o2co2

  • Newbie
  • *
  • Posts: 12
Re: opencv gpu和cinder一起使用的bug?
« Reply #5 on: November 18, 2013, 12:13:04 PM »
debug / release 的库没有混用吧,这是很常见的错误
没有混用,用opencv2.4.4 官方编译的gpu库测试 还是一样会有这个错误,我是在win8 x64系统下用vs2012

vinjn

  • Moderator 版主
  • Hero Member
  • *****
  • Posts: 587
Re: opencv gpu和cinder一起使用的bug?
« Reply #6 on: November 18, 2013, 12:43:45 PM »

o2co2

  • Newbie
  • *
  • Posts: 12
Re: opencv gpu和cinder一起使用的bug?
« Reply #7 on: November 18, 2013, 01:46:44 PM »
试试这个回答

http://code.opencv.org/issues/1751#note-4

(MSDN)中的这段话

The   _CrtIsValidHeapPointer   function   is   used   to   ensure   that   a   specific   memory   address   is   within   the   local   heap.   The   “local”   heap   refers   to   the   heap   created   and   managed   by   a   particular   instance   of   the   C   run-time   library.   If   a   dynamically   linked   library   (DLL)   contains   a   static   link   to   the   run-time   library,   then   it   has   its   own   instance   of   the   run-time   heap,   and   therefore   its   own   heap,   independent   of   the   application’s   local   heap.   When   _DEBUG   is   not   defined,   calls   to   _CrtIsValidHeapPointer   are   removed   during   preprocessing.

看了这段话稍微觉得有点意思了,我在程序中自己申请了本地堆,也有要生成动态连接库的DIB类,要连接c运行库,那么我的ColHistogram的实例必须动态生成,因为它在c运行库中没有对应的堆。比如我添加Cstring str;程序就不会有问题,但是我只知道CString是系统定义的,和c运行库有什么关系我就不清楚了。如果静态链接C运行库,那么,dll就要拥有一个独立于应用程序(调用它的exe)的本地堆(但是我的程序没有),如果没有定义_DEBUG,那么_CrtIsValidHeapPointer将被预处理器移除。大概就是这个样子,上面所说的很多东西我都不确定,只是现在的一种解释。


//////////////////////////我的代码//////////////////////////////
std::vector< std::vector<cv::Point> > contoursVec_temp;
cv::findContours(gray, contoursVec_temp, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );
//////////////////////////////////////////////////////////////////

问题在contoursVec_temp会被findContours函数内部释放,但这是不许的,所以出错了吗?
怎么动态分配 contoursVec_temp呢?
请指教!

vinjn

  • Moderator 版主
  • Hero Member
  • *****
  • Posts: 587
Re: opencv gpu和cinder一起使用的bug?
« Reply #8 on: November 18, 2013, 02:02:46 PM »
For me the trick was to declare the hit vector static and call vector's clear() function after using the hits (faces / eyes). This removed the heap corruption problem fired by _CrtIsValidHeapPointer(pUserData)

o2co2

  • Newbie
  • *
  • Posts: 12
Re: opencv gpu和cinder一起使用的bug?
« Reply #9 on: November 19, 2013, 12:29:24 AM »
For me the trick was to declare the hit vector static and call vector's clear() function after using the hits (faces / eyes). This removed the heap corruption problem fired by _CrtIsValidHeapPointer(pUserData)

改为静态变量通过了编译,非常感谢!

Tags: opencv cinder