C++使用OpenCV出现Vector Subscript out of range错误求助
OpenCV轮廓检测中Vector Subscript out of range错误排查
出现这个断言错误,大概率是代码中访问了超出vector范围的元素,结合你怀疑的approxPolyDP,常见原因和排查方向如下:
- 轮廓列表为空就直接处理:
findContours可能没检测到任何轮廓,此时contours是空vector,如果直接通过下标(比如contours[0])访问,或者遍历前没判断contours.empty(),就会触发越界。 - 单个轮廓点数量不足:
approxPolyDP无法处理点数量少于3的轮廓,如果遍历轮廓时没跳过这类无效轮廓,函数内部可能触发断言。 approxPolyDP输出为空:如果epsilon参数设置过大(比如远大于轮廓周长的合理比例),可能导致拟合后的多边形点数量为0,后续访问approx的下标就会越界。- 后续访问拟合结果越界:比如你假设
approx有固定数量的点(比如4个),但实际拟合结果点数不足,直接通过下标访问就会出错。
修正步骤示例
- 检测轮廓后先判断是否为空:
vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(binary_img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); if (contours.empty()) { cout << "未检测到有效轮廓" << endl; return; }
- 遍历轮廓时跳过点数量不足的情况:
for (size_t i = 0; i < contours.size(); i++) { // 至少3个点才能拟合多边形 if (contours[i].size() < 3) continue; double epsilon = 0.02 * arcLength(contours[i], true); // 用周长的2%作为阈值 vector<Point> approx; approxPolyDP(contours[i], approx, epsilon, true); // 访问拟合结果前先判断点数量 if (approx.size() >= 4) { // 处理四边形逻辑,比如绘制轮廓 drawContours(src_img, {approx}, 0, Scalar(0, 255, 0), 2); } }
你可以对照自己的代码,检查是否存在上述某一种情况,尤其是findContours后的空判断和轮廓点数量的校验,这是新手最容易忽略的地方。
内容的提问来源于stack exchange,提问作者Mind Chants
相关产品推荐
相关产品推荐

