1 遇到的问题
之前用opencv的python版本的查找轮廓函数cv2.drawContours()没有报错,但是同样的代码,用opencv的C++版本的查找轮廓函数cv::drawContours()实现了一遍,竟然报错了,而且程序老奔溃,一直提示内存有问题!!!
2 我的疑惑
这个问题困扰了我整整两天,网友说这是opencv库的bug等,众说纷纭,但是我用的最近的版本啊,按道理说不应该啊,要是历史遗留问题应该早就解决了啊。
3 尝试的方法
3.1 网友总结的解决方案
网友给的所有建议,一二三四五六七八条,太多了,我就不当搬运工了,我都试过了,是不行滴!
3.2 降低opencv版本
然后我看到说降版本好使,我又从4.6.0降低到3.4.0还是不行,又看到说3.0一下的版本可以用,我又降级到2.4.9,最终还是不行!!!
3.3 查看官方文档
最后我查看官方文档,我写的存放轮廓的容器形式和官方文档给出来的一样啊,std::vector<std::vectorcv::Point> vecConts;哪出错了?(给大家一个官方文档链接链接: https://docs.opencv.org/4.6.0/d3/dc0/group__imgproc__shape.html#gadf1ad6a0b82947fa1fe3c3d497f260e0)
4 最终的解决方案
最终,我尝试在查找轮廓之前,先对图像进行一个canny边缘检测,然后用得到的图像再进行轮廓查找,没想到竟然不奔溃了!!!哈哈,撒花,庆祝一下!累了一天了,准备收工回家,想想,还是记录一下,万一有同学也遇到了呢?
废话不多说,上一下不崩溃的代码:
部分代码如下
// canny边缘检测
cv::Mat im_canny;
cv::Canny(im_bin, im_canny, 50, 100);
// 查找轮廓
std::vector<std::vector<cv::Point>> vecConts;
cv::findContours(im_canny, vecConts, cv::RETR_LIST, cv::CHAIN_APPROX_NONE);
std::cout << "轮廓数量:" << vecConts.size() << endl;