基于OpenCV实战:对象跟踪

小白学视觉

共 3220字,需浏览 7分钟

 ·

2021-04-25 10:27

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达


介绍


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

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

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

pip install opencv-python

步骤1:从相机读取数据
import cv2cam = cv2.VideoCapture(0) img = cam.read()[1] #_, img = cam.read()

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


步骤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)


步骤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)

#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)


步骤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 cv2import numpy as npcam = 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:        breakcam.release()cv2.destroyAllWindows()


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报