英语原文共 384 页,剩余内容已隐藏,支付完成后下载完整资料
学习对象跟踪
在前一章中,我们学习了视频监控、背景建模和形态学图像处理。我们讨论了如何使用不同的形态学算子对输入图像应用冷视觉效果。在本章中,我们将学习如何在实时视频中跟踪对象。我们将讨论可用于跟踪它的对象的不同特性。我们还将学习不同的目标跟踪方法和技术。目标跟踪广泛应用于机器人、自动驾驶汽车、车辆跟踪、运动中的球员跟踪和视频压缩。
在本章结束时,您将了解以下内容:
- 如何跟踪特定颜色的对象什么是帧差分?
- 如何构建交互式对象跟踪器
- 什么是转角检测器
- 如何检测好的特征进行跟踪
- 如何建立基于光流的特征跟踪器
技术要求
本章要求熟悉C 编程语言的基本知识。本章中使用的所有代码都可以从以下GitHub链接下载:
https://github.com/PackPublishing/Learn-OpenCV-4-By-Building-Projects-Second-Edition/tree/master/Chapter_09。这段代码可以在任何操作系统上执行,尽管它只在Ubuntu上测试过。
查证以下视频以查看正在运行的代码:
跟踪特定颜色的对象
为了建立一个好的目标跟踪器,我们需要了解什么特征可以用来使我们的跟踪稳健和准确。所以,让我们朝着这个方向迈出一小步,看看我们能否利用色彩空间信息来设计出一个好的视觉跟踪器。要记住的一件事是颜色信息对光照条件敏感。在实际的应用程序中,您将不得不做一些预处理来处理这个问题。但现在,让我们假设其他人在做这件事,我们得到的是干净的彩色图像。
有许多不同的颜色空间,选择一个好的颜色空间将取决于用户使用的不同应用程序。虽然RGB是计算机屏幕上的本地表示,但它不一定适合人类。当涉及到人类时,我们根据颜色的色调更自然地给颜色命名,这就是为什么色调饱和度值(HSV)可能是信息量最大的颜色空间之一。它与我们对颜色的感知紧密相关。色调是指颜色的光谱,饱和度是指特定颜色的强度,值是指像素的亮度。这实际上是用圆柱形格式表示的。你可以找到一个简单的例子在
http://infohost.nmt.edu/tcc/help/pubs/colortheory/web/hsv.html上。我们可以将图像的像素移到1--ISV颜色空间,然后使用该颜色空间来测量该颜色空间中的距离,并使用该空间中的阈值来跟踪给定的对象。
考虑视频中的以下帧:
如果您通过颜色空间过滤器运行它并跟踪对象,您将看到如下内容:
正如我们在这里看到的,我们的跟踪器根据颜色特征识别视频中的特定对象。为了使用这个跟踪器,我们需要知道目标物体的颜色分布。下面是跟踪彩色对象的代码,它只选择具有特定色调的像素。代码注释得很好,所以请阅读每个术语的解释以了解发生了什么:
int main (int argc,char* argv[ ])
{
//变量声明和初始化
//迭代直到用户按下Esc键
while (true)
{
//每次迭代前初始化输出图像
outputImage = Scalar (0,0,0);
//捕获当前帧
cap gt;gt; frame;
//检查当前帧是否为空
if (frame.empty() )
break;
//调整帧的大小 resize(frame,frame,Size(),scalingFactor,scalingFactor,INTER_AREA);
//转换为HSV颜色空间
cvtColor(frame, hsvImage, COLOR_BGR2HSV);
//定义HSV颜色空间中“蓝色”的范围
Scalar lowerLimit = Scalar(60,100,100);
Scalar upperLimit = Scalar(180,255,255);
//设置HSV图像的阈值以仅获得蓝色
inRange(hsvImage,lowerLimit,upperLimit,mask);
//按位计算输入图像和掩码的和
bitwise_and(frame,frame,outputImage,mask=mask);
//输出经过中值滤波器使结果更平滑
medianBlur(outputImage,5);
//显示输入输出图像
imshow(“Input”,frame);
imshow(“Output”,outputImage);
//获取键盘输入并检查是否为“ESC”
//30-gt;等待30毫秒
//27-gt;ESC键的ASCII值
ch = waitKey(30);
if (ch == 27) {
break;
}
}
return 1;
}
构建交互式对象跟踪器
基于颜色空间的跟踪器让我们可以自由地跟踪一个彩色对象,但我们也被限制在一个预定义的颜色。如果我们只是想随机选取一个对象呢?我们如何构建可以了解所选对象特征并自动跟踪它的对象跟踪器?因此提出了连续自适应均值偏移(CAMShift)算法。它基本上是Meanshift算法的改进版本。
Meanshift的概念实际上很简单。假设我们选择一个感兴趣的区域,我们希望我们的对象跟踪器跟踪该对象。在该区域中,我们根据颜色直方图选择一组点,计算出空间点的质心。如果质心位于这个区域的中心,我们就知道物体没有移动。但是如果质心不在这个区域的中心,我们就知道物体在往某个方向运动。质心的移动控制对象的移动方向。因此,我们将对象的边界框移动到一个新位置,以便新的质心成为该边界框的中心。因此,这种算法被称为meanshift,因为mean(质心)是移位的。这样,我们就可以随时更新对象的当前位置。
但是meanshift的问题是不允许改变边界框的大小。当你将物体从相机移开时,在人眼看来,物体会显得更小,但meanshift不会考虑这一点。在整个跟踪阶段,边界框的大小将保持不变。因此,我们需要使用CAMShift。CAMShift的优点是可以根据对象的大小调整边界框的大小。除此之外,它还可以跟踪对象的方向。
让我们考虑下面的框架,在该框架中对象将高亮显示:
现在我们已经选择了对象,算法计算直方图反投影并提取所有信息。什么是直方图反投影呢?这只是一种识别图像与直方图模型匹配程度的方法。我们计算特定事物的直方图模型,然后使用该模型在图像中找到该事物。让我们移动对象,看看它是如何被跟踪的:
看起来目标被追踪得相当好。让我们更改方向并查看目标是否能够继续被跟踪:
如我们所见,边界椭圆改变了它的位置和方向。让我们更改对象的透视图,看看是否仍然能够跟踪它:
可以发现结果还不错!边界椭圆更改了纵横比,以反映对象现在看起来倾斜的事实(因为透视变换)。让我们看看代码中的用户界面功能:
Mat image;
Point originPoint;
Rect selectedRect;
bool selectRegion = false;
int trackingFlag = 0;
//跟踪鼠标事件的函数
void onMouse (int event,int x,int y,int,void*)
{
if (selectRegion)
{
selectedRect.x = MIN (x,originPoint.x);
selectedRect.y = MIN (y,originPoint.y);
selectedRect.width = std::abs(x – originPoint.x);
selectedRect.height = std::abs(y – originPoint.y);
selectedRect amp; = Rect(0,0,image.cols,image.rows);
}
switch (event)
{
case EVENT_LBUTTONDOWN:
originPoint = Point (x,y);
selectedRect = Rect (x,y,0,0);
selectRegion = true;
break;
case EVENT_LBUTTONUP:
selectRegion = false;
if (selectedRect.width gt; 0 amp;amp; selectedRect.height gt; 0)
{
trackingFlag = -1;
}
break;
}
}
此函数的功能是捕获在窗口中选定的矩形的基本坐标。用户只需用鼠标点击并拖动。OpenCV中有一组内置函数可以帮助我们检测这些不同的鼠标事件。
下面是基于CAMShift进行目标跟踪的代码:
int main (int argc,char* argv [ ])
{
//变量声明和初始化
hellip;.
//迭代直到用户按下Esc键
while (true)
{
//捕获当前帧
cap gt;gt; frame;
//检查当前帧是否为空
if (frame.empty())
break;
//调整帧的大小
resize (frame,frame,Size(),scalingFactor,scalingFactor,INTER_AREA);
//复制输入帧
frame.copyTo (image);
//转换为HSV颜色空间
cvtColor (image,hsvImage,COLOR_BGR2HSV);
我们现在有HSV图像等待处理。我们来看看如何使用阈值来处理此图像:
if (trackingFlag)
{
//检查hsvimage中所有在指定范围内的值
//并将结果放入mask中
inRange(hsvImage,Scalar(0,minSaturation,minValue),Scalar(180,256)
//混合指定的通道
int channels [] = [0,0];
hueImage.create(hsvImage.size(),hsvImage.depyh());
mixChannels(amp;hsvImage,1,amp;hueImage,1,channels,1);
if (trackingFlag lt; 0)
{
/
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[253844],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。