基于 OpenCV 实战:对象跟踪

ab147fbe7373ed37cb0c15fda1c208e9.gif

作者 | 小白

来源丨小白学视觉

介绍

跟踪对象的基本思想是找到对象的轮廓,基于HSV颜色值。

轮廓:突出显示对象的图像片段。例如,如果将二进制阈值应用于具有(180,255)的图像,则大于180的像素将以白色突出显示,而其他则为黑色。白色部分称为轮廓。

在继续下面的操作之前,请在系统中安装OpenCV。打开命令提示符并键入

pip install opencv-python

步骤1:从相机读取数据

import cv2
cam = cv2.VideoCapture(0) 
img = cam.read()[1] #_, img = cam.read()

参数0-用于主相机,例如在笔记本电脑网络摄像头中被视为主相机。1-代表中学,依此类推。

56a876b00f426ce7a774f3b243c0a127.png

步骤2:预处理框架

1、使用高斯滤波器对图像进行归一化。归一化图像可能会丢失许多小信息,但是我们需要归一化/模糊图像,以使我们的对象获得均等的颜色分布。

#cv2.gaussianBlur(source_image,Kernal_size,Border_width)

Blur_img = cv2.GaussianBlur(img,(11,11),0)

2、将图像转换为HSV颜色模型。

HSV = cv2.cvtColor(Blur_img, cv2.COLOR_BGR2HSV)

84d1c15da16b946a1f4ee2d79c67da2c.png

步骤3:找到对应对象的HSV颜色

Obj_low = np.array([0,0,0]) # In my case (H,S,V)
Obj_high = np.array([179,157,79])

步骤4:阈值化

在给定的HSV值范围内应用二进制阈值,黑白Obj_low和Obj_high。

MASK = cv2.inRange(HSV, Obj_low, Obj_high)

8343c5ac6d0a9c78d998eeea771815b4.png

#MASK2 = cv2.inRange(HSV,Obj2_low,Obj2_high)

如果尝试跟踪两个不同的对象,则需要创建2个不同的蒙版,并最终在两个蒙版上使用“按位与”运算符。

#mask = cv2.bitwise_and(mask1,mask2)

侵蚀和膨胀:侵蚀和膨胀填充阈值图像中的黑色和白色斑点。这样可使图像更清晰,平滑并突出主要对象。

MASK = cv2.erode(MASK1, None, iterations=2)
MASK = cv2.dilate(MASK1, None, iterations =2)

e86331bffccd72a850d17b40e0b364b7.png

步骤5:在图像中查找轮廓

轮廓:突出显示对象的图像片段。例如,如果将二进制阈值应用于具有(180,255)的图像,则大于180的像素将以白色突出显示,而其他则为黑色。白色部分称为轮廓。

cnts = cv2.findContours(MASK1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
if len(cnts)>0 :
 c = max(cnts, key = cv2.contourArea)

在上面给定的图像中,整个白色边界区域是轮廓。轮廓可能不止一个,但主要对象的面积将最大。所以选择轮廓最大。然后..

步骤6:在对象上绘制圆

得到主要物体的轮廓后,在轮廓上画一个圆。

((x,y), radius) = cv2.minEnclosingCircle(c)
M = cv2.moments(c)
center = (int(M[‘m10’]/ M[‘m00’]), int(M[‘m01’]/ M[‘m00’]) )
cv2.circle(img, center, 5, (0,0,255), -1)
cv2.circle(img, center, int(radius), (0,0,255), 2)

对象跟踪程序代码

import cv2
import numpy as np
cam = cv2.VideoCapture(0)
Obj_low = np.array([0,0,0])
Obj_high = np.array([179,157,79])
while True:
    img = cam.read()[1]
    img = cv2.resize(img, (800,600) )
    blur_img = cv2.GaussianBlur(img,(21,21),0)
    HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
MASK1 = cv2.inRange(HSV, Obj_low, Obj_high)
    MASK1 = cv2.erode(MASK1, None, iterations=2)
    MASK1 = cv2.dilate(MASK1, None, iterations =2)
    cnts = cv2.findContours(MASK1.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
    center = None
    if len(cnts)>0 :
        c = max(cnts, key = cv2.contourArea)
        ((x,y), radius) = cv2.minEnclosingCircle(c)
        M = cv2.moments(c)
        center = (int(M['m10']/ M['m00']), int(M['m01']/ M['m00']) )
        if radius>10:
            cv2.circle(img, center, 5, (0,0,255), -1)
            cv2.circle(img, center, int(radius), (0,0,255), 2)
    cv2.imshow("my window",img)
    k = cv2.waitKey(1)
    if k==27:
        break
cam.release()
cv2.destroyAllWindows()

技术

如何实现前端数据发送到邮箱?

资讯

何同学又上热搜了,这次为什么?

技术

手把手教你用Python绘制桑葚图!

技术

10个有趣的Python高级脚本!

d4054855c8c4b240529440d16bba082b.png

分享

8e41b86d7f4b1ef4f55aa97b4cb070b7.png

点收藏

edc7a21b1564babc70a9a8742630783c.png

点点赞

38b7dc27a8ce583fc7ff8ae0c6cabe9e.png

点在看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值