FTC机器人运行OpenCV代码触发(-215)断言失败错误求助
问题分析与解决
核心原因
你遇到的断言错误,根源在于初始化的biggestContour是一个空的MatOfPoint对象。当第一次执行Imgproc.contourArea(biggestContour)时,这个空轮廓没有任何点数据,不满足OpenCVcontourArea函数的输入要求(函数要求轮廓至少包含有效点集,且点的深度为CV_32F或CV_32S),直接触发了断言失败。
修复方案
步骤1:先判断轮廓列表是否为空
在处理轮廓前,先检查contours是否为空,避免空列表遍历或无效操作。
步骤2:正确初始化最大轮廓
不要直接创建空的MatOfPoint,而是在确认contours非空后,将biggestContour初始化为列表中的第一个轮廓,再进行后续比较。
修改后的代码示例:
List<MatOfPoint> contours = new ArrayList<>(); Imgproc.findContours(thresholded, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); contoursAttr = contours; MatOfPoint biggestContour = null; // 先检查轮廓列表是否为空 if (!contours.isEmpty()) { // 初始化最大轮廓为第一个元素 biggestContour = contours.get(0); for (MatOfPoint curContour : contours) { // 额外判断当前轮廓的面积是否有效(避免空轮廓) double curArea = Imgproc.contourArea(curContour); double biggestArea = Imgproc.contourArea(biggestContour); if (curArea > biggestArea) { biggestContour = curContour; } } }
额外注意事项
- 调用
findContours后,有可能返回的contours列表中存在空的MatOfPoint(比如阈值处理后的图像没有有效轮廓),所以在遍历过程中可以额外判断curContour.empty(),跳过无效轮廓。 - 确保
thresholded是单通道的二值图像(findContours要求输入为8位单通道图像,且非零像素视为前景),如果输入图像格式不对,也可能导致生成的轮廓异常。
内容的提问来源于stack exchange,提问作者technicguy1
相关产品推荐
相关产品推荐

