个人整理的opencv最基本入门资料.pdf
《个人整理的opencv最基本入门资料.pdf》由会员分享,可在线阅读,更多相关《个人整理的opencv最基本入门资料.pdf(7页珍藏版)》请在冰点文库上搜索。
Opencv资料-ByMocoSun2010.12.191.简介简介OpenCV的全称是:
OpenSourceComputerVisionLibrary,Intel公司支持的开源计算机视觉库,采用c/c+编写,可以运行在linux/windows/mac等操作系统上。
Opencv还提供了python、ruby、matlab以及其他语言的接口。
其目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的计算机视觉相关应用程序。
Opencv包含的函数有500多个,覆盖了如工厂产品检测、医学成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等,具体将在下面介绍。
Opencv使用宽松的BSD开源协议,在遵守协议的情况下,允许生成商业产品,不必开发源代码。
Opencv利用了IPP(高性能多媒体函数库)高度手工优化,且在inter处理器上有更高的运行速度。
最新版本最新版本:
2.2,项目网址http:
/OpenCV:
opencv-extension-library:
扩展,http:
/opencv,底层还是c,http:
/opencv2.0的结构:
2.Opencv例子例子2.1显示图像Opencv可以读取各种类型的图像,包括BMP,DIB,JPEG,JPE,PNG,PBM,PGM,PPM,SR,RAS,TIFF等,下面程序显示了如何加载一幅图像并在屏幕上显示出来。
显示结果如图1所示。
程序程序11:
从:
从文件中读取一幅图像并在屏幕上显示文件中读取一幅图像并在屏幕上显示#includehighgui.hintmain(intargc,char*argv)if(argcImageData后才能进行操作,不然它仅仅相当一个指针存在)以一个图像创建,自定义方式创建,cvCreateImage();或者通过拷贝创建,cvCloneImage(),这时两个图像的属性就自动一样了,或者通过cvLoadImage()从磁盘读入,或者从视频读入一帧图像cvQueryFrame,后两者也不需人工设定图像属性。
应该注意,使用cvCreateImage()创建空白图像时,记得用cvSetZero()等函数初始化,不然图像不是全白色的。
cvNamedWindow(Example,CV_WINDOW_AUTOSIZE);创建一个窗口,用“Example”标识,也是窗口标题栏上显示的名称,第二个参数定义了窗口的属性。
该参数可以省略,默认是1,宏定义为CV_WINDOW_AUTOSIZE,自动根据图像的大小调整窗口大小,2.0目前只支持一个值。
小贴士小贴士这里无法自由指定窗口的大小,因为这涉及了图像的缩放方法,opencv2.0暂时没有支持这个功能,不过可以通过创建另外尺寸的一幅图像,使用cvResize函数,将需要改变的图像变化到该幅图像上,这个函数可以选择实现插值的方法。
也有另外一个函数cvResizeWindow是调整窗口大小,不过它只是简单地截取了一个窗口的一部分,其他部分不会显示。
cvShowImage(Example,image);这个函数作用是在窗口”Example”中显示我们读入的image这幅图像。
第一个参数是constchar*name型,表示窗口的名称,第二个参数是constCvArr*image型。
这里的CvArr其实上是这样定义的typedefvoidCvArr,它的作用是作为一个函数参数,指定了一个函数可以接受多种类型的参数,比如IplImage,还有矩阵结构体CvMat,或者点序列CvSeq。
cvWaitKey(0);比较方便的函数,它的功能是使程序暂停,当参数是0或负数时,只有当用户触发一个按键时,程序才继续向下运行,当参数是正整数时,表示暂停一段时间,单位是毫秒。
函数返回值是一个int,是用户按键的ASK2码的整数值。
小贴士小贴士cvWaitKey还有另外一个用处是让出CPU的计算时间,在读取视频中我们经常会使用一个循环,在循环里面读取图像,这时如果不使用cvWaitKey函数的话,窗口显示的内容会一直不变的,这跟线程间的调度有关。
cvReleaseImage(&image);cvDestroyWindow(Example);最后两句作用是释放图像所占的内存,释放为窗口所分配的所有内存(包括窗口内部的图像内存缓冲区,该缓冲区中保存了与图像指针相关的图像文件像素信息的一个副本)。
2.2访问图像数据我们通常需要对图像数据进行迅速而高效的访问,我们可以直接读取Iplimage结构体的内容,下面这个例子展示了这个过程。
图2是对图像像素值都增加了10后得到的结果。
程序程序22:
访问图像数据,使所有像素值增加访问图像数据,使所有像素值增加1010#includehighgui.hintmain(intargc,char*argv)/读入一张图片IplImage*image=cvLoadImage(lena.jpg);if(NULL=image)/如果读入失败,退出程序exit
(1);/创建一个窗口,标题为ExamplecvNamedWindow(Example,CV_WINDOW_AUTOSIZE);/用指针指向图像的数据区头部uchar*pchar;intwidth=image-width;/读取图像宽度intheigh=image-height;/读取图像高度intchannel=image-nChannels;/读取图像通道数intwidthStep=image-widthStep;/读取图像一行像素所占的字节数inti,j;for(i=0;iimageData+i*widthStep;for(j=0;jimageData是用交错形式存放图像的各个通道的数值的,如下图所示。
图3图像像素排列方式可以通过cvCvtColor()进行图像空间的转换,如RGB或BGR到灰度(反过来有Bayer到彩色),HSV与RGB互相转换等等,比较方便。
图像图像一行字节数一行字节数widthStep:
这个容易跟图像宽度width混淆,遍历时如果在计算每一行开始的地址时用width去乘以行序号容易出错,这是因为为了处理过程高效,每行像素都会用固定的字节数来对齐,因此在第i行末和第i+1行开始出可能会有补齐字节(见图3)。
小贴士小贴士除了自行定位像素的位置外,Opencv还提供了一些函数,可以方便地取得或者设置矩阵元素或者图像中像素的值。
如下DoublecvGetReal1D(constCvArr*arr,intidx0)DoublecvGetReal2D(constCvArr*arr,intidx0,intidx1)voidcvSetReal1D(constCvArr*arr,intidx0,doublevalue)voidcvSetReal2D(constCvArr*arr,intidx0,intidx1,doublevalue)CvScalarcvGet1D(constCvArr*arr,intidx0)CvScalarcvGet1D(constCvArr*arr,intidx0,intidx1)voidcvSet1D(constCvArr*arr,intidx0,CvScalarvalue)voidcvSet2D(constCvArr*arr,intidx0,intidx1,CvScalarvalue)其中CvScalar是一个三个double组成结构体,表示一个像素。
3.参考资料参考资料参考书籍:
参考书籍:
Learningopencv,作者:
GaryBradski,AdrianKaehler,东南大学出版社学习OpenCV中文版,译者:
于仕琪刘瑞祯,清华大学出版社OpenCV中文教程,刘瑞祯于仕琪,北京航空航天大学出版社互联网资料:
互联网资料:
Opencv中文网站http:
/:
提供基本的opencv参考、例程,还可以互动提问(论坛)维基百科(英文):
http:
/en.wikipedia.org/wiki/Main_Page,海纳百川,很多知识的整理。
雅虎GROUPS:
http:
/开源项目网址:
http:
/Opencv支持的功能描述支持的功能描述图像数据操作(内存分配与释放,图像复制、设定和转换)图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出)矩阵/向量数据操作及线性代数运算(矩阵乘积、矩阵方程求解、特征值、奇异值分解)支持多种动态数据结构(链表、队列、数据集、树、图)基本图像处理(去噪、边缘检测、角点检测、采样与插值、色彩变换、形态学处理、直方图、图像金字塔结构)结构分析(连通域/分支、轮廓处理、距离转换、图像矩、模板匹配、霍夫变换、多项式逼近、曲线拟合、椭圆拟合、狄劳尼三角化)摄像头定标(寻找和跟踪定标模式、参数定标、基本矩阵估计、单应矩阵估计、立体视觉匹配)运动分析(光流、动作分割、目标跟踪)目标识别(特征方法、HMM模型)基本的GUI(显示图像/视频、键盘/鼠标操作、滑动条)图像标注(直线、曲线、多边形、文本标注)