基于OpenCV实战:对象跟踪
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
介绍
跟踪对象的基本思想是找到对象的轮廓,基于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-代表中学,依此类推。
步骤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 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 = Noneif 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()
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
基于OpenCV实战:对象跟踪相关推荐
- 15 OpenCV4图像处理与视频分析实战(49.基于颜色的对象跟踪-.)
15 OpenCV4图像处理与视频分析实战(49.基于颜色的对象跟踪-) 一.49.基于颜色的对象跟踪-. 二,代码 来自网易云课堂(贾志刚) 一.49.基于颜色的对象跟踪-. 二,代码 #inclu ...
- OpenCV 实时对象跟踪(质心跟踪)
本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...
- 使用 OpenCV 进行对象跟踪的几种算法解读
使用 OpenCV 进行对象跟踪--算法 在本节中,我们将深入研究不同的跟踪算法.目标不是对每个跟踪器有深入的理论理解,而是从实践的角度理解它们. 让我首先解释跟踪背后的一些一般原则.在跟踪中,我们的 ...
- opencv实现对象跟踪_如何使用opencv跟踪对象的距离和角度
opencv实现对象跟踪 介绍 (Introduction) Tracking the distance and angle of an object has many practical uses, ...
- 笔记 基于OpenCV的目标跟踪软件与系统实现
1.目标检测理论包括光流法.帧间差分法和背景差分法, 目标分割理论包括全局阈值法和局部阈值法, 目标跟踪的均值漂移法和卡尔曼滤波法. 2.基于opencv的目标跟踪软件设计于实现 在vc环境下,按照单 ...
- 基于OpenCV实战:车牌检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 拥有思维导图或流程将引导我们朝着探索和寻找实现目标的正确道路的方向 ...
- 基于OpenCV实战的图像处理:色度分割
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分 ...
- 基于OpenCV实战:提取中心线
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|AI算法与图像处理 问题 前几天有个人问了我一个问题,问 ...
- 基于opencv实战眼睛控制鼠标
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 如何用眼睛来控制鼠标?一种基于单一前向视角的机器学习眼睛姿态估计方 ...
最新文章
- 点云及三维图像处理综述
- 一起学spring--我的第一个Spring程序,简单粗暴易懂
- C++中.lib静态库、.dll动态库的生成及调用2
- Spark RDD-行动算子
- Python内置函数(63)——super
- python isalpha()
- CTFshow 反序列化 web259
- DL之RBM:(sklearn自带数据集为1797个样本*64个特征+5倍数据集)深度学习之BRBM模型学习+LR进行分类实现手写数字图识别
- QT的QGraphicsLinearLayout类的使用
- 最好用的日志分析工具ELK
- Serverless Devs 的官网是如何通过 Serverless Devs 部署的?
- NSTimer定时器进阶——详细介绍,循环引用分析与解决
- 收集20个经典的Java面试题
- html5 ul li 自动收回,vue遍历四个ul ,每个ul中有四个li.如何不破坏html结构?
- linux下查询日志sed与或非,Linux命令之sed命令使用介绍
- 新基建浪潮下,看边缘计算+5G如何乘风破浪
- CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡
- .net 中Dictionary的遍历
- 程序员脱离苦海就靠这些绝招了了了。。。
- RDDs, Spark Memory, and Execution