基于OpenCV实战:对象跟踪

重磅干货,第一时间送达

介绍

跟踪对象的基本思想是找到对象的轮廓,基于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扩展模块中文版教程
(0)

相关推荐

  • 使用Python+OpenCV进行数据增广方法综述(附代码演练)

    原创 磐怼怼 深度学习与计算机视觉 1周前 数据扩充是一种增加数据集多样性的技术,无需收集更多的真实数据,但仍然有助于提高模型的准确性和防止模型过度拟合.在这篇文章中,你将学习使用Python和Ope ...

  • 基于OpenCV实战:车牌检测

    重磅干货,第一时间送达 拥有思维导图或流程将引导我们朝着探索和寻找实现目标的正确道路的方向发展.如果要给我一张图片,我们如何找到车牌并提取文字? 一般思维步骤: 识别输入数据是图像. 扫描图像以查看由 ...

  • 基于OpenCV实战的图像处理:色度分割

    重磅干货,第一时间送达 通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法.为什么大多数人偏爱色度而不是RGB / HSV分割? 可以获得RGB / HSV通道之间的比 ...

  • 基于OpenCV实战:绘制图像轮廓(附代码)

    重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图.这些线条可以手动绘制,也可以由计算机生成.在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线 ...

  • 基于OpenCV实战:动态物体检测

    重磅干货,第一时间送达 最近,闭路电视安全系统运行着多种算法来确保安全,例如面部识别,物体检测,盗窃检测,火灾警报等.我们在运动检测的基础上实现了许多算法,因为在空闲帧上运行所有这些进程没有任何意义. ...

  • 基于OpenCV的实战:轮廓检测(附代码解析)

    重磅干货,第一时间送达 利用轮廓检测物体可以看到物体的各种颜色,在这种情况下放置在静态和动态物体上.如果是统计图像,则需要将图像加载到程序中,然后使用OpenCV库,以便跟踪对象. 每当在框架中检测到 ...

  • 实战:基于OpenCV 的车牌识别

    重磅干货,第一时间送达 车牌识别是一种图像处理技术,用于识别不同车辆.这项技术被广泛用于各种安全检测中.现在让我一起基于OpenCV编写Python代码来完成这一任务. 车牌识别的相关步骤 1.车牌检 ...

  • 实战:基于OpenCV进行长时间曝光(内含彩蛋)

    重磅干货,第一时间送达 在本文中,我们将学习长时间曝光摄影技术,以及如何使用Python和OpenCV(开源计算机视觉库)对其进行仿真. 一.什么是"长时间曝光"? 直接来自维基百 ...

  • 基于OpenCV的面部关键点检测实战

    重磅干货,第一时间送达 这篇文章概述了用于构建面部关键点检测模型的技术,这些技术是Udacity的AI Nanodegree程序的一部分. 概述 在Udacity的AIND的最终项目中,目标是创建一个 ...

  • 基于Opencv的图像单应性转换实战

    重磅干货,第一时间送达 同形转换 我们所常见的都是以这样的方式来处理图像:检测斑点,分割感兴趣的对象等.我们如何将它们从一种形式转换为另一种形式来处理这些图像呢?通过单应矩阵快速转换图像可以实现这个需 ...