2、“…”符号表示代码有某些细节被省略(代码来源于真实项目)
import org.opencv.highgui.Highgui
import org.opencv.imgproc.*
import java.awt.image.BufferedImage
import java.awt.image.DataBufferByte
import javax.imageio.ImageIO
import org.opencv.core.CvException
import org.opencv.core.CvType
import org.opencv.core.Mat
1、注释中出现注重符“•”表示其所针对的代码行中出现的常量及其计算表达式在实际应用中应取自或依赖于预设的配置文件,因为这些定义都是根据当前应用场景得到的试验结果,为了程序能够适应不同的需求或拥有良好扩展特性,比较好的方式便是做到运行参数可配置。
2、“…”符号表示代码有某些细节被省略(代码来源于真实项目)import org.opencv.highgui.Highguiimport org.opencv.imgproc.*import java.awt.image.BufferedImageimport java.awt.image.DataBufferByteimport javax.imageio.ImageIOimport org.opencv.core.CvExceptionimport org.opencv.core.CvTypeimport org.opencv.core.Mat
在这篇文章中,我们将介绍如何使用通过 MultiTracker 类实现的 OpenCV 的多对象跟踪 API。我们将共享C++ 和 Python 代码。
大多数计算机视觉和机器学习的初学者都学习对象检测。如果您是初学者,您可能会想为什么我们需要对象跟踪。我们不能只检测每一帧中的对象吗?
让我们来探究一下跟踪是有用的几个原因。
首先,当在视频帧中检测到多个对象(例如人)时,跟踪有助于跨帧建立对象的身份。
其次,在某些情况下,对象检测可能会失败,但仍可能跟踪对象,因为跟踪考虑了对象在前一帧中的位置和外观。
第三,一些跟踪算法非常快,因为它们做的是局部搜索,而不是全局搜索。因此,我们可以通过每n帧进行目标检测,并在中间帧中跟踪目标,从而为我们的系统获得很高的帧率。
那么,为什么不在第一次检测后无限期地跟踪对象呢?跟踪算法有时可能会丢失它正在跟踪的对象。例如,当对象的运动太大时,跟踪算法可能跟不上。许多现实世界的应用程序同时使用检测和跟踪。
在本教程中,我们只关注跟踪部分。我们想要跟踪的对象将通过拖动它们周围的包围框来指定。
OpenCV 中的 MultiTracker 类提供了多目标跟踪的实现。它是一个简单的实现,因为它独立处理跟踪对象,而不对跟踪对象进行任何优化。
让我们逐步查看代码,了解如何使用 OpenCV 的多目标跟踪 API。
2.1 第 1 步:创建单一对象跟踪器
多目标跟踪器只是单目标跟踪器的集合。我们首先定义一个函数,该函数接受一个跟踪器类型作为输入,并创建一个跟踪器对象。OpenCV有8种不同的跟踪器类型:BOOSTING, MIL, KCF,TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT。
如果您想使用 GOTURN 跟踪器,请务必阅读这篇文章并下载 caffe 模型。
在下面的代码中,给定跟踪器类的名称,我们返回跟踪器对象。这将在稍后用于多目标跟踪器。
Python
C++
2.2 第 2 步:读取视频的第一帧
多目标跟踪器需要两个输入
给定这些信息,跟踪器在所有后续帧中跟踪这些指定对象的位置。 在下面的代码中,我们首先使用 VideoCapture 类加载视频并读取第一帧。这将在稍后用于初始化 MultiTracker。
Python
C++
2.3 第 3 步:在第一帧中定位对象
接下来,我们需要在第一帧中定位我们想要跟踪的对象。该位置只是一个边界框。 OpenCV 提供了一个名为 selectROI 的函数,该函数会d出一个 GUI 来选择边界框(也称为感兴趣区域 (ROI))。 在 C++ 版本中,selectROI 允许您获取多个边界框,但在 Python 版本中,它只返回一个边界框。所以,在 Python 版本中,我们需要一个循环来获取多个边界框。 对于每个对象,我们还选择一种随机颜色来显示边界框。 代码如下所示。
Python
C++
getRandomColors 函数相当简单
2.4 第 3 步:初始化 MultiTracker
到目前为止,我们已经读取了第一帧并获得了对象周围的边界框。这就是我们初始化多目标跟踪器所需的所有信息。
我们首先创建一个 MultiTracker 对象,并向其中添加与边界框一样多的单个对象跟踪器。在此示例中,我们使用 CSRT 单对象跟踪器,但您可以通过将下面的 trackerType 变量更改为本文开头提到的 8 个跟踪器之一来尝试其他跟踪器类型。 CSRT 跟踪器不是最快的,但在我们尝试的许多情况下它产生了最好的结果。
您还可以使用包裹在同一个 MultiTracker 中的不同跟踪器,但当然,这没什么意义。
MultiTracker 类只是这些单个对象跟踪器的包装器。正如我们从上一篇文章中知道的那样,单个对象跟踪器是使用第一帧初始化的,并且边界框指示我们想要跟踪的对象的位置。 MultiTracker 将此信息传递给它在内部包装的单个对象跟踪器。
Python
C++
2.5 第 4 步:更新 MultiTracker 并显示结果
最后,我们的 MultiTracker 已准备就绪,我们可以在新帧中跟踪多个对象。我们使用 MultiTracker 类的 update 方法来定位新框架中的对象。每个跟踪对象的每个边界框都使用不同的颜色绘制。
Python
C++
C++
Python
直接对每个像素点判断即可,src是图像
IplImage* src
CvScalar s
for(int i = 0i <src->heighti++)
{
for(int j = 0j <src->widthj++)
{
s = cvGet2D(src,i,j)// 获得像素值
if(s.val[0]<50&&s.val[1]<50&&s.val[2]>200)
//注意这里的012对应的是bgr,范围的意思是防止光线的明暗影响,可以适当放宽,另外你也可以选择其他的颜色空间,可以直接取消明暗影响,比如HSV
{
s.val[0]=0
s.val[1]=0
s.val[2]=255
} //如果满足条件就设置为红色
else
{
s.val[0]=0
s.val[1]=0
s.val[2]=0
} //如果不满足就设置为黑色
cvSet2D(src,i,j,s) //设置像素
}
}
cvNamedWindow( "image", 1 )
cvShowImage("image",src) //显示出来
另外你说的定位是什么意思,是不是说像车牌那样做一个矩形框框起来?我这做过一个车牌定位的,如果是的话我可以发给你!或者把代码贴出来
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)