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

来源:互联网 发布:exe软件重新编译 编辑:程序博客网 时间:2024/05/17 03:59

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版本可以正常地提取腐蚀后的图像,不会只有一个淡淡的轮廓。

0 0
原创粉丝点击