使用OpenCV追踪特定颜色的物体

OpenCV的python官方教程中已经在转换颜色空间一节(https://docs.opencv.org/master/df/d9d/tutorial_py_colorspaces.html)中给出了追踪特定颜色物体的基本方法:即转换颜色空间到HSV,设定带追踪物体的颜色阈值,并进行二值化处理。我们对此进行改进,滤除部分噪声,并使用最小外接圆圈出待追踪物体,代码如下,注释详细不再赘述:

# 导入所需模块
import cv2 as cv
import numpy as np
import imutils

# 打开摄像头
cap = cv.VideoCapture(0)

while True:
    # 读取每一帧
    _, frame = cap.read()
    # 重设图片尺寸以提高计算速度
    frame = imutils.resize(frame, width=600)
    # 进行高斯模糊
    blurred = cv.GaussianBlur(frame, (11, 11), 0)
    # 转换颜色空间到HSV
    hsv = cv.cvtColor(blurred, cv.COLOR_BGR2HSV)
    # 定义红色无图的HSV阈值
    lower_red = np.array([20, 100, 100])
    upper_red = np.array([220, 255, 255])
    # 对图片进行二值化处理
    mask = cv.inRange(hsv, lower_red, upper_red)
    # 腐蚀操作
    mask = cv.erode(mask, None, iterations=2)
    # 膨胀操作,先腐蚀后膨胀以滤除噪声
    mask = cv.dilate(mask, None, iterations=2)

    cv.imshow('mask', mask)

    # 寻找图中轮廓
    cnts = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)[-2]

    # 如果存在至少一个轮廓则进行如下操作
    if len(cnts) > 0:
        # 找到面积最大的轮廓
        c = max(cnts, key=cv.contourArea)
        # 使用最小外接圆圈出面积最大的轮廓
        ((x, y), radius) = cv.minEnclosingCircle(c)
        # 计算轮廓的矩
        M = cv.moments(c)
        # 计算轮廓的重心
        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
        # 只处理尺寸足够大的轮廓
        if radius > 5:
            # 画出最小外接圆
            cv.circle(frame, (int(x), int(y)), int(radius), (0, 255, 255), 2)
            # 画出重心
            cv.circle(frame, center, 5, (0, 0, 255), -1)

    cv.imshow('frame', frame)
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
cap.release()
cv.destroyAllWindows()
  • 16
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洒满阳光的午后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值