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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`findContours` 是一个在 OpenCV 中用于查找轮廓的函数。它的使用方法如下: 1. 首先,定义一个二值化图像(例如灰度图像或二进制图像),并确保该图像已经进行了阈值化处理。 2. 然后,使用 `findContours` 函数来查找图像中的轮廓。该函数的语法如下: ``` cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) ``` 其中,参数意义如下: - `image`:输入的二值化图像。 - `mode`:轮廓检索模式。有以下几种模式可选: - `cv2.RETR_EXTERNAL`:只检测最外层的轮廓。 - `cv2.RETR_LIST`:检测所有的轮廓,并将其存储在列表中。 - `cv2.RETR_CCOMP`:检测所有轮廓,并将其组织为两层,即外层和内层轮廓。 - `cv2.RETR_TREE`:检测所有轮廓,并重构轮廓之间的整个层次结构。 - `method`:轮廓逼近方法。有以下几种方法可选: - `cv2.CHAIN_APPROX_NONE`:存储所有轮廓点。 - `cv2.CHAIN_APPROX_SIMPLE`:仅存储水平、垂直和对角线方向的端点。 - `cv2.CHAIN_APPROX_TC89_L1`或`cv2.CHAIN_APPROX_TC89_KCOS`:应用了 Tchebychev 距离或 K 型距离的逼近方法。 - `contours`:输出参数,存储检测到的轮廓。 - `hierarchy`:输出参数,存储轮廓之间的层次关系。 - `offset`:可选的偏移量,用于调整轮廓位置。 3. 最后,可以使用 `drawContours` 函数将轮廓绘制到原始图像上。该函数的语法如下: ``` cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) ``` 其中,参数意义如下: - `image`:要绘制轮廓的原始图像。 - `contours`:要绘制的轮廓。 - `contourIdx`:要绘制的轮廓索引。如果为负数,则绘制所有的轮廓。 - `color`:绘制轮廓的颜色。 - `thickness`:轮廓线条的粗细。如果为负数,则表示填充轮廓内部。 - `lineType`:绘制轮廓线条的类型。 - `hierarchy`:轮廓的层次结构。 - `maxLevel`:绘制的轮廓的最大层级。 - `offset`:可选的偏移量,用于调整轮廓位置。 下面是一个简单的示例代码,用于演示如何使用 `findContours` 函数查找并绘制图像中的轮廓: ``` import cv2 # 读取图像 img = cv2.imread('image.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理 ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 查找轮廓 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 cv2.drawContours(img, contours, -1, (0, 255, 0), 2) # 显示图像 cv2.imshow('Contours', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的代码中,我们首先读取一张图像,然后将其转换为灰度图像,并进行二值化处理。接着,使用 `findContours` 函数查找轮廓,并将其存储在 `contours` 变量中。最后,使用 `drawContours` 函数将轮廓绘制到原始图像上,并显示结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值