您的位置:首页 > 运维架构

OpenCV findContours导致程序崩溃和相关使用问题

2017-03-17 15:10 691 查看
OpenCV新手上路,官网下载了一个OpenCV3.2.0版本,在VS2013上编程。安装各种教程配置好环境后开始研究。第一个任务是数码管数字识别。找了一张图片,开始读取灰度图,二值化,膨胀(数码管数字笔画是不连的,为了轮廓提取方便需要进行膨胀使得数字笔画相连),轮廓提取,数组分割,识别。。。

但是在轮廓提取过程发生了问题,主要是findContours()函数惹的祸,一运行到这个函数程序就崩溃,内存溢出。

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(image_dil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);   // image_dil是膨胀后的图片信息,Mat类型


应该是contours和hierarchy传到函数形参时发生错误。从网上查找了各种解决方案,但是都没用,主要的方案如下:

1. 在配置属性->常规->MFC的使用中,将在静态库中使用MFC改为在共享DLL中使用MFC;

2. 项目-属性-配置属性-C/C++-代码生成-运行库,将其改为“多线程调试(/MTd);

3. 变量申明时改为 vector contours(100); Mat hierarchy;

尝试过上述方法,但均宣告失败。各种尝试之下发现Release下可以出结果,之前都是Debug。可惜Release时在程序结束时会提示程序有bug,但至少还能有个结果看看。

后来发现,OpenCV3.2.0版本的…\opencv\build\x64文件夹下只有vc14一个文件夹,而vc14代表VS2015,而我用的VS是2013版的,环境配置也是按照vc14配置的。于是,我把OpenCV降级成3.1.0,\build\x64文件夹下有vc12和vc14两个文件夹(vc2013代表vs2013),重新配置环境后,程序就可以顺利运行了。

在提取数字分割过程中又发现了第二个问题:

一幅二值化图像image_bin:



然后进行腐蚀操作,image_dil结果如下:



findContours进行提取轮廓后,再次输出腐蚀后的图像,发现腐蚀后的图像只剩下一层淡淡的外部轮廓:



如果对轮廓提取后的腐蚀图像进行数字提取,得到悲催的结果:



如果要想得到正确的结果,必须对二值化图像进行提取:



But!!!之前在用OpenCV3.2.0编程时,一模一样的程序,3.2版本可以正常地提取腐蚀后的图像,不会只有一个淡淡的轮廓。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐