鸡蛋计数系统是禽类养殖场和食品加工厂中常见的自动化需求。传统人工计数方式效率低下且容易出错,而基于计算机视觉的解决方案能够实现快速、准确的自动化计数。这个项目将使用OpenCV和Python构建一个能够实时检测和统计鸡蛋数量的系统,适用于传送带流水线或固定托盘场景。
我在某大型禽蛋加工企业实施类似项目时发现,一套稳定的计数系统能减少3-4个质检岗位的人力成本,同时将计数误差率从人工的2-3%降低到0.5%以下。系统核心需要解决鸡蛋重叠、反光和动态检测三个技术难点。
注意:光照条件会显著影响检测效果,建议在系统部署时保持500-800lux的均匀照明
python复制视频输入 → 帧提取 → 预处理 → 轮廓检测 → 椭圆拟合 →
重叠处理 → 动态跟踪 → 计数输出
| 功能模块 | 候选方案 | 最终选择 | 选择理由 |
|---|---|---|---|
| 图像预处理 | 高斯模糊+直方图均衡化 | CLAHE+双边滤波 | 更好保留边缘同时均衡光照 |
| 轮廓检测 | Canny边缘检测 | 自适应阈值分割 | 对反光表面更鲁棒 |
| 形状识别 | Hough圆检测 | 椭圆拟合+轮廓分析 | 对椭圆形变和遮挡更适应 |
| 重叠处理 | 分水岭算法 | 凹点检测+区域分割 | 计算量更小且准确率相当 |
python复制def preprocess(frame):
# CLAHE对比度受限自适应直方图均衡
lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
cl = clahe.apply(l)
limg = cv2.merge((cl,a,b))
# 双边滤波去噪
filtered = cv2.bilateralFilter(limg, 9, 75, 75)
return cv2.cvtColor(filtered, cv2.COLOR_LAB2BGR)
python复制# 轮廓筛选条件
min_area = 500 # 最小区域像素
max_area = 5000 # 最大区域像素
min_ratio = 0.7 # 短轴/长轴最小比值
max_ratio = 1.3 # 短轴/长轴最大比值
ellipses = []
for cnt in contours:
if len(cnt) >= 5:
ellipse = cv2.fitEllipse(cnt)
(x,y), (ma,ma), angle = ellipse
ratio = min(ma,ma)/max(ma,ma)
if min_ratio <= ratio <= max_ratio:
ellipses.append(ellipse)
python复制hull = cv2.convexHull(cnt, returnPoints=False)
defects = cv2.convexityDefects(cnt, hull)
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
if d > 0.1 * cv2.arcLength(cnt,True): # 凹点深度阈值
# 执行分割操作...
使用CSRT跟踪器实现帧间关联:
python复制trackers = cv2.MultiTracker_create()
for ellipse in new_ellipses:
tracker = cv2.TrackerCSRT_create()
bbox = (ellipse[0][0]-ellipse[1][0]/2,
ellipse[0][1]-ellipse[1][1]/2,
ellipse[1][0], ellipse[1][1])
trackers.add(tracker, frame, bbox)
对于固定场景,设置ROI可提升30%处理速度:
python复制roi = cv2.selectROI("Select Area", frame)
while True:
ret, frame = cap.read()
roi_frame = frame[roi[1]:roi[1]+roi[3], roi[0]:roi[0]+roi[2]]
# 仅在ROI区域内处理...
| 检测层级 | 缩放比例 | 适用场景 |
|---|---|---|
| 层级1 | 100% | 正常大小鸡蛋 |
| 层级2 | 70% | 远处/小尺寸鸡蛋 |
| 层级3 | 150% | 特大鸡蛋或近距离特写 |
光照补偿方案:
相机选型建议:
典型误检场景处理:
python复制kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]])
enhanced = cv2.filter2D(gray, -1, kernel)
python复制rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
hsv = cv2.cvtColor(rgb, cv2.COLOR_RGB2HSV)
v = hsv[:,:,2]
ret, shadow_mask = cv2.threshold(v, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
no_shadow = cv2.inpaint(frame, 255-shadow_mask, 3, cv2.INPAINT_TELEA)
python复制class EggCounter:
def __init__(self, video_source=0):
self.cap = cv2.VideoCapture(video_source)
self.trackers = cv2.MultiTracker_create()
self.count = 0
self.prev_centers = []
def process_frame(self):
ret, frame = self.cap.read()
if not ret: return None
# 预处理
processed = self.preprocess(frame)
# 检测与计数
ellipses = self.detect_eggs(processed)
self.update_count(ellipses)
# 显示结果
result = self.draw_results(frame, ellipses)
return result
def run(self):
while True:
result = self.process_frame()
if result is None: break
cv2.imshow('Egg Counter', result)
if cv2.waitKey(1) == 27: break
self.cap.release()
cv2.destroyAllWindows()
在禽蛋加工厂的实际部署中,这套系统需要2-3天的调试期来适应具体环境。最重要的经验是:先保证稳定的成像质量,再优化算法参数。我们曾花费一周时间调整算法,最后发现只是相机镜头上有污渍导致的问题。