学习树莓派的路上,今天学习了用opencv进行色块追踪的实验,熟悉了颜色空间转换、掩膜提取、轮廓提取、轮廓绘制相关函数的使用。
基本流程为:
[读取视频帧]
[转换到HSV空间]
[颜色阈值分割]
[形态学处理]
[轮廓检测]
[绘制矩形框]
[显示结果]
HSV掩膜提取
关于每种颜色对应的HSV阈值,可以参考下表:
设定阈值后,进行掩膜提取,目标区域为白色。
为了方便设置阈值,可以创建滑块,手动调整阈值以获得最佳效果。
形态学去噪
通过腐蚀(核内只要有一个黑色中心像素即为黑)、膨胀、开(先腐蚀后膨胀)、闭运算将掩膜中的噪点或者空洞去除。
记住口诀:
🔹 “开运算去毛刺,闭运算补漏洞”
🔹 “先开后闭,天下无敌” (针对复杂掩膜)
轮廓检测
使用函数提取轮廓,返回轮廓列表,遍历列表求其外接矩形,并绘制,即可。
跟踪品红色块代码
import numpy as np
import cv2
import time
capture = cv2.VideoCapture(0)
if not capture.isOpened():
print("open camera failed")
exit()
while True:
ret,frame = capture.read()
if not ret:
print("no frame")
break
#设定阈值,提取掩膜
frame_hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
lower_red = np.array([156,50,50])
upper_red = np.array([180,255,255])
mask = cv2.inRange(frame_hsv,lower_red,upper_red)
# 添加形态学操作
kernel = np.ones((10, 10), np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 去噪
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 填充
#检测轮廓
contours,hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("frame",frame)
if cv2.waitKey(20) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()