如何使用OpenCV为画面中所有蓝色物体绘制外接矩形?
问题原因
现有代码仅能标注最大蓝色物体,是因为代码使用max(bluecnts, key=cv2.contourArea)仅提取了所有蓝色轮廓中面积最大的单个轮廓进行处理。要实现所有蓝色物体的外接矩形标注,只需遍历全部检测到的轮廓即可。
修改后的完整代码
import numpy as np import cv2 cap = cv2.VideoCapture(0) while True: _, frame = cap.read() # Convert BGR to HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # define range of blue color in HSV lower_blue = np.array([100,50,50]) upper_blue = np.array([130,255,255]) # Threshold the HSV image to get only blue colors mask = cv2.inRange (hsv, lower_blue, upper_blue) bluecnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2] if len(bluecnts)>0: # 遍历所有检测到的蓝色轮廓 for cnt in bluecnts: # 过滤面积过小的噪点,阈值可根据实际需求调整 if cv2.contourArea(cnt) < 10: continue (xg,yg,wg,hg) = cv2.boundingRect(cnt) cv2.rectangle(frame,(xg,yg),(xg+wg, yg+hg),(0,255,0),2) result = cv2.bitwise_and(frame, frame, mask=mask) cv2.imshow('frame',frame) cv2.imshow('mask',mask) cv2.imshow('blue', result) if cv2.waitKey(1) == ord('q'): break cap.release() cv2.destroyAllWindows()
核心修改点
- 删除了原代码中取最大轮廓的逻辑,改为遍历全部检测到的蓝色轮廓
- 新增最小面积过滤规则,避免画面中的微小噪点生成无意义的小矩形,面积阈值可根据实际拍摄场景自行调整
- 对每一个符合要求的轮廓单独计算外接矩形并绘制
内容的提问来源于stack exchange,提问作者granty100
相关产品推荐
相关产品推荐

