OpenCV计算运动土豆轮廓面积时如何获取最优参考值
轮廓面积均值计算修正方案
你现有代码的核心问题是有效面积存储数组、均值计算逻辑都放在了轮廓遍历循环内部,每次循环都会重新创建仅包含当前单个面积值的数组,之前遍历到的轮廓面积会被完全覆盖,根本没有累计所有符合阈值的轮廓数据,自然算不出正确的整体均值。
调整逻辑如下:
- 遍历轮廓前,先初始化空列表,专门存储所有符合面积阈值的有效轮廓面积
- 遍历轮廓时,仅把满足
area > 100阈值的面积值追加到预先定义的列表中,不要在循环内部执行均值计算 - 所有轮廓遍历完成后,先判断有效面积列表是否为空(避免没有检测到有效轮廓时触发计算报错),再对收集到的全量有效面积计算平均值
- 如果需要更稳定的项目参考值,可以在计算均值前增加离群值过滤步骤,剔除传送带上脏污、反光、轮廓残缺带来的异常面积值,最终结果会更贴合土豆的真实轮廓面积
修正后代码
import cv2 as cv import numpy as np import statistics # contours 为cv.findContours输出的轮廓集合 valid_areas = [] # 循环外初始化有效面积存储列表 for cnt in contours: area = cv.contourArea(cnt) # 过滤面积小于100的噪点轮廓 if area > 100: valid_areas.append(area) if len(valid_areas) > 0: # 基础平均面积计算 mean_area = statistics.mean(valid_areas) print(f"有效轮廓平均面积: {mean_area}") # 可选:通过2σ原则过滤离群值,获得更稳定的参考值 if len(valid_areas) > 1: area_std = statistics.stdev(valid_areas) stable_areas = [a for a in valid_areas if abs(a - mean_area) <= 2 * area_std] stable_mean = statistics.mean(stable_areas) print(f"过滤离群值后的稳定平均面积: {stable_mean}") else: print("未检测到符合阈值的有效轮廓,请检查阈值或轮廓提取逻辑")
提示:代码中设置的100像素面积阈值需要根据你的相机分辨率、拍摄视场大小、土豆实际尺寸校准,阈值不合理会导致小尺寸土豆被误判为噪点过滤,或是把传送带上的脏点、反光噪点计入有效数据,影响最终结果准确性。
内容的提问来源于stack exchange,提问作者Nitesh Silwal
相关产品推荐
相关产品推荐

