WIN7下 vs2010 调用findChessboardCorners 和 findCirclesGrid异常,请各位帮组

yilanzhongshanxiao 2017-04-06 10:20:04
加精
WIN7系统下,使用VS2010 MFC 开发工具 用的是Opencv249的库
我用的棋盘尺寸或点阵 为12 * 10

cv::Size szBoard(12, 10) ;
cv::vector<Point2f> centers;

使用Opencv249 release 版库时

调用findChessboardCorners( SrcImg , szBoard , centers )
和findCirclesGrid(SrcImg, szBoard , centers , CALIB_CB_SYMMETRIC_GRID)时,返回值为true ,
但 centers.size() 值很大 或者是 负值 , 通常 为 -8635847左右

整个函数执行完成时,程序就奔溃了。

使用Opencv249 debug 版库时
findChessboardCorners 和 findCirclesGrid 能返回true, centers.size() 返回数目也对
但 整个函数执行完成时,程序就奔溃了。

调试跟踪 异常位置:
对于 : findCirclesGrid(SrcImg, szBoard , centers , CALIB_CB_SYMMETRIC_GRID) ;
有0x77162e34 处有未经处理的异常: 0xC0000005: 写入位置 0x91ed0f50 时发生访问冲突

template<typename _Tp> inline Ptr<_Tp>::~Ptr() { release(); }
>>
template<typename _Tp> inline void Ptr<_Tp>::release()
{
if( refcount && CV_XADD(refcount, -1) == 1 )
{
delete_obj();
fastFree(refcount);
}
refcount = 0;
obj = 0;
}
>>>
template<typename _Tp> inline void Ptr<_Tp>::delete_obj()
{
if( obj ) delete obj; // 出现在此处
}


很大可能是:vector<Point2f> centers 中的内存分配和再使用有问题。
猜测:很可能是 VS2010环境配置 与 opencv中代码有冲突。
或者说opencv本身这两个函数有bug,如果有人碰到同样问题请给点帮助
但我无从下手,请各位帮助!!!!!!!!!!!!!!!!!!!! 不胜感激
本人使用opencv经验不足,请各位 大神不吝指教!!!!!!!!!!!!!

本人愿意出100RMB,给出帮助费!
...全文
3136 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
三岁、就很帅 2017-05-15
  • 打赏
  • 举报
回复
OpenCV使用c++时,它会发生运行时错误问题当喂食一些容器(如:向量)OpenCV内置函数。所以最好使用垫数据类型来保存输出接收到opencv内置函数,然后再转移到任何你需要的数据类型。
赵4老师 2017-05-10
  • 打赏
  • 举报
回复
这恐怕是表面蒙灰尘泥土最厚的一块真金白银了。 我用这块真金白银在CSDN论坛混了多少分恐怕都超short int max了!
nettman 2017-05-10
  • 打赏
  • 举报
回复
hugh_z 2017-05-04
  • 打赏
  • 举报
回复
666666666666666
nettman 2017-05-04
  • 打赏
  • 举报
回复
shiter 2017-05-04
  • 打赏
  • 举报
回复
真金白银,特此推荐
ljheee 2017-05-04
  • 打赏
  • 举报
回复
真金白银
赵4老师 2017-04-06
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
三岁、就很帅 2017-04-06
  • 打赏
  • 举报
回复
pHead- 看看这个是不是空啊什么的
三岁、就很帅 2017-04-06
  • 打赏
  • 举报
回复
这方法就是帮你找到调试过程中出问题的地方所在,加个断点到那里 单步执行 看看指针啊什么的信息
yilanzhongshanxiao 2017-04-06
  • 打赏
  • 举报
回复
非常谢谢:

调用堆栈如下:
msvcr100d.dll!operator delete(void * pUserData) 行 52 + 0x51 字节 C++
opencv_features2d249d.dll!cv::SimpleBlobDetector::`vector deleting destructor'() + 0x6e 字节 C++
LearnVision.exe!cv::Ptr<cv::FeatureDetector>::delete_obj() 行 2614 + 0x5c 字节 C++
LearnVision.exe!cv::Ptr<cv::FeatureDetector>::release() 行 2606 C++
LearnVision.exe!cv::Ptr<cv::FeatureDetector>::~Ptr<cv::FeatureDetector>() 行 2617 + 0x2b 字节 C++
LearnVision.exe!CLearnVision::CalibrateUseOpenCvWithDotGrid(int xNum, int yNum, double xPitch, double yPitch) 行 16948 + 0x19 字节 C++

最后代码函数
void operator delete(
void *pUserData
)
{
_CrtMemBlockHeader * pHead;

RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));

if (pUserData == NULL)
return;

_mlock(_HEAP_LOCK); /* block other threads */
__TRY

/* get a pointer to memory block header */
pHead = pHdr(pUserData);

/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); //最后位置

_free_dbg( pUserData, pHead->nBlockUse );

__FINALLY
_munlock(_HEAP_LOCK); /* release other threads */
__END_TRY_FINALLY

return;
}

此处 opencv_features2d249d.dll!cv::SimpleBlobDetector::`vector deleting destructor'() 只能显示汇编代码
功力有限,汇编代码 可看不懂
大概问题能猜测,基本就是析构 cv::vector<Point2f> centers; 时出错

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧