技术专栏
基于OpenCV实战:对象跟踪
介绍
跟踪对象的基本思想是找到对象的轮廓,基于HSV颜色值。
轮廓:突出显示对象的图像片段。例如,如果将二进制阈值应用于具有(180,255)的图像,则大于180的像素将以白色突出显示,而其他则为黑色。白色部分称为轮廓。
在继续下面的操作之前,请在系统中安装OpenCV。打开命令提示符并键入
pip install opencv-python
- 1
步骤1:从相机读取数据
import cv2
cam = cv2.VideoCapture(0)
img = cam.read()[1] #_, img = cam.read()
- 1
- 2
- 3
- 4
参数0-用于主相机,例如在笔记本电脑网络摄像头中被视为主相机。1-代表中学,依此类推。
步骤2:预处理框架
1、使用高斯滤波器对图像进行归一化。归一化图像可能会丢失许多小信息,但是我们需要归一化/模糊图像,以使我们的对象获得均等的颜色分布。
#cv2.gaussianBlur(source_image,Kernal_size,Border_width)
Blur_img = cv2.GaussianBlur(img,(11,11),0)
- 1
2、将图像转换为HSV颜色模型。
HSV = cv2.cvtColor(Blur_img, cv2.COLOR_BGR2HSV)
- 1
步骤3:找到对应对象的HSV颜色
Obj_low = np.array([0,0,0]) # In my case (H,S,V)
Obj_high = np.array([179,157,79])
- 1
- 2
步骤4:阈值化
在给定的HSV值范围内应用二进制阈值,黑白Obj_low和Obj_high。
MASK = cv2.inRange(HSV, Obj_low, Obj_high)
- 1
#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)
- 1
- 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)
- 1
- 2
- 3
在上面给定的图像中,整个白色边界区域是轮廓。轮廓可能不止一个,但主要对象的面积将最大。所以选择轮廓最大。然后..
步骤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)
- 1
- 2
- 3
- 4
- 5
对象跟踪程序代码
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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
<
声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包
1
1
评论
打赏
- 分享
- 举报
评论
0个
手气红包

相关专栏
-
浏览量:6351次2021-03-02 09:35:15
-
浏览量:467次2023-12-05 17:39:39
-
浏览量:5742次2020-12-21 16:50:21
-
浏览量:795次2023-08-16 09:32:29
-
浏览量:2404次2022-05-13 10:46:47
-
浏览量:6311次2020-12-25 23:18:24
-
浏览量:8393次2020-12-13 17:04:33
-
2020-12-14 18:16:24
-
浏览量:5063次2021-01-11 15:33:50
-
浏览量:1519次2023-08-29 15:52:13
-
浏览量:4552次2021-01-12 18:43:19
-
浏览量:5531次2021-01-05 22:14:42
-
浏览量:5775次2021-01-03 01:24:13
-
浏览量:5731次2021-01-02 22:50:35
-
浏览量:8305次2020-12-13 17:30:07
-
浏览量:5349次2020-12-29 19:37:20
-
浏览量:6203次2020-12-29 14:13:00
-
浏览量:104次2023-08-30 20:18:28
-
浏览量:834次2023-12-14 17:05:19
切换马甲
上一页
下一页
TA最新文章
打赏用户
共 0 位
我要创作
分享技术经验,可获取创作收益
分类专栏
-
37篇
热门专栏
- OpenCV DNN C++ 使用 YOLO 模型推理
- 如何利用Unity加速机器人仿真?
- 有需要海思,SONY芯片(SONY,海思,镁光,OV,PIXELPLUS )芯片可以找我
- 美国封锁之下,华为员工已升至19.4万人
- OpenCV 3.4.12 + opencv_contrib Ubuntu交叉编译到arm(rv1126_rv1109)开发板
- 人脸识别再曝安全漏洞,15分钟解锁19款安卓手机,只需打印机、A4纸和眼镜框即可
- U²-Net:使用显著性物体检测来生成真实的铅笔肖像画
- 海思打开4路串口方法
- 海思3531d音频调试
- 4. Python OpenCV 中鼠标事件相关处理与常见问题解决方案
置顶时间设置
结束时间
删除原因
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
打赏作者

Winki
您的支持将鼓励我继续创作!
打赏金额:
¥1

¥5

¥10

¥50

¥100

支付方式:

举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
审核成功
发布时间设置
发布时间:
请选择发布时间设置
是否关联周任务-专栏模块
审核失败
失败原因
请选择失败原因
备注
请输入备注