如何使用Python统计视频中的蓝色物体数量 现有代码如何实现计数
蓝色物体计数功能实现方案
你可以基于现有代码,通过提取掩码连通轮廓的方式实现蓝色物体计数,具体修改方案如下:
实现原理
你已经完成了蓝色区域的掩码提取,后续只需要统计掩码中独立连通区域的数量即可得到蓝色物体数量:
- 先对掩码做形态学操作消除细小噪点,避免误判
- 使用
cv2.findContours查找掩码中的所有连通轮廓 - 过滤掉面积过小的轮廓,剩余轮廓的数量就是蓝色物体的数量
修改后的完整代码
import numpy as np import cv2 cap = cv2.VideoCapture(0) # 最小轮廓面积阈值,根据实际画面调整,过滤噪点 MIN_AREA = 500 while True: ret, frame = cap.read() if not ret: break width = int(cap.get(3)) height = int(cap.get(4)) hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_blue = np.array([90, 50, 50]) upper_blue = np.array([130, 255, 255]) mask = cv2.inRange(hsv, lower_blue, upper_blue) # 新增:形态学操作,去除掩码中的小噪点 kernel = np.ones((5,5), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 新增:查找连通轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 过滤面积过小的轮廓,计数 blue_count = 0 for cnt in contours: if cv2.contourArea(cnt) > MIN_AREA: blue_count +=1 # 可选:在原图上标记蓝色物体的轮廓 cv2.drawContours(frame, [cnt], -1, (0,255,0), 2) # 可选:在画面上显示计数结果 cv2.putText(frame, f"Blue objects count: {blue_count}", (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2) result = cv2.bitwise_and(frame, frame, mask=mask) cv2.imshow('origin', frame) cv2.imshow('frame', result) cv2.imshow('mask', mask) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()
调整说明
- 如果出现误判多计数的情况,可以调大
MIN_AREA的数值 - 如果蓝色区域有漏识别的情况,可以适当放宽
lower_blue和upper_blue的阈值范围 - 你示例中的测试画面如下:

内容的提问来源于stack exchange,提问作者granty100
相关产品推荐
相关产品推荐

