英语原文共 14 页,剩余内容已隐藏,支付完成后下载完整资料
2011年第24届SIBGRAPI图形、模式和图像教程会议
基于OpenCV的高层次计算机视觉
Maur ́ıcio Marengoni and Denise Stringhini
Faculdade de Computacao e Informatica
Universidade Presbiteriana Mackenzie
Sao Paulo, Brazil
dstring,mmarengoni@mackenzie.br
摘要-介绍了图像处理与计算机视觉的一些前沿课题,如主成分分析、匹配技术、机器学习技术、跟踪与光流、CUDA并行计算机视觉等。这些概念将使用openCV库来介绍,这是一个为C/C程序员提供的免费计算机视觉库,适用于Windows、Linux MacOS和android平台。这些主题将包括考虑不仅理论方面,而且有实际的例子将提出,以了解如何和何时使用它们中的任何一个。
openCV;并行计算机视觉;模式识别;计算机视觉;
- 导言
本文的内容来自于先前的一个教程,该教程在2008年版的SIBGRAPI上作为计算机视觉中使用openCV的一个入门课程提供。本文的目的是研究与模式识别、计算机视觉和并行计算机视觉相关的更高级的课题。
这里介绍的材料将涵盖基本图像处理和低水平视觉技术之外的主题,因此已经学习了计算机视觉第一门课程的学生可以提高他们的知识,一年级的研究生可以看到更具体的计算机视觉应用。学生们还将学习如何使用免费的计算机视觉库(openCV)设计这些应用程序,以及如何使用GPU中的处理器创建应用程序,GPU目前在许多计算机台式机和笔记本上都有。
我们将从本教程开始,简单回顾低层次视觉中的一些重要功能,主要是向学生介绍每个功能的openCV函数。
- 低水平视觉
本节概述了低层视觉过程中使用的一些基本功能。这些功能没有详细说明,因此建议读者在[1]、[2]、[7]查看更多背景和详细信息。
- 阈值
阈值函数是低层视觉的基本功能之一。此函数获取图像和值的阈值,并根据所使用的阈值类型计算输出图像。openCV函数为:double cvThreshold(src,res,K,max,type);
在这种情况下,src是源图像,resis resultingimage,Kis是阈值,max是源图像中期望的最大值,type定义计算输出图像的方式,如果源图像中的强度更大,则
bull;CVTHRESHBINARY: res = max, otherwise 0.
bull;CVTHRESHBINARYINV: res = 0, otherwise max.
bull;CVTHRESHTRUNC: res = max, otherwise src.
bull;CVTHRESHTOZEROINV: res = 0, otherwise src
.bull;CVTHRESHTOZERO: res = src, otherwise 0.
- 直方图
直方图是计算频率的函数。当考虑图像直方图时,计算每个亮度级别或强度范围的像素频率。它可以用于比较、分割、压缩等操作。计算直方图的openCV调用由:void cvCalcHist(src,his,add,mask)给出;
这里,src是单通道输入图像,his是为给定图像计算的直方图,addandmaskareoptionals,add by default是0,所以在计算直方图之前它会删除这些。如果将“直方图”设置为1,则直方图将为多个图像累积值。将布尔矩阵伪装为设置输入图像中应计算直方图的部分。
C、 过滤器
空间域中的过滤器过滤有多个应用,可用于平滑图像、去除噪声甚至增强转换并帮助查找边。OpenCV有两个基本函数可用于这些任务:void cvSmooth(src,res,type,p1,p2,p3,p4);void cvFilter2D(src,res,kernel,center);在这两个函数中,都可以对输入和输出的图像进行重新排序,type定义要使用的过滤器类型,它可以是:CVBLUR(平均过滤器)、cvblunoscale(总和),CVMEDIAN(中值)、CVGAUSSIAN(高斯滤波器)和cv双边(双边3x3)。参数1至4与过滤器类型有关,应在参考手册[7]中进行检查。kernelis过滤器的sk和center是用作遮罩中心的点,默认情况下它是vpoint(-1,-1)。内核可以定义为
CvMat*filt;int side = 3;
int total =256;
double kernel[]={1, 4,6,4,1,
4, 16,24,16, 4,
6, 24,36,24, 6,
4,16,24,16, 4,
1, 4, 6, 4, 1,};
...for(int i=0; ilt;side*side;i ){kernel[i]=(1./total)*kernel[i];}filt=cvCreateMatHeader(side,side,CV_64FC1);cvSetData(filt,kernel,side*8);...cvFilter2D(src,res,filt,cvPoint(-1,-1));
D、 傅里叶变换
另一种过滤图像的方法是在频域进行卷积运算。第一步是利用傅里叶变换将动物图像转换为频域,傅里叶变换本身需要一组其他操作,为了避免边界效应,源图像必须嵌入到一个较大的图像中并用零填充。openCV中用于离散傅里叶变换的调用为:
cvDFT(src,res,CV_DXT_FORWARD,complexInput-gt;height);
src是已经嵌入并填充了零的输入图像,src是转换为频域的图像。整个代码序列如下
int dft_Y, dft_X;
CvMat*fft,tmp;
IplImage*im_Real,*im_Imagi,*complexInput;
...
dft_Y=cvGetOptimalDFTSize(src-gt;height-1);
dft_X=cvGetOptimalDFTSize(src-gt;width1);
fft=cvCreateMat(dft_Y,dft_X,CV_64FC2);
im_Real=cvCreateImage(cvSize(dft_X,dft_Y),
IPL_DEPTH_64F,1);
im_Imagi=cvCreateImage(cvSize(dft_X,dft_Y),
IPL_DEPTH_64F,1);
complexInput=cvCreateImage(cvGetSize(src),
IPL_DEPTH_64F,2);
cvGetSubRect(fft,amp;tmp,cvRect(0,0,
src-gt;width,src-gt;height));
cvCopy(complexInput,amp;tmp,NULL);
if(fft-gt;cols gt; src-gt;width){
cvGetSubRect(fft,amp;tmp,cvRect(src-gt;width,
0,fft-gt;colssrc-gt;width,src-gt;height));
cvZero(amp;tmp);}
cvDFT(fft,fft,CV_DXT_FORWARD,
complexInput-gt;height);
E、 查找边
计算图像边缘的一种典型方法是查找强度级别(梯度)的局部变化。一些opencv函数用于计算这些导数并返回具有可能边界的图像
cvSobel(src, res, xorder, yorder, mask);
cvLaplace(src, res, mask);
cvCanny(src, res, low, high, mask)
cvSobelf函数计算X和/或Y方向的导数,xOrderandyOrderValues确定导数的阶数(至少其中一个应大于0且至多为2),src是输入图像(8位)和输出图像(16位),并掩盖滤波器的大小(支持的值为1、3、5和7)。CVSCHARR给出的掩码大小的特殊值,它计算3x3掩码的Scharr筛选器。vlaplace函数计算图像的二阶导数。vCannyFunction实现了canny edge detector,这是一种众所周知的查找边缘的技术。在这种方法中,如果一个像素的值高于高阈值,那么它就属于一个边缘,如果该值低于“低阈值”,则它不属于边;如果该值位于“高阈值”之间,则它属于边(如果该值连接到值高于“高阈值”的像素)。这座摩天楼和神殿很相似
F、 基本分割
分割是图像处理和计算机视觉中的一项重要操作,它将像素分成更有意义的区域,这些区域可用于识别等其他任务。图像分割有多种方法,本文将介绍三种openCV分割方法。
生长区域
区域生长方法是基于像素间的相似性,其思想是给定一个种子点(图像中的一个像素),该方法检查该种子点的邻域。如果某个邻域具有相似的强度值,则该方法将该邻域标记为来自同一区域,并将标记的像素用作新闻种子。区域生长方法在opencv中使用vfloodfill函数实现:
cvFloodFill(src,seed,value,low,high,comp,flags,mask);
通常,src是源图像,seed是方法开始区域生长过程的点,value是用于标记区域的值,low和high是邻居可以接受的属于该区域的限制,compis是一个具有区域统计特性的连接组件结构,标记为方法(连接、4或8、填充区域的相对值等)和掩码(如果提供,可以用作输出图像)定义一组参数。
背景减法
当需要分割图像以检查随时间变化的内容时,一个简单的操作称为背景减法。执行此任务有多种方法,最简单的方法就是执行图像差异。在这种情况下,allbackground将标记为0或低值,可以使用threshold函数将其设置为0。Opencv使用vabsdiff函数执行减法:cvAbsDiff(src1,src2,res);在这种情况下,src1和src2是源图像,并且给定res=|src1-src2|.
分水岭分割
分水岭算法是一种分割合并区域的方法,它首先使用强度级别来查找小区域组,然后使用掩码中的一组标记将小区域分组为具有相似属性的区域,这些属性由每个标记计算得出。分水岭方法是使用以下函数计算的:
cvWatershed(src, markers);
同样,src是输入图像,marker是一个与标记区域大小相同的图像,因此该方法可以对较小的区域进行分组并正确分割图像。
- 图像匹配
模式识别是计算机视觉中的一个领域,在这个领域中,人们可以发现给定的图像中是否有一个已知的模式。在图像中检查一个模式的可能位置的过程称为图像匹配。匹配技术是最简单的模式识别方法。本节将介绍两种不同的匹配方法:轮廓匹配和模板匹配。
- 轮廓匹配
分割后的图像由一组像素组成,每组像素代表一个区域。这种分段的数据可以转换成一种简洁的方式,方便了区域的描述,并有助于与给定的模式进行比较和匹配[8]。当考虑一个轮廓线时,一个人会把一个感兴趣的物体和它周围的一条线看作一个理想的轮廓线(尽管不一定是一条闭合线),如图1所示。等高线可以用不同的方法表示,最常用的两种表示等高线的方法是多边形和Freeman链码[1],边界可以用具有指定长度和方向的直线段的连接序列表示。这种类型的表示被称为Freeman链码,它使用4或8连接性,并且段的方向编码遵循编号代码。图2展示了这两种方法,在Freeman链代码的顶部,使用绿色标记设置起点,并在右侧设置编号代码。在底端,由多边形的角点集给出的多边形。在openCV中,轮廓通常是从二值图像中计算出来的,在二值图像中,比较容易定义对比度。用于计算等高线的函数是:
int cvFindContours(src,sto,first,header,mode, method);
输入图像src是一个二值图像,sto是一个存储位置,其中轮廓将首先被写入是序列中的第一个轮廓,headergies是要检索的对象的大小,可以是size of(CvContour)或izeof(CvChain),取决于方法,mode定义用于存储轮廓的数据结构,并且可以是: bull;CVRETREXTERNAL:只检索最外部的轮廓。
bull;CVRETRLIST:检索所有轮廓作为列表,其中第一个元素是最内部的轮廓。
bull;CVRETRCCOMP:检索所有轮廓并将其组织为两级层次结构,一个级别具有外部轮廓,另一个级别具有内部轮廓。
bull;CVRETRTREE:检索所有轮廓,并将其组织为以外部轮廓为根的树结构。方法参数与openCV在内存中存储轮廓的方式相关。有五种方法可以完成此任务:
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[235461],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。