学习对象跟踪外文翻译资料

 2022-08-06 14:28:25

英语原文共 384 页,剩余内容已隐藏,支付完成后下载完整资料


学习对象跟踪

在前一章中,我们学习了视频监控、背景建模和形态学图像处理。我们讨论了如何使用不同的形态学算子对输入图像应用冷视觉效果。在本章中,我们将学习如何在实时视频中跟踪对象。我们将讨论可用于跟踪它的对象的不同特性。我们还将学习不同的目标跟踪方法和技术。目标跟踪广泛应用于机器人、自动驾驶汽车、车辆跟踪、运动中的球员跟踪和视频压缩。

在本章结束时,您将了解以下内容:

  • 如何跟踪特定颜色的对象什么是帧差分?
  • 如何构建交互式对象跟踪器
  • 什么是转角检测器
  • 如何检测好的特征进行跟踪
  • 如何建立基于光流的特征跟踪器

技术要求

本章要求熟悉C 编程语言的基本知识。本章中使用的所有代码都可以从以下GitHub链接下载:

https://github.com/PackPublishing/Learn-OpenCV-4-By-Building-Projects-Second-Edition/tree/master/Chapter_09。这段代码可以在任何操作系统上执行,尽管它只在Ubuntu上测试过。

查证以下视频以查看正在运行的代码:

http://bit.ly/2SidbMc

跟踪特定颜色的对象

为了建立一个好的目标跟踪器,我们需要了解什么特征可以用来使我们的跟踪稳健和准确。所以,让我们朝着这个方向迈出一小步,看看我们能否利用色彩空间信息来设计出一个好的视觉跟踪器。要记住的一件事是颜色信息对光照条件敏感。在实际的应用程序中,您将不得不做一些预处理来处理这个问题。但现在,让我们假设其他人在做这件事,我们得到的是干净的彩色图像。

有许多不同的颜色空间,选择一个好的颜色空间将取决于用户使用的不同应用程序。虽然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

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。