版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数字媒体技术基础OpenCV自学材料概述和作用 第一部分OpenCV概述基础结构与操作基本OpenCV程序与示例注:本讲义中部分代码来自OpenCV样例,部分代码来自OpenCV教程基础篇,部分代码则从网上收集。OpenCV概述OpenCV是Intel开源计算机视觉库。它由一系列 C 函数和少量 C+ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 的特点拥有包括 300 多个C函数的跨平台的中、高层 API跨平台:Windows, Linux免费(FREE):无论对非商业应用和商业应用 速度快使用方便OpenCV structureCXCOREbasic structur
2、es and algoritms,XML support, drawing functionsCVImage processingand visionHighGUIGUI, Image and Video I/OMLMachine Learning algorithmsCVCamvideo stream processingThe Functionality in PicturesOpenCV的下载与安装1、下载地址 :/download/2、下的安装与配置参见 3、.NET 2003下的安装与配置参见Configuring MSVS .net 2k3Create a Win32 Consol
3、e ProjectMake it an Empty Project by selecting the box under Application SettingsA project is initially created by selecting:File - New - ProjectCreating the ProjectConfiguring MSVS .net 2k3Right Click the Source Files Folder under the project name (Tutorial in this case)Add - Add new ItemCreate the
4、 First FileSelect C+ file and give it a nameCreating a it possible to set Additional Include Directives in the C/C+ pane under the project properties.Configuring MSVS .net 2k3In order to build projects using OpenCV the required libraries and directives must be included in the projects propertiesRigh
5、t Click the name of the project and select Properties (Tutorial in this case)Open the Properties PaneConfiguring MSVS .net 2k3Under the C/C+ tab select GeneralSet Additional Include DirectivesSelect the Additional Include DirectivesAdd the full path to each of the folders which contain .h files requ
6、ired to use OpenCVBe sure to include trailing C:Program FilesOpenCVcvauxincludeC:Program FilesOpenCVcxcoreincludeC:Program FilesOpenCVcvincludeC:Program FilesOpenCVotherlibshighguiC:Program FilesOpenCVotherlibscvcaminclude Utilized DirectivesConfiguring MSVS .net 2k3Under the Linker tab select Input
7、Set Additional DependenciesSelect the Additional DependenciesC:Program FilesOpenCVlibcv.libC:Program FilesOpenCVlibcvaux.libC:Program FilesOpenCVlibcxcore.libC:Program FilesOpenCVlibcvcam.libC:Program FilesOpenCVlibhighgui.libUtilized DependenciesAdd the full path to each of the .lib files required
8、to use OpenCVBe sure to keep the paths in quotesTesting MSVS .net 2k3Now that the environment is configured it would be a good idea to test it to make sure that a program will correctly build and run.#include #include /*This will pop up a small box with Hello World as the text.*/int main( int argc,
9、char* argv ) /declare for the height and width of the image int height = 320; int width = 240; /specify the point to place the text CvPoint pt = cvPoint( height/4, width/2 ); /Create an 8 bit, 3 plane image IplImage* hw = cvCreateImage(cvSize(height, width), 8, 3); /initialize the font CvFont font;
10、cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA); /place the text on the image using the font cvPutText(hw, Hello World, pt, &font, CV_RGB(150, 0, 0) ); /create the window container cvNamedWindow(Hello World, 0); /display the image in the container cvShowImage(Hello World, hw); /hol
11、d the output windows cvWaitKey(0); return 0;The enclosed code can be cut and pasted into the in the project space to test OpenCVTesting the First ProgramTesting MSVS .net 2k3Output of ProgramThe program is built by selecting:Build - Build SolutionOr by pressing F7Building the ProgramThe program is r
12、un by selecting:Debug - Start|Start without DebuggingOr by pressing F5 or -F5Running the ProgramOpenCV 编码样式指南1、文件命名:有cv和cvaux库文件的命名必须服从于以下规则: 所有的CV库文件名前缀为cv 混合的C/C+接口头文件扩展名为 .h 纯C+接口头文件扩展名为 .hpp 实现文件扩展名为 .cpp 为了与POSIX兼容,文件名都以小写字符组成OpenCV 编码样式指南2、文件结构每个文件以BSD兼容的许可声明(模板在文件中可以找到)开头;一行最多90个字符,不包括行结束符 不使
13、用制表符 缩进为4个空格符,所以制表符应该用1-4个空格替换(依据开始列确定) 头文件必须使用保护宏,防止文件被重复包含。混合C/C+接口头文件用extern C 包含C语言定义。为了使预编译头机制在Visual C+中工作正常,源文件必须在其它头文件前包含头文件。OpenCV 编码样式指南3、命名约定OpenCV中使用大小写混合样式来标识外部函数、数据类型和类方法。宏全部使用大写字符,词间用下划线分隔。所有的外部或内部名称,若在多个文件中可见,则必须含有前缀: 外部函数使用前缀cv 内部函数使用前缀Icv 数据结构(C结构体、枚举、联合体、类)使用前缀Cv 外部或某些内部宏使用前缀CV_ 内
14、部宏使用前缀ICV_ OpenCV 编码样式指南4、函数接口设计:为了保持库的一致性,以如下方式设计接口非常重要。函数接口元素包括: 功能 名称 返回值 参数类型 参数顺序 参数默认值 函数功能必须定义良好并保持精简。函数应该容易镶入到使用其它OpenCV函数的不同处理过程。函数名称应该简单并能体现函数的功能。大多数函数名形式:cvA Simple OpenCV Program1. #include 2. #include 3. #include 4. int main( int argc, char* argv ) 5. CvPoint center;6. double scale=-3;7
15、. IplImage* image = argc=2 ? cvLoadImage(argv1) : 0;8. if(!image) return -1;9. center = cvPoint(image-width/2,image-height/2);10. for(int i=0;iheight;i+)11. for(int j=0;jwidth;j+) 12. double dx=(double)(j-center.x)/center.x;13. double dy=(double)(i-center.y)/center.y;14. double weight=exp(dx*dx+dy*d
16、y)*scale);15. uchar* ptr = &CV_IMAGE_ELEM(image,uchar,i,j*3);16. ptr0 = cvRound(ptr0*weight);17. ptr1 = cvRound(ptr1*weight);18. ptr2 = cvRound(ptr2*weight); 19. cvSaveImage(copy.png, image );20. cvNamedWindow( test, 1 );21. cvShowImage( test, image );22. cvWaitKey();23. return 0; 基本数据结构点:CvPoint 、C
17、vPoint2D32f、CvPoint3D32f 矩形框大小:CvSize 、CvSize2D32f 矩形框:CvRect 可以存放1-4个数值的数组:CvScalar 定义迭代算法的终止规则:CvTermCriteria 矩阵:CvMat 、CvMatND 、CvSparseMat IPL图像头部:IplImage 定义不确定的数组:CvArr (仅作函数参数)点数据结构CvPoint 二维坐标系下的点,类型为整型 typedef struct CvPoint int x; /* X坐标, 通常以0为基点 */int y; /* y坐标, 通常以0为基点 */CvPoint;/* 构造函数
18、*/inline CvPoint cvPoint( int x, int y );/* 从 CvPoint2D32f类型转换得来 */inline CvPoint cvPointFrom32f( CvPoint2D32f point )CvPoint2D32f :二维坐标下的点,类型为浮点CvPoint3D32f :三维坐标下的点,类型为浮点矩形框大小数据结构CvSize 矩形框大小,以像素为精度 typedef struct CvSizeint width; /* 矩形宽 */int height; /* 矩形高 */CvSize;/* 构造函数 */inline CvSize cvSize
19、( int width, int height );CvSize2D32f 矩形框数据结构CvRect 矩形框的偏移和大小 typedef struct CvRectint x; /* 方形的最左角的x-坐标 */int y; /* 方形的最上或者最下角的y-坐标 */int width; /* 宽 */int height; /* 高 */CvRect;/* 构造函数*/inline CvRect cvRect(int x, int y, int width, int height);矩阵数据结构CvMat 二维矩阵 typedef struct CvMat int type; /* CvM
20、at 标识, 元素类型和标记 */int step; /* 以字节为单位的行数据长度*/int rows; /*行数*/int cols; /*列数*/ int* refcount; /* 数据引用计数 */unionuchar* ptr;short* s;int* i;float* fl;double* db; data; /* data 指针 */ 矩阵数据结构CvMatND:多维、多通道密集数组 CvSparseMat:多维、多通道稀疏数组CvArr:不确定数组图像头数据IplImage:IPL 图像头图像头数据IplImage:IPL 图像头typedef struct _IplIma
21、ge int nSize; /* IplImage大小 */int ID; /* 版本 (=0)*/int nChannels; /* 大多数OPENCV函数支持1,2,3 或4 个通道 */int alphaChannel; /* 被OpenCV忽略 */int depth; /* 像素的位深度: IPL_DEPTH_8U,IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F 可支持 */char colorModel4; char channelSeq4; /* 被
22、OpenCV忽略 */int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.cvCreateImage只能创建交叉存取图像 */int origin; /* 0 - 顶左结构,1 - 底左结构 (BMP风格) */int align; /* 图像行排列 (4 or 8). OpenCV 用widthStep 代替 */int width; /* 图像宽像素数 */int height; /* 图像高像素数*/struct _IplROI *roi;/* 图像感兴趣区域. 当该值非空只对该区域进行处理 */struct _IplImage *maskROI; /
23、* 在 OpenCV中必须置NULL */void *imageId; /* 同上*/struct _IplTileInfo *tileInfo; /*同上*/int imageSize; /* 图像数据大小,单位字节*/char *imageData; /* 指向排列的图像数据 */int widthStep; /* 排列的图像行大小,以字节为单位 */int BorderMode4; int BorderConst4; /* 边际结束模式, 被忽略*/char *imageDataOrigin; /* 指针指向一个不同的图像数据结构,是为了纠正图像内存分配准备的 */IplImage;图像
24、头数据IplImage结构来自于 Intel Image Processing Library。OpenCV 只支持其中的一个子集: alphaChannel 在OpenCV中被忽略。colorModel 和channelSeq 被OpenCV忽略。dataOrder 必须是IPL_DATA_ORDER_PIXEL (颜色通道是交叉存取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。align 是被OpenCV忽略的,而用 widthStep 去访问后继的图像行。不支持maskROI 。处理MASK的函数把他当作一个分离的参数。MASK在 OpenCV 里是 8
25、-bit,然而在 IPL他是 1-bit。tileInfo 不支持。BorderMode和BorderConst是不支持的。OpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或 ROI的尺寸必须精确匹配。基本OpenCV操作矩阵的使用与操作GUI命令图像的使用与操作视频的使用与操作矩阵的使用与操作(1)创建矩阵 CreateMatCvMat* cvCreateMat( int rows, int cols, int type );rows 矩阵行数。 cols 矩阵列数。 type 矩阵元素类型。 通常以 CV_(S|U|F)C型式描述, 例如: CV_8UC1 意思是一个8-bi
26、t 无符号单通道矩阵, CV_32SC2 意思是一个32-bit 有符号二个通道的矩阵。 函数 cvCreateMat 为新的矩阵分配头和下面的数据,并且返回一个指向新创建的矩阵的指针。矩阵按行存贮。所有的行以4个字节对齐。删除矩阵 ReleaseMat void cvReleaseMat( CvMat* mat );例如:CvMat* M = cvCreateMat( 4, 4, CV_32FC1); cvReleaseMat( &M);矩阵的使用与操作(2)复制矩阵CloneMatCvMat* cvCloneMat( const CvMat* mat );例如: CvMat* M1 = c
27、vCreateMat( 4, 4, CV_32FC1);CvMat* M2;M2 = cvCloneMat(M1);初始化矩阵方法1:用cvMat初始化 double a = 1, 2, 3, 4,5, 6, 7, 8,9, 10, 11, 12 ; CvMat Ma = cvMat( 3, 4, CV_64FC1, a);方法2:用cvCreateMatHeader初始化 CvMat Ma; cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a);初始化单位矩阵CvMat* M = cvCreateMat( 4, 4, CV_32FC1);cvSetIdentity
28、(M);矩阵的使用与操作(3)访问矩阵元素(1)直接访问cvmSet(M, i, j, 2, 0); /Set M(i,j)t = cvmGet(M, i, j); /Get M(i,j)(2)已知对齐方式的直接访问CvMat* M = cvCreateMat( 4, 4, CV_32FC1); int n = M-cols;float *data = M-data.fl;datai*n+j = 3.0; /假设32位对齐(3)未知对齐方式的直接访问CvMat* M = cvCreateMat( 4, 4, CV_32FC1); int step = M-step/sizeof(float);
29、float *data = M-data.fl;(data + i*step)j = 3.0;(4)直接访问一个已初始化的矩阵Mai*4 + j = 2.0;矩阵的使用与操作(4)矩阵间的操作CvMat *Ma, *Mb, *Mc;cvAdd(Ma, Mb, Mc); /Ma + Mb - MccvSub(Ma, Mb, Mc); /Ma - Mb - MccvMatMul(Ma, Mb, Mc); /Ma * Mb - Mc矩阵元素间的操作cvMul(Ma, Mb, Mc); /Ma. * Mb - MccvDiv(Ma, Mb, Mc); /Ma. / Mb - MccvAddS(Ma,
30、cvScalar(-10.0), Mc); /Ma. -10 - Mc单个矩阵的操作cvTranspose(Ma, Mb); /transpose(Ma) - MbCvScalar t=cvTrace(Ma); /trace(Ma) -t.val0double d = cvDet(Ma); /det(Ma) -dcvInvert(Ma, Mb); /inv(Ma) -Mb矩阵的使用与操作(5)向量乘法假设Va, Vb, Vc均为n元素向量double res = cvDotProduct(&Va, &Vb); /Va Vb - rescvCrossProduct(&Va, &Vb , &Vc)
31、; / Va Vb - Vc矩阵特征值分解假设A, E均为n*n方阵,I为n元素向量cvEigenVV(&A, &E , &I); SVD 假设A, U, D, V均为n*n方阵cvSVD(A, D, U, V, CV_SVD_U_T| CV_SVD_V_T); /A=UDVT标志使U和V以转置方式返回非齐次线性系统的求解假设A为n*n方阵,x,b均为n元素向量cvSolve(&A, &b, &x)矩阵的使用与操作:示例(1)#include cv.h#include highgui.h#include void PrintMat(CvMat *A); / 显示矩阵void Test_Mult
32、iply(); / 测试矩阵乘法void Test_DCT(); / 计算DCT变换int main() Test_Multiply(); Test_DCT(); return 0;矩阵的使用与操作:示例(2)void PrintMat(CvMat* A) / 显示矩阵int i,j;for(i=0;irows;i+) printf(n); switch( CV_MAT_DEPTH(A-type) ) case CV_32F: case CV_64F: for(j=0; jcols; j+) printf(%9.3f , (float) cvGetReal2D( A, i, j ); brea
33、k; case CV_8U: case CV_16U: for(j=0;jcols;j+) printf(%6d,(int)cvGetReal2D( A, i, j ); break; default: break; printf(n);矩阵的使用与操作:示例(3)void Test_Multiply()/ Test matrix multiply double a = 1, 2, 3, 4,5, 6, 7, 8, 9, 10, 11, 12 ; double b = 1, 5, 9, 2, 6, 10, 3, 7, 11, 4, 8, 12 ; double c9; CvMat Ma, Mb
34、, Mc; printf(n= Test multiply =); cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a, CV_AUTOSTEP ); cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b, CV_AUTOSTEP ); cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP ); cvMatMulAdd( &Ma, &Mb, 0, &Mc ); PrintMat(&Ma); PrintMat(&Mb); PrintMat(&Mc); return;矩阵的使用与操作:示例(4
35、)void Test_DCT()/ test 1-d and 2-d dct transform float data = 1, 2, 3, 4, 5, 6, 7, 8 ; CvMat a; a = cvMat(2,4,CV_32FC1,data); printf(n= Test DCT =); printf(nOriginal matrix = ); PrintMat(&a); cvDCT(&a, &a, CV_DXT_FORWARD); printf(n2-D DCT = ); PrintMat(&a); cvDCT(&a, &a, CV_DXT_INVERSE); printf(n2-D
36、 IDCT = ); PrintMat(&a);Discrete Cosine Transform(DCT)Transform kernel of two-dimensional DCT iswhereClearly, the kernel for the DCT is both separable and symmetric, and hence the DCT may be implemented as a series of one dimensional DCTs.Discrete Cosine Transform(DCT)Forward transform and Inverse t
37、ransformwhere u, v, x, y = 0, 1, 2, , N-1Transform Matrix of DCTwhere:Example of DCTDCT的几点说明DCT变换避免了复数运算。由于图像矩阵是实数矩阵,那么它的DCT也是实数DCT是正交变换,其变换矩阵是正交阵,变换核是可分离的。DCT有快速算法DCT与IDCT具有相同的变换核,因此具有相同的变换矩阵,即正变换与逆变换公用同一个算法模块DCT具有更强的信息集中能力,能将最多的信息放到最小的系数上去。HighGUI操作Smart windowsImage I/O, renderingProcessing keybo
38、ard and other events, timeoutsTrackbarsMouse callbacksVideo I/OWindowscvNamedWindow(window_name, fixed_size_flag)cvNamedWindow(window_name, x, y)cvDestroyWindow(window_name)creates window accessed by its name. Window handles repaint, resize events. Its position is remembered in registry.cvNamedWindo
39、w(ViewA,1);cvMoveWindow(ViewA,300,100);cvDestroyWindow(ViewA);cvShowImage(window_name, image);copies the image to window buffer, then repaints it when necessary. 8u|16s|32s|32fC1|3|4 are supported.only the whole window contents can be modified. Dynamic updates of parts of the window are done using o
40、perations on images, drawing functions etc.Windows等待按键cvWaitKeyint cvWaitKey( int delay=0 )如果delay=0, 则无限等待,则等待delay毫秒则返回在程序循环中,有时候由于程序一直处于计算中,窗口无法重新恢复(如读出视频中的所有帧并显示),可以加入cvWaitKey,使之等待几毫秒,让窗口完成重新绘制再执行其他操作图像的使用与操作(1)创建头并分配数据 CreateImageIplImage* cvCreateImage( CvSize size, int depth, int channels );
41、size:图像宽、高. depth:图像元素的位深度,IPL_DEPTH_8U|8S|16U|16S|32S|32F|64F channels:每个元素(像素)的颜色通道数量.可以是 1, 2, 3 或 4.释放头和图像数据 ReleaseImagevoid cvReleaseImage( IplImage* image );复制图像 CloneImageIplImage* cvCloneImage( const IplImage* image );图像的使用与操作(2)头分配CreateImageHeaderIplImage* cvCreateImageHeader( CvSize size
42、, int depth, int channels )初始化被用图分配的图像头 InitImageHeaderIplImage* cvInitImageHeader( IplImage* image, CvSize size, int depth,int channels, int origin=0, int align=4 );origin IPL_ORIGIN_TL 或 IPL_ORIGIN_BL. align 图像行排列, 典型的 4 或 8 字节. 函数 cvInitImageHeader 初始化图像头结构, 指向用户指定的图像并且返回这个指针。释放头 ReleaseImageHead
43、ervoid cvReleaseImageHeader( IplImage* image );程序示例:Create image#include cv.h#include highgui.h #include int main() IplImage *cvImg; / image used for visualisationCvSize imgSize; / size of visualisation imageint i = 0, j = 0;imgSize.width = 640; imgSize.height = 480; cvImg = cvCreateImage( imgSize,
44、8, 1 ); / creation of a 8 bits depth gray imagefor ( i = 0; i imgSize.width; i+ ) / image is filled with gray values corresponding for ( j = 0; j imageData + cvImg-widthStep*j)i = ( char ) ( ( i * j ) % 256 );cvNamedWindow( Testing OpenCV., 1 ); / creation of a visualisation windowcvShowImage( Testi
45、ng OpenCV., cvImg ); / image visualisationcvWaitKey( 0 ); / wait for keycvDestroyWindow( image ); / close windowcvReleaseImage( &cvImg ); / memory release return( 0 ); / stopping the program程序示例:Create image图像的使用与操作(3)从文件读图像cvLoadImageIplImage* cvLoadImage(char* , int flag=1)OpenCV支持的图像格式:BMP、DIB、JP
46、G、PNG、PBM、PGM、PPM、SR、RAS和TIFF写图像到文件cvSaveImageIplImage* cvSaveImage(char* , IplImage* img)图像转换cvConvertImage(IplImage* src, IplImage* dst, int flags=0); /灰度图彩色图cvCvtColor(IplImage* src, IplImage* dst, int code); /彩色图彩色图/灰度图Code=CV_2:,=RGB,BGR,GRAY,HSV,YCrCb,XYZ,Luv,HLS 图像装载与显示示例#include cv.h#include
47、 highgui.h#include / in the images directorychar name0 = images/example.bmp;/ in the images directorychar name1 = images/example.jpg;图像装载与显示示例int main() IplImage* img0 = NULL;IplImage* img1 = NULL;img0 = cvLoadImage( name0, -1 );img1 = cvLoadImage( name1, -1 );cvNamedWindow( image0, 1 );cvNamedWindo
48、w( image1, 1 );cvShowImage( image0, img0 );cvShowImage( image1, img1 );cvWaitKey(0); / wait for key to close the windowscvReleaseImage( &img0 );cvReleaseImage( &img1 );return(0);图像处理函数cvSub( img0, img1, res, 0 ) subtract img0 from img1 and store the result in res休息第二部分基本视频操作OpenCV的动态结构及操作基于OpenCV的图像
49、/视频处理(6个示例)基于OpenCV的研究与开发:DEMO视频的使用和操作(1)打开摄像头CvCapture* cvCaptureFromCAM(camera_id=0);打开文件CvCapture* cvCaptureFromFile(video);CvCapture* cvCaptureFromAVI(inflie.avi);捕捉某一帧 cvGrabFrame(capture) /抓住一帧,为快速遍历视频帧 IplImage* img=cvRetrieveImage(capture);/把Grab的帧取出,或 IplImage* cvQueryFrame(capture);释放捕捉源cv
50、ReleaseCapture(&capture);视频的使用和操作(2)保存视频文件typedef struct CvVideoWriter; CvVideoWriter* cvCreateVideoWriter( const char* , int fourcc, double fps, CvSize frame_size, int is_color=1 );int cvWriteFrame( CvVideoWriter* writer, const IplImage* image );void cvReleaseVideoWriter( CvVideoWriter* writer );获取
51、/设置视频帧信息cvGetCaptureProperty(capture, property_id);cvSetCaptureProperty(capture, property_id, value);CV_CAP_PROP_POS_MSEC - video capture timestampCV_CAP_PROP_POS_FRAMES - 0-based index of the frame CV_CAP_PROP_POS_AVI_RATIO - relative position of video(0-start, 1-end)CV_CAP_PROP_FRAME_WIDTH - width
52、 of frames in the video streamCV_CAP_PROP_FRAME_HEIGHT - height of frames in the video streamCV_CAP_PROP_FPS - frame rateCV_CAP_PROP_FOURCC - 4-character code of codec CV_CAP_PROP_FRAME_COUNT - number of frames in video file视频操作示例(1)功能:从摄像头或者AVI文件中得到视频流,对视频流进行边缘检测,并输出结果。主要思想:获取视频( cvCaptureFromCAM 或
53、cvCaptureFromAVI)循环处理每帧( cvQueryFrame )将多通道数组分割为多个单通道数组(cvCvtPixToPlan)在每个通道内进行Laplace变换( cvLaplace),计算图像的边缘信息恢复多通道图像( cvCvtPlaneToPix )并显示Laplace变换Laplace变换:工程数学中常用的一种积分变换。普拉斯变换的存在性:关于一个函数f(t)的拉普拉斯变换,只有在拉普拉斯积分是收敛的情况下才存在。也就是说, f(t)必须是在对于t0的每一个有限区间内都是片断性连续的,且当t趋于无穷大的时候, f(t)是指数阶地变化。拉普拉斯变换的重大意义在于:将一个信
54、号从时域上,转换为复频域(s域)上来表示Laplace变换void cvLaplace(const CvArr *src, CvArr * dst, int aperture_size=0)1、用Sobel算子计算图像二阶x和y的差分src:输入图像;dst:输出图像;xorder:x方向的差分阶数;yorder:y方向的差分阶数2、按如下公式求和对aperture_size=1则给出最快计算结果,相当于对每个图像采用如下内核做卷积视频操作示例(1)#include cv.h#include highgui.h#include #include int main( int argc, char
55、* argv ) IplImage* laplace = 0; IplImage* colorlaplace = 0; IplImage* planes3 = 0, 0, 0 ; / 多个图像面 CvCapture* capture = 0;If(argc=1|(argc=2& strlen(argv1) = 1&isdigit(argv10) capture = cvCaptureFromCAM(argc = 2 ? argv10 - 0 : 0 ); else if( argc = 2 ) capture = cvCaptureFromAVI( argv1 ); if( !capture
56、) fprintf(stderr,Could not initialize capturing.n); return -1; 视频操作示例(2) cvNamedWindow( Laplacian, 0 ); for(;) / 循环捕捉,直到用户按键跳出循环体 IplImage* frame = 0; int I; frame = cvQueryFrame( capture ); if( !frame ) break; if( !laplace ) for( i = 0; i width,frame-height),8,1); laplace = cvCreateImage( cvSize(fr
57、ame-width,frame-height), IPL_DEPTH_16S, 1 ); /存放单通道Laplace结果 colorlaplace = cvCreateImage( cvSize(frame-width,frame-height), 8, 3 ); /存放多通道Laplace结果 cvCvtPixToPlane( frame, planes0, planes1, planes2, 0 );/将多通道/数组分割为多个单通道数组 for( i = 0; i origin = frame-origin; cvShowImage(Laplacian, colorlaplace ); i
58、f( cvWaitKey(10) = 0 ) break; cvReleaseCapture( &capture ); cvDestroyWindow(Laplacian); return 0;OpenCV的动态结构及操作动态结构内存存储序列集合与稀疏矩阵数据保存配置文件动态结构:when 2d array is not enoughThe sample task: collect the locations of all non-zero pixels in the image.Where to store the locations? Possible solutions:Allocate
59、 array of maximum size (sizeof(CvPoint)*width*height a huge value)Use two-pass algorithmUse list or similar data structure (Any other ideas?)/ construct sequence of non-zero pixel locationsCvSeq* get_non_zeros( const IplImage* img, CvMemStorage* storage ) CvSeq* seq = cvCreateSeq( CV_32SC2, sizeof(C
60、vSeq), sizeof(CvPoint), storage ); for( int i = 0; i height; i+ ) for( int j = 0; j width; j+ ) if( CV_IMAGE_ELEM(img, uchar, i, j) ) CvPoint pt=j,i; cvSeqPush( seq, &pt ); return seq; /CvSeq:定义非固定元素的序列内存管理Memory storage is a linked list of memory blocks.Functions to remember: cvCreateMemStorage(blo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电池制造中的人力资源管理与招聘培训考核试卷
- 海水淡化处理中的关键装备与材料考核试卷
- 植物油加工中的产品研发与创新考核试卷
- 仪器仪表制造业的品牌推广与传播考核试卷
- 区块链在教育中的应用考核试卷
- 春节团圆安全生产的领航者考核试卷
- DB11∕T 1767-2020 再生水利用指南 第1部分:工业
- 黄色梅花课件教学课件
- 谈心交流课件教学课件
- 淮阴工学院《理财规划》2022-2023学年第一学期期末试卷
- 船舶租赁尽职调查
- 统编教学小学语文课外阅读《细菌世界历险记》导读课课件
- 植物生理学-植物的逆境生理
- 【课件】比的基本性质
- 小学英语人教新起点五年级上册Unit3Animalsunit3storytime
- 2023年江苏省淮安市中考化学试卷
- 医疗质量管理与持续改进工作记录
- 小学英语名师工作室工作计划2篇
- 中国旅游嘉兴风土人情城市介绍旅游攻略PPT图文课件
- 出口退税培训课件
- 校外培训机构消防演练方案(精选10篇)
评论
0/150
提交评论