OpenCV实现实时计算机视觉外文翻译资料

 2022-09-06 10:52:50

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


OpenCV实现实时计算机视觉

计算机视觉是一个致力于分析修改和高层次认知图像的快速增长的领域。其目的是确定在摄像机前发生了什么并用该认知控制一台电脑或机器人系统,或者是提供给人们包含更多信息的或比原来相机图片更美观的新图像。计算机视觉技术领域的应用包括视频监控、生物识别技术、汽车、摄影、电影制片、网络搜索、医药、增强现实游戏,新用户接口等。

现代摄像头能够自动调焦到人脸并在他们微笑时触发快门。光学文字识别系统帮助变换扫描件至可以被声音合成器分析或朗读的文本形式。汽车可能包括自动驾驶员辅助系统,可以帮助用户泊车或警告他们潜在的危险情况。智能视频监控在监控公共区域的安全方面发挥着越来越重要的角色。

移动设备如智能手机和平板电脑都配备了相机和更多的计算能力,计算机视觉应用的需求正在增加。这些设备已经足够智能到合并几张照片成为高分辨率的全景图,或者读取识别二维码,并和从互联网检索关于一个产品的信息。不久移动计算机视觉技术将和触摸界面一样变得无处不在。

然而计算机视觉的计算是昂贵的, 甚至一个致力于解决一个具体的问题的算法,比如全景缝合或脸部和微笑的检测,都需要大量的功率。 许多计算机视觉情景必须实时执行,这意味着单帧的处理过程应该在30 - 40毫秒内完成。这是一个非常具有挑战性的要求,特别是对移动端和嵌入式计算架构。通常会牺牲质量以换取速度。例如,全景合并算法有更多的计算时间就可以在源图像中找到更多匹配以合成高质量的图像,为满足限定的时间和计算的预算,开发人员在图片质量上有所妥协妥协或投入更多时间优化特定的硬件架构的代码。

视觉和异构并行计算

在过去,一个简单的方法来提高计算设备的性能的方法是等待装置的时钟频率提高而带来的半导体工艺的改善,当速度增加时,所有应用程序运行更快而不必修改他们和他们依赖的库。不幸的是,那些日子一去不复返了。

随着晶体管密度增加,也泄漏更多的电流,因此能源效率更低。提高能源效率已经成为一个重要的优先级。现在这一过程改进是每区域允许容纳更多的晶体管,有两个主要把的方法把他们有效利用:第一个是通过并行化:创造更多相同的单元而不是让单一的单元更快更强;第二个是通过专业化:建立特定领域的硬件加速器可以使执行一个特定类的职能更有效率。结合这两个想法的概念,单个CPU或多个CPU和各种加速器一起运行称为异构并行计算。

高级计算机视觉任务通常包含子任务,这些子任务在专用硬件架构上可以比在CPU上运行快,因为有其他子任务CPU上计算。例如, GPU(图形处理单位)是一个加速器,它现在可以像在诸如智能手机和平板电脑的移动设备上一样出现在每个桌面电脑上。第一个GPU是专门为了加速在电脑显示上形状绘图而固定的功能管道,如图1所示。GPU拥有了将彩色图像作为纹理映射的输入的能力,他们的研究结果可以共享到CPU而不是仅被发送到显示器,使用GPU进行简单的图像处理任务成为可能。

通过添加着色器使固定功能GPU部分可编程化是一个很大的进步。GPU运行程序员编写的特殊程序在表面的每个三维点和并在画布上的输出每一个已渲染的像素。 这大大扩展GPU的处理能力,而聪明的程序员开始尝试在用GPU(GPGPU)进行通用计算,利用显卡加速器完成最初没有设计的任务。GPU成为一个对完成图像处理和计算机视觉任务有用的工具。

然而,图形着色器没有提供许多有用的硬件功能如同步和原子内存操作等。 现代GPU计算语言CUDA OpenCL和DirectCompute专门设计来支持显卡硬件上的通用计算。GPU仍然不如CPU灵活,但他们执行并行流处理更有效率,越来越多数量的无显卡应用被用GPU计算语言重写。

计算机视觉是经常自然映射到GPU的任务之一。这并不是一个巧合,而是计算机视觉真正解决了计算机图形学的逆向问题。图形将场景或对象的描述变换成像素,视觉像素转换成更高级别的信息。GPU含有大量类似的处理单元,并且在执行简单相似的子程序诸如渲染或过滤像素上很高效。这样的任务通常被称为“高度并行”,因为它们很容易在GPU上高效率的并行。然而,许多任务并行化并不容易,因为它们包含后续阶段结果取决于先前阶段结果的连续段。这些串行算法在GPU上并不会高效运行,通常在CPU上更容易的编程并运行得更快。许多迭代数值优化算法和基于堆栈的树搜索算法就属于这类。

因为许多高级任务由并行和串行的子任务一起组成,所以把它的一些组件在CPU上运行,其他的在GPU上运行就可以加速整个任务。但这引入了低效率的两个来源。一个是同步性:当一个子任务取决于另一个的结果,后阶段需要等到前一个阶段的完成。另一个低效率的是在GPU和CPU之间移动数据往返的内存的花费,计算机视觉任务需要处理大量的像素,这意味着大量的数据块来回的移动。这些都是在系统上用CPU和GPU一起协作加快电脑视觉任务的关键挑战。

OpenCV库

在1998.5,英特尔将开源的计算机视觉库OpenCV作为一个研究项目开始研究。自2000年它获得了BSD可用开放源码许可后,它就很容易被获得。。OpenCV的目的是提供所需的工具来解决计算机视觉问题。它包含大量的的低级图像处理功能和高级算法如人脸检测、行人检测,特征匹配和跟踪等。这个库已经被下载超过三百万次。2010年,一个可以实现GPU加速的新模块被添加进了OpenCV。这个GPU模块涵盖了图书馆的功能的一个重要组成部分,并且现在仍在积极发展。它是使用CUDA实现的,并因此从CUDA的生态系统获得了好处,包括诸如NVIDIA的基本性能(NPP)等库。

GPU模块使用户可以在不要求GPU编程培训的情况下下受益于GPU加速。这个模块是和易于采用OpenCV的CPU版本一致的。然而,最重要的差异是内存模型。OpenCV完成了 一个叫cv::Mat的图像容器,它可以公开访问图像原始数据。在GPU模块,容器cv::gpu::GpuMat储存GPU内存中的图像数据,不提供到数据的直接访问。如果用户希望修改在GPU运行的主程序的像素数据,他们首先需要从GpuMat复制数据到Mat。

#include lt;opencv2/opencv.hppgt;

#include lt;opencv2/gpu/gpu.hppgt;

using namespace cv;

...

Mat image = imread('file.png');

gpu::GpuMat image_gpu;

image_gpu .upload(image);

gpu::GpuMat result;

gpu::threshold(image_gpu,

result, 128, CV_THRESH_BINARY);

result.download(image);

imshow('WindowName', image);

waitKey ();

在这个例子中,从一个文件中读取一个图像,然后上传到GPU内存。图像从这里开始,其结果是下载到CPU内存并显示。 在这个简单的例子里只有一个操作在图像上执行, 但几个其他的操作在没有来回传输图片的情况下可能在GPU上执行。GPU模块的使用对于熟悉OpenCV的人来说已经是很简单的了。

这个设计为用户提供了关于数据如何在CPU和GPU内存之间移动的显示控制。虽然用户必须编写一些额外的代码启用GPU,采用的方法是灵活的,允许更有效率的计算。一般来说,这是一个用 OpenCV的CPU部分研究、开发和调试openCV应用的好主意,,然后用GPU模块加速它。开发人员应该尝试不同的组合CPU和GPU处理,测量他们的定时,选择最佳执行的组合。

开发人员的另一个建议是使用CUDA GPU模块提供的异步机制。这允许同时执行数据传输,GPU处理,和CPU计算.举个例子,当相机的一个帧是由GPU处理,下一帧被上传到GPU,最小化数据传输开销,增加整体性能。

OpenCV GPU模块的性能

OpenCV的GPU模块包括大量的功能,许多都在不同的版本已经实施,如图像类型(char,短,浮动),通道数,边界外推模式等。这使它报告具体的性能数据具有挑战性。提取特征数的一个增加的难度来源是同步和传输数据的开销。这意味着为获得了大幅图片的最佳性能,在数据存在GPU上时完成很多处理。

为了帮助开发人员找出权衡,OpenCV包括在不同的参数和不同的数据集下运行GPU功能的性能基准测试套件。这提供了不同的数据集在用户的硬件上加速不同的一个详细的基准。

图2展示GPU模块的优势的一个基准。该加速是针对重度优化的CPU基线执行OpenCV的测量。OpenCV英特尔的Streaming SIMD Extensionsn(SSE) 和 Threading Building Blocks(TBB)编译以多核支持,但不是所有算法都使用它们。原始图片处理加速比已经大约平均在30个功能,高级算法的加速效果也被报道了。

GPU显示30倍加速的低级功能和10倍的高级功能是很正常的,这包括更多的开销,许多步骤与GPU并行不容易。例如,颜色转换的间隔尺寸是逐像素的,这使其易于并行化。另一方面,行人检测对于每个行人可能的的位置是并行执行的,并行的每个窗口的位置是受GPU芯片的内存限制的。

举个例子,我们从机器人操作系统(ROS)8增加了两个最初是为CPU开发的包---立体视觉测距和纹理对象发现。它们包含许多功能块和一个类层次结构。

只要是有意义的,我们转入算法到GPU。例如,OpenCV的GPU实现用立体声视觉测程法执行速成的稳健特征(SURF)关键点检测,匹配和搜索立体匹配(块匹配)。加速包是CPU / GPU的一个混合的实现。因此,视觉测程法流程加速了2.7倍,纹理对象检测加速了1.5-4倍,如图3所示。 数据传输花费并不是总算法时间的一个的重要组成部分。这个例子表明一个高级视觉应用程序仅仅取代只有几行代码,其结果有一个相当大的加速。

GPU模块的立体匹配

高分辨率视频的立体匹配搜索是一个演示了如何CPU和GPU计算重叠的要求很高的应用程序。OpenCV的GPU模块包括一个在英伟达GTX580上可以实现实时(每秒24帧)全高清分辨率立体对的执行。在立体系统中,两个摄像头安装在同一个方向。而遥远的对象的投射在每个相机的同一幅图像位置,附近的对象投射在不同的位置。这就是所谓的不一致。通过定位左照相机上的每个像素图像,其中相同的表面点投射到右边的图像,可以从差距点计算到该表面的距离。找到这些像素之间的对应的立体图像对是立体视觉的关键挑战。

整改这些图像使得这个任务更加容易。整改扭曲的图像至理想的立体模型,其中每个场景表面点投射匹配图像行。用这种方式,只有同一扫描线点需要搜索。匹配的质量由相似的小窗口像素与候选匹配的像素比较来评估。然后在正确图像的像素窗口左边图像的像素窗口最佳匹配选为相应的匹配。计算的需求明显随图像大小增加而提高,因为有更多的像素处理。 在更大的图像需要一个更大搜索半径,所以像素差异的范围也会增加。对小分辨率图像而言,CPU可能足够计算差距。然而,全高清分辨率图像只有GPU可以提供足够的处理能力。图4呈现了块匹配流程产生视差图像d(x,y),使得左图(x,y)对应于右图(x-d(x,y),y)。

就像先前描述的那样,流程首先矫正图像,然后找到最佳匹配。在一些有着小纹理的地方,例如,一块空白的墙上,计算匹配是不可靠的,所以这样的区域是可以明显被忽略在待以后处理的。预计的差异值附近对象边界变化显著,斑点过滤阶段内消除散斑噪声连续的大区域差异图像。不幸的是,斑点过滤算法需要的一个基于堆栈的深度优先搜索难以并行化,所以它是在CPU上运行的。结果使用彩色图像可以看到。所有的步骤,除了斑纹过滤都是在GPU上实现的。大多数计算密集型步骤是块匹配。英伟达GTX580加速了它使他比一个用SSE和TBB优化的英特尔四核i5-760 2.8 GHz处理器CPU实现快7倍。在这之后加速斑纹过滤成为瓶颈,花费帧处理的50%时间。

一个优雅的并行处理解决方案进行斑纹过滤是CPU与GPU并行处理。虽然GPU处理下一帧,CPU执行当前帧的斑纹过滤。这可以使用不同时的OpenCVGPU和CUDA功能。异构CPU / GPU系统了提供了7倍的加速以解决高分辨率立体通信问题,允许实时(24 fps)执行全高清分辨率性能。

融合体感

微软的KinectFusion就是一个例子,应用程序以前需要缓慢的批处理现在,当由GPU驱动,可以在交互式速度下运行。 Kinect是一个产生颜色和深度图像的相机。 只要对准Kinect设备周围,可以以惊人的保真度数字化室内场景的3 d几何构造,如图5所示。这种扫描程序的一个开源实现是基于点云库,点云库是一个OpenCV使用3 d点和体素,而不是二维像素作为基本的基元的指南。

实现KinectFusion不是一个简单的任务。Kinect不返回测量范围的所有像素,它只在连续平滑的粗糙表面可靠地工作。它返回的测量范围是嘈杂的,但根据表面形状和反射特性,噪声也是有意义的。噪声随着测量表面之间的距离也会增加。Kinec每秒生成一个新的深度帧30次。如果用户Kinect设备移动太快,算法变得困惑,不能使用范围的数据跟踪运动。但是,KinectFusio有良好的算法和巧妙的组合,并使用GPU提供的处理能力,很强劲。使一个健康的互动实现成为可行,有三个关键概念。首先,跟踪算法能够处理新的扫描数据如此之快,相机连续帧之间的移动的机

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[146952],资料为PDF文档或Word文档,PDF文档可免费转换为Word

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

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