OpenCV实现对象跟踪的方法

介绍

OpenCV 是一个很好的处理图像和视频的工具。无论你是想让你的照片呈现 90 年代的黑白效果,还是执行复杂的数学运算,OpenCV 都可以随时为你服务。

如果你对计算机视觉感兴趣,则必须具备 OpenCV 的知识。该库包含 2500 多种优化算法,可用于执行各种任务。它被谷歌、微软、IBM 等许多行业巨头使用,并被广泛用于研究小组。该库支持多种语言,包括 java、c++ 和 python。

本文将向你展示如何使用 OpenCV 中的一些基本功能来执行复杂的对象跟踪任务。

对象跟踪

对象跟踪是在视频中定位移动对象的过程。你可以考虑一个足球比赛的例子。

你有正在进行的比赛的实时馈送,你的任务是随时跟踪球的位置。对于普通人来说,这项任务似乎很简单,但即使是最聪明的机器,它还是太复杂了。

你可能知道,计算机只能理解数字。它不了解图像是什么,但了解与图像相关联的像素值。在人眼看来完全相同的两个图像在计算机看来可能并不相同,因为即使像素的微小变化也会导致图片之间的差异。因为对象跟踪被认为是计算机视觉中最复杂的任务之一。虽然复杂,但也不是无法实现的。

可以使用机器学习以及基于深度学习的方法来执行对象跟踪。

一方面,深度学习方法在复杂任务上提供了更好的结果,并且非常通用,需要大量的训练数据。而基于 ML 的方法非常简单,但不是通用的。

在本文中,我们将使用基于 ML 的方法以及我们将在本文后面讨论的各种计算机视觉技术。

该技术广泛应用于监控、安全、交通监控、机器人视觉、视频通信等领域。此外,对象跟踪有几个用例,例如人群计数、自动驾驶汽车、人脸检测等。你能想出更多可以在日常生活中使用对象跟踪的示例吗?

由于现实生活中有如此多的应用,因此该领域正在进行不断的研究,以实现更高的准确性并使模型更加稳健。

对于本文,我们将使用此视频(https://drive.google.com/file/d/1N6NcFpveLQLc_DnFjfuMMvfuCMTAJRFm/view?usp=sharing)。

正如你将看到的,有一个红色的球在迷宫中移动,我们的任务是检测球的位置并找到它的质心。你还可以在背景中看到巨大的噪音(人群),使任务更具挑战性。

1.首先,我们导入将要使用的所需库。

import numpy as np
import cv2

2.我们将定义一个函数来调整图像的大小,以便它们在足够大的情况下适合我们的屏幕。这一步是完全可选的,可以随意跳过。

def resize(img):
        return cv2.resize(img,(512,512)) # arg1- input image, arg- output_width, output_height

3.你可能知道,视频是由帧组成的。帧只不过是构成整个动态画面的众多静止图像之一。下一步将使用 OpenCV 中的 VideoCapture() 函数读取这些帧,并使用 while 循环,我们可以看到帧在移动。

你可以使用将屏幕暂停 x 毫秒的 cv2.waitKey(x) 来调整视频的速度。

cap=cv2.VideoCapture(vid_file_path)
ret,frame=cap.read()

while ret==True:
    ret,frame=cap.read()
    cv2.imshow("frame",resize(frame))
    key=cv2.waitKey(1)
    if key==ord('q'):
        break
cv2.waitKey(0)
cv2.destroyAllWindows()

4.现在是时候执行一些阈值和预处理了。OpenCV 读取 BGR 格式的图像,因此我们将把色彩空间从 BGR 转换为 HSV。

为什么是 HSV 而不是 BGR 或任何其他格式?

我们使用 HSV 颜色格式,因为它对外部照明的微小变化更敏感。因此,它将提供更准确的蒙版,从而获得更好的结果。

转换色彩空间后,我们要做的是过滤掉红色通道并创建一个蒙版框。

hsv 格式的红色通道出现在 [0,230,170] 到 [255,255,220] 范围内。

cap=cv2.VideoCapture(vid_file_path)

ret,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red

while ret==True:
    ret,frame=cap.read()

    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)

    cv2.imshow("frame",resize(frame))

    cv2.imshow("mask",mask)

    key=cv2.waitKey(1)
    if key==ord('q'):
        break
cv2.waitKey(0)
cv2.destroyAllWindows()

(此图已调整大小)

5.到目前为止,我们已经创建了帧的蒙版图像,并且我们已经过滤掉了大部分噪声。接下来是获得球的边界。为此,我们将使用轮廓检测的概念。

轮廓只不过是围绕我们球的边界。值得庆幸的是,我们不必自己找到这些边界,因为 OpenCV 允许我们可以将其用于我们的目的的函数 findContours()。它需要一个蒙版图像并返回一个轮廓数组。

有关轮廓的更多信息,请访问:https://docs.opencv.org/4.5.2/d4/d73/tutorial_py_contours_begin.html

理想情况下,在我们的例子中,轮廓的值应该是 1,因为我们只有一个球,但由于有些人戴着红帽子,我们会得到不止一个。你能想出一些办法来进一步降低这种噪音吗?

为了解决这个问题,我们将使用 OpenCV 中的另一个函数 cv2.contourArea()。我们知道在蒙版图像中,球的面积最大,它的轮廓也是如此。因此,我们将得到面积最大的轮廓。

我们有球的轮廓,我们可以使用 cv2.drawContours() 函数直接绘制这些轮廓。但是对于检测任务,我们一般做的就是用一个紧密绑定的矩形来表示对象已经被检测到了。

为此,我们将使用 cv2.boundingRect() 函数。此函数将返回矩形的坐标,然后 cv2.rectangle() 函数将为我们绘制矩形。

cap=cv2.VideoCapture(vid_file_path)

ret,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red

while ret==True:
    ret,frame=cap.read()

    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)

    contours,_= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = contours[0]
         for contour in contours:
                if cv2.contourArea(contour)>cv2.contourArea(max_contour):

                      max_contour=contour

         contour=max_contour
         approx=cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True),True)
         x,y,w,h=cv2.boundingRect(approx)
         cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),4)

    cv2.imshow("frame",resize(frame))

    cv2.imshow("mask",mask)

(此图已调整大小)

6.此外,我们可以做的是同时检测球的质心。为此,我们将使用 cv2.moments。cv2.moments 计算轮廓内像素强度的加权平均总和,因此允许从斑点中获取一些更有用的信息,如其半径、质心等。

确保在使用该函数之前将图像转换为二进制格式。你可以在这里了解更多关于时刻的信息:https://docs.opencv.org/3.4/d0/d49/tutorial_moments.html

cap=cv2.VideoCapture(vid_file_path)

ret,frame=cap.read()
l_b=np.array([0,230,170])# lower hsv bound for red
u_b=np.array([255,255,220])# upper hsv bound to red

while ret==True:
    ret,frame=cap.read()

    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    mask=cv2.inRange(hsv,l_b,u_b)

    contours,_= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    max_contour = contours[0]
         for contour in contours:

                if cv2.contourArea(contour)>cv2.contourArea(max_contour):

                  max_contour = contour

         approx=cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour,True),True)
         x,y,w,h=cv2.boundingRect(approx)
         cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),4)

         M=cv2.moments(contour)

到此这篇关于开始使用 OpenCV 进行对象跟踪的文章就介绍到这了,更多相关OpenCV 对象跟踪内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • opencv3/C++关于移动对象的轮廓的跟踪详解

    使用opencv提供的背景去除算法(KNN或高斯混合模型GMM)去除背景,然后将获取的目标二值化后通过筛选目标轮廓获得目标位置. #include<opencv2/opencv.hpp> using namespace cv; //基于移动对象的轮廓的跟踪 int main() { Mat frame; bool flag = true; VideoCapture capture; capture.open(0); if (!capture.isOpened()) { printf("

  • OpenCV实现对象跟踪的方法

    介绍 OpenCV 是一个很好的处理图像和视频的工具.无论你是想让你的照片呈现 90 年代的黑白效果,还是执行复杂的数学运算,OpenCV 都可以随时为你服务. 如果你对计算机视觉感兴趣,则必须具备 OpenCV 的知识.该库包含 2500 多种优化算法,可用于执行各种任务.它被谷歌.微软.IBM 等许多行业巨头使用,并被广泛用于研究小组.该库支持多种语言,包括 java.c++ 和 python. 本文将向你展示如何使用 OpenCV 中的一些基本功能来执行复杂的对象跟踪任务. 对象跟踪 对象

  • 利用OpenCV进行对象跟踪的示例代码

    目录 OpenCV 对象跟踪 OpenCV 对象跟踪器 物体跟踪 总结 OpenCV 对象跟踪 这篇文章使用 OpenCV 中内置的八种不同的对象跟踪算法,实现对物体的跟踪. 首先,介绍一下8种跟踪算法. 然后,演示如何使用OpenCV实现这些跟踪算法. 最后,对本文做总结. OpenCV 对象跟踪器 OpenCV 八种对象跟踪器: BOOSTING Tracker:基于用于驱动 Haar 级联 (AdaBoost) 背后的机器学习的相同算法,但与 Haar 级联一样,已有十多年的历史.这个跟踪

  • 使用 OpenCV 开发虚拟键盘的方法

    目录 介绍 使用 OpenCV 实现虚拟键盘 使用 OpenCV 为虚拟键盘导入库 定义绘制函数 使用 OpenCV 的虚拟键盘主程序 自定义键盘 使用 OpenCV 的虚拟键盘的完整代码 结论 介绍 OpenCV 是最流行的计算机视觉任务库,它是用于机器学习.图像处理等的跨平台开源库,用于开发实时计算机视觉应用程序. CVzone 是一个计算机视觉包,它使用 OpenCV 和 Media Pipe 库作为其核心,使我们易于运行,例如手部跟踪.人脸检测.面部标志检测.姿势估计等,以及图像处理和其

  • 利用OpenCV实现质心跟踪算法

    目录 质心跟踪算法步骤 项目结构 使用 OpenCV 实现质心跟踪 实现对象跟踪驱动程序脚本 限制和缺点 目标跟踪的过程: 1.获取对象检测的初始集 2.为每个初始检测创建唯一的ID 3.然后在视频帧中跟踪每个对象的移动,保持唯一ID的分配 本文使用OpenCV实现质心跟踪,这是一种易于理解但高效的跟踪算法. 质心跟踪算法步骤 步骤1:接受边界框坐标并计算质心 质心跟踪算法假设我们为每一帧中的每个检测到的对象传入一组边界框 (x, y) 坐标. 这些边界框可以由任何类型的对象检测器(颜色阈值 +

  • python opencv 直方图反向投影的方法

    本文介绍了python opencv 直方图反向投影的方法,分享给大家,具体如下: 目标: 直方图反向投影 原理: 反向投影可以用来做图像分割,寻找感兴趣区间.它会输出与输入图像大小相同的图像,每一个像素值代表了输入图像上对应点属于目标对象的概率,简言之,输出图像中像素值越高的点越可能代表想要查找的目标.直方图投影经常与camshift(追踪算法)算法一起使用. 算法实现的方法,首先要为包含我们感兴趣区域的图像建立直方图(样例要找一片草坪,其他的不要).被查找的对象最好是占据整个图像(图像里全是

  • Android Studio中使用jni进行opencv开发的环境配置方法

    使用jni进行opencv开发可以快速地将PC端的opencv代码移植到手机上,但是如何在android studio下进行配置,网上几乎找不到教程,大多都是eclipse下使用mk文件的方法,找不到使用gradle的方案,摸了几天,总算是摸清楚了. 其实找对了方法,用android studio配置环境要比eclipse简单很多,首先是预先准备的环境: 1.Android studio,官网最新版,我用的是2.3.1: 2.OpenCV4Android,官网最新版,我用的3.2.0: 就这两个

  • Python OpenCV读取显示视频的方法示例

    目标 学习读取视频,显示视频和保存视频. 学习从相机捕捉并显示它. 你将学习以下功能:cv.VideoCapture(),cv.VideoWriter() 从相机中读取视频 通常情况下,我们必须用摄像机捕捉实时画面.提供了一个非常简单的界面.让我们从摄像头捕捉一段视频(我使用的是我笔记本电脑内置的网络摄像头) ,将其转换成灰度视频并显示出来.只是一个简单的任务开始. 要捕获视频,你需要创建一个 VideoCapture 对象.它的参数可以是设备索引或视频文件的名称.设备索引就是指定哪个摄像头的数

  • Python使用OPENCV的目标跟踪算法实现自动视频标注效果

    先上效果 1.首先,要使用opencv的目标跟踪算法,必须要有opencv环境 使用:opencv==4.4.0 和 opencv-contrib-python==4.4.0.46,lxml   这三个环境包. 也可以使用以下方法进行下载 : pip install opencv-python==4.4.0 pip install opencv-contrib-python==4.4.0.4 pip install lxml 2.使用方法: (1):英文状态下的 "s" 是进行标注 (

  • django获取ajax的post复杂对象的实现方法

    一.django的request中post对象为空(即获取不到前台ajax传送的post对象) 1.将django的setting中的django.middleware.csrf.CsrfViewMiddleware注释即可. 2.或在from中添加{% csrf %},后台接受的方法上加语法糖:@csrf_exempt,注意添加引用模块 3.若以上操作后还是不行,则将form标签中的action属性去掉(这里只是针对ajax处理,非表单提交) 二.对于ajax的复杂对象,例如[{"id&quo

  • PowerShell中文件对象的属性方法总结

    本文介绍一个PowerShell中文件对象有哪些属性,知道了这些属性对于我们更好的对文件进行操作是非常重要的. PowerShell是一个面向对象的脚本语言,在PowerShell中,所有的都是对象,文件也是对象.既然是对象,那肯定有属性.PowerShell中的文件对象,其实就是.NET中的System.IO.FileInfo类的实例.我们要查看完整的PowerShell文件对象的属性,其实不需要去翻MSDN,然后把System.IO.FileInfo类的属性找出来,那样太麻烦了,而且貌似在P

随机推荐