本文将展示如何使用 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()。它需要一个蒙版图像并返回一个轮廓数组。 whaosoft aiot http://143ai.com

有关轮廓的更多信息,请访问: 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\)
cx=int\(M\['m10'\]//M\['m00'\]\)
cy=int\(M\['m01'\]//M\['m00'\]\)
cv2.circle\(frame, \(cx,cy\), 3,\(255,0,0\),\-1\)
    cv2.imshow\("frame",resize\(frame\)\)  cv2.imshow\("mask",mask\)  key=cv2.waitKey\(1\)  if key==ord\('q'\):  break
cv2.waitKey\(0\)
cv2.destroyAllWindows\(\)  

OpenCV~对象跟踪相关推荐

  1. opencv实现对象跟踪_如何使用opencv跟踪对象的距离和角度

    opencv实现对象跟踪 介绍 (Introduction) Tracking the distance and angle of an object has many practical uses, ...

  2. OpenCV 实时对象跟踪(质心跟踪)

    本文章先介绍对象跟踪过程,考虑对象跟踪的特点决定使用:质心跟踪算法,然后会一步一步说明质心跟踪算法的实现:最后是如何用python代码实现. 实验效果如下: 对象跟踪过程 进行一组初始的对象检测(如: ...

  3. Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取

    Java OpenCV 图像处理30 视频分析和对象跟踪 视频读取 Java OpenCV-4.0.0 图像处理 视频分析和对象跟踪 视频读取 package com.xu.opencv.video; ...

  4. Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景

    Java OpenCV 图像处理32.4 视频分析和对象跟踪 切换背景 方法 含义 解释 bitwise_and "与"操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制 ...

  5. OpenCV视频分析与对象跟踪实战教程-贾志刚-专题视频课程

    OpenCV视频分析与对象跟踪实战教程-1957人已学习 课程介绍         OpenCV视频分析与对象跟踪实战视频培训课程概况:基于OpenCV新版本3.2 从基本的OpenCV视频读写与摄像 ...

  6. 目标跟踪(7)使用 OpenCV 进行简单的对象跟踪

    1.简述 目标跟踪的过程是: 1.获取对象检测的初始集(例如边界框坐标的输入集) 2.为每个初始检测创建唯一的ID 3.然后跟踪每一个在视频中移动的对象,保持唯一ID的分配 此外,对象跟踪允许我们为每 ...

  7. 使用 OpenCV 进行对象跟踪的几种算法解读

    使用 OpenCV 进行对象跟踪--算法 在本节中,我们将深入研究不同的跟踪算法.目标不是对每个跟踪器有深入的理论理解,而是从实践的角度理解它们. 让我首先解释跟踪背后的一些一般原则.在跟踪中,我们的 ...

  8. OpenCV连续自适应跟踪算法CAMShift实现视频对象跟踪

    1.概述 案例:使用OpenCV的CAMShift算法实现视频中对象跟踪 算法API介绍: 本文福利,莬费领取Qt开发学习资料包.技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,Q ...

  9. OpenCV视频分析与对象跟踪C++(二)光流对象跟踪-稀疏光流、稠密光流

    移动对象跟踪三要素:图像表示(跟踪的对象要在图像中出现)外光模型,移动模型. 稀疏光流跟踪,KTL void calcOpticalFlowPyrLK( // 稀疏光流跟踪,KLTInputArray ...

最新文章

  1. mac 使用homebrew 安装mysql
  2. 【效率】程序员救星,又一 VS Code 插件神器面世!
  3. id文件夹怎样传入服务器,服务器id怎么设置
  4. leetcode162. 寻找峰值(二分法)
  5. perl模块net mysql_Perl模块实例化DBI Forks“Mysql服务器已经消失”
  6. 归一化灰度直方图 Matlab
  7. 详解: Spark 相对于MapReduce的优势(为什么MapReduce性能不理想)
  8. 部分iPhone13 系统有bug
  9. centos7下扩充swap空间
  10. 一般试卷的纸张大小是多少_考试试卷统一设置标准规格要求
  11. 开放大学建筑构造计算机考试试题,国家开放大学电大专科《建筑构造》2021期末试题及答案(试卷号:2345)...
  12. Java实习日记(2-1)
  13. windows虚机设定永久静态路由
  14. 这篇文章来自我的微信朋友圈,并不特别好玩,但可以给创业者补点财务知识
  15. plsql连接远程数据库时报ORA-01017:用户名、口令无效;登录被拒绝
  16. 20-Django REST framework-Serializer序列化器
  17. PSPACE完全性学习笔记
  18. elasticsearch 条件去重_Elasticsearch7.* + SpringBoot2.*根据中文和拼音分页去重搜索-Go语言中文社区...
  19. Sql2005安装错误:1406
  20. 面向5G移动通信的新型多址接入技术-SCMA

热门文章

  1. Django 2.0 官方中文文档终于发布啦! 附链接!
  2. Unity 插件使用笔记
  3. JAVA设计模式之单例模式详细分析(全)
  4. html在线记事本,5分钟教你制作漂亮的Html5本地记事本
  5. Volcano plot | 别再问我这为什么是火山图 (在线轻松绘制)
  6. 在线教育项目Day04--后台管理系统集成方案vue-element-admin
  7. 在线html代码测试工具,CodePen - 一个在线的前端代码编辑工具(可用于制作测试页面、代码调试)...
  8. 中国家庭追踪调查(CFPS)数据区县码
  9. 如何判断一个单元格是否为合并单元格
  10. Matlab 数值计算—积分