学习树莓派的路上,今天学习了用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()

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐