使用OpenCV中findContours函数时触发断言失败错误的求助
解决OpenCV findContours 触发的断言失败异常
这个断言错误我之前也碰到过,核心原因是你定义的轮廓容器类型不匹配,咱们一步步来解决:
核心问题:轮廓点类型搞错了
你代码里把contours定义成了vector<vector<Point2f>>,但findContours函数返回的轮廓点都是整数像素坐标,要求容器里存的是Point(或者等价的Point2i)类型,用浮点型的Point2f会直接触发类型检查的断言失败。
修正后的完整代码
我给你调整了类型,顺便加了图像读取的判断,避免处理空图像导致其他问题:
Mat frame = imread(argv[1]); // 先检查图像是否成功读取 if (frame.empty()) { cerr << "哎呀,读不了图像文件!检查下路径对不对?" << endl; return -1; } cvtColor(frame, frame, CV_BGR2GRAY); threshold(frame, frame, 150, 255, THRESH_BINARY); // 把contours改成Point类型的容器 vector<vector<Point>> contours; findContours(frame.clone(), contours, noArray(), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
额外要注意的小细节
- 你先转灰度再二值化的流程是对的,
threshold输出的图像是单通道8位图,刚好符合findContours的输入要求(必须是单通道二值图,8位或32位整数类型)。 - 你用
frame.clone()传给findContours这点做得很聪明,因为这个函数会修改输入图像,克隆一份就不会破坏原有的二值图啦。 - 如果后续确实需要浮点型的轮廓点,完全可以在检测完成后再转换,比如这样:
vector<vector<Point2f>> contours_float; for (auto &cnt : contours) { vector<Point2f> cnt_float(cnt.begin(), cnt.end()); contours_float.push_back(cnt_float); }
内容的提问来源于stack exchange,提问作者Gayathri
相关产品推荐
相关产品推荐

