opencv在Linux上运行出现段错误 由Mat::~Mat() 问题引起

Chasing_Chasing 2018-05-08 10:15:42
这几天遇到一个问题,感觉有点棘手,关于opencv在Linux下编译运行而出现的bug,我在vs2017编译运行不会出现这种bug,但在Linux下运行出现了,舍友说可能是编译器不一样导致的,但也不知道怎么解,故来此一问,望大神们解答一下,非常感谢!

#0 0x000000000040f029 in cv::Mat::release (this=0x7fffcda94a10) at /usr/local/include/opencv2/core/mat.inl.hpp:708
#1 0x000000000040edcc in cv::Mat::~Mat (this=0x7fffcda94a10, __in_chrg=<optimized out>) at /usr/local/include/opencv2/core/mat.inl.hpp:590
#2 0x000000000041a3f9 in OCR::OCR_getPlateChars (this=0x7fffcda94cd0, src=..., plate_binary=..., charSegment=std::vector of length 0, capacity 0) at ../carrecognize/core/OCR.cpp:156

while (itc != contours.end())
{
Rect mr = boundingRect(Mat(*itc)); //得到最小外接矩形
Mat auxRoi(plate_binary, mr); // 裁剪图像
if (OCR_verifyCharSizes(auxRoi)) {
iRects.push_back(mr); //保存下所有疑似轮廓
myflag = false;
for (int j = 0; j < 7; j++)
{
if (mode[j].height == mr.height)
{
mode[j].height = mr.height;
mode[j].hcnts += 1;
myflag = true;
break;
}
}
if (!myflag)
{
mode[iw].height = mr.height;
mode[iw].hcnts += 1;
iw++;
myflag = false;
}

myflag = false;
for (int j = 0; j < 7; j++)
{
if (mode[j].width == mr.width)
{
mode[j].width = mr.width;
mode[j].wcnts += 1;
myflag = true;
break;
}
}
if (!myflag)
{
mode[ih].width = mr.width;
mode[ih].wcnts += 1;
ih++;
myflag = false;
}
}
++itc;
}



以上是我的代码,由gdb调试定位到这里有问题,但现在无法解决,求助!谢谢大佬们。
...全文
1808 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chasing_Chasing 2018-06-06
  • 打赏
  • 举报
回复 1
这个问题是内存相关的问题,今天在调试过程中发现,如果轮廓数量太多超过50的话,我的程序(就在上面这个代码)会崩掉,可能是因为轮廓太多申请的栈空间太大,导致后面继续申请时栈空间已经被用完了,程序就报内存错误,解决方法是先预估一下你的轮廓数量,然后再加一个条件限制,不让输入的图片轮廓太多,至于为什么我在vs2016跑的时候没问题,应该是vs对于程序栈空间设置比较大,能满足申请保存这么多轮廓的空间需要吧。
帅得不敢出门 2018-05-10
  • 打赏
  • 举报
回复
要么是没申请就释放,要么就是释放了两次Mat 另外vector of length 0, capacity 0 这里感觉是没为空,然后释放
  • 打赏
  • 举报
回复
相信你的室友 ,换个编译器,百度如何安装两个编译器

4,248

社区成员

发帖
与我相关
我的任务
社区描述
OpenCV相关技术交流专区
计算机视觉人工智能opencv 技术论坛(原bbs) 广东省·深圳市
社区管理员
  • OpenCV
  • 幻灰龙
  • OpenCV中国团队
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

OpenCV中国团队官方博客:https://blog.csdn.net/opencvchina

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