OpenCV入门必读

上传人:gu****n 文档编号:61279422 上传时间:2022-03-11 格式:DOC 页数:32 大小:623.50KB
收藏 版权申诉 举报 下载
OpenCV入门必读_第1页
第1页 / 共32页
OpenCV入门必读_第2页
第2页 / 共32页
OpenCV入门必读_第3页
第3页 / 共32页
资源描述:

《OpenCV入门必读》由会员分享,可在线阅读,更多相关《OpenCV入门必读(32页珍藏版)》请在装配图网上搜索。

1、OpenCV入门必读 摘要:本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。 目录 [隐藏] · 1 一、简介 o 1.1 1、OpenCV的特点 § 1.1.1 (1) 总体描述 § 1.1.2 (2) 功能 § 1.1.3 (3) OpenCV模块 o 1.2 2、有用的学习资源 § 1.2.1 (1) 参考手册: § 1.2.2 (2) 网络资源: § 1.2.3 (3) 书籍: § 1.2.4 (4) 视频处理例程(在 /samples/c

2、/): § 1.2.5 (5) 图像处理例程 (在 /samples/c/): o 1.3 3、OpenCV 命名规则 § 1.3.1 (1) 函数名: § 1.3.2 (2) 矩阵数据类型: § 1.3.3 (3) 图像数据类型: § 1.3.4 (4) 头文件: o 1.4 4、编译建议 § 1.4.1 (1) Linux: § 1.4.2 (2) Windows: o 1.5 5、C例程 · 2 二、GUI 指令 o 2.1 1、窗口管理 § 2.1.1 (1) 创建和定位一个新窗口: § 2.1.2 (2) 载入图像: §

3、 2.1.3 (3) 显示图像: § 2.1.4 (4) 关闭窗口: § 2.1.5 (5) 改变窗口大小: o 2.2 2、输入处理 § 2.2.1 (1) 处理鼠标事件: § 2.2.2 (2) 处理键盘事件: § 2.2.3 (3) 处理滑动条事件: · 3 三、OpenCV的基本数据结构 o 3.1 1、图像数据结构 § 3.1.1 (1) IPL 图像: o 3.2 2、矩阵与向量 § 3.2.1 (1) 矩阵: § 3.2.2 (2) 一般矩阵: § 3.2.3 (3) 标量: o 3.3 3、其它结构类型 § 3.3.1 (1) 点: §

4、 3.3.2 (2) 矩形框大小(以像素为精度): § 3.3.3 (3) 矩形框的偏置和大小: · 4 四、图像处理 o 4.1 1、图像的内存分配与释放 § 4.1.1 (1) 分配内存给一幅新图像: § 4.1.2 (2) 释放图像: § 4.1.3 (3) 复制图像: § 4.1.4 (4) 设置/获取感兴趣区域ROI: § 4.1.5 (5) 设置/获取感兴趣通道COI: o 4.2 2、图像读写 § 4.2.1 (1) 从文件中读入图像: § 4.2.2 (2) 保存图像: o 4.3 3、访问图像像素 § 4.3.1 (1) 假设你要访问第k通道

5、、第i行、第j列的像素。 § 4.3.2 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) § 4.3.3 (3) 直接访问: (效率高,但容易出错) § 4.3.4 (4) 基于指针的直接访问: (简单高效) § 4.3.5 (5) 基于 c++ wrapper 的直接访问: (更简单高效) o 4.4 4、图像转换 § 4.4.1 (1) 字节型图像的灰度-彩色转换: § 4.4.2 (2) 彩色图像->灰度图像: § 4.4.3 (3) 不同彩色空间之间的转换: o 4.5 5、绘图指令 § 4.5.1 (1) 绘制矩形: § 4.5.2 (2) 绘

6、制圆形: § 4.5.3 (3) 绘制线段: § 4.5.4 (4) 绘制一组线段: § 4.5.5 (5) 绘制一组填充颜色的多边形: § 4.5.6 (6) 文本标注: · 5 五、矩阵处理 o 5.1 1、矩阵的内存分配与释放 § 5.1.1 (1) 总体上: § 5.1.2 (2) 为新矩阵分配内存: § 5.1.3 (3) 释放矩阵内存: § 5.1.4 (4) 复制矩阵: § 5.1.5 (5) 初始化矩阵: § 5.1.6 (6) 初始化矩阵为单位矩阵: o 5.2 2、访问矩阵元素 § 5.2.1 (1) 假设需要访问一个2D浮点型矩阵的第(i

7、, j)个单元. § 5.2.2 (2) 间接访问: § 5.2.3 (3) 直接访问(假设矩阵数据按4字节行对齐): § 5.2.4 (4) 直接访问(当数据的行对齐可能存在间隙时 possible alignment gaps): § 5.2.5 (5) 对于初始化后的矩阵进行直接访问: o 5.3 3、矩阵/向量运算 § 5.3.1 (1) 矩阵之间的运算: § 5.3.2 (2) 矩阵之间的元素级运算: § 5.3.3 (3) 向量乘积: § 5.3.4 (4) 单一矩阵的运算: § 5.3.5 (5) 非齐次线性方程求解: § 5.3.6 (6) 特征值与特征

8、向量 (矩阵为方阵): · 6 六、视频处理 o 6.1 1、从视频流中捕捉一帧画面 § 6.1.1 (1) OpenCV 支持从摄像头或视频文件(AVI格式)中捕捉帧画面. § 6.1.2 (2) 初始化一个摄像头捕捉器: § 6.1.3 (3) 初始化一个视频文件捕捉器: § 6.1.4 (4) 捕捉一帧画面: § 6.1.5 (5) 释放视频流捕捉器: o 6.2 2、获取/设置视频流信息 § 6.2.1 (1) 获取视频流设备信息: § 6.2.2 (2) 获取帧图信息: § 6.2.3 (3) 设置从视频文件抓取的第一帧画面的位置: o 6.3 3、保存

9、视频文件 § 6.3.1 (1) 初始化视频编写器: § 6.3.2 (2) 保持视频文件: § 6.3.3 (3) 释放视频编写器: [编辑] 一、简介 [编辑] 1、OpenCV的特点 [编辑] (1) 总体描述 · OpenCV是一个基于C/C++语言的开源图像处理函数库 · 其代码都经过优化,可用于实时处理图像 · 具有良好的可移植性 · 可以进行图像/视频载入、保存和采集的常规操作 · 具有低级和高级的应用程序接口(API) · 提供了面向Intel IPP高效多媒体函数库的接口,可针对你使用的Intel CPU优化代码,提高程序性能(译注:

10、OpenCV 2.0版的代码已显着优化,无需IPP来提升性能,故2.0版不再提供IPP接口) [编辑] (2) 功能 · 图像数据操作(内存分配与释放,图像复制、设定和转换) Image data manipulation (allocation, release, copying, setting, conversion). · 图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出) Image and video I/O (file and camera based input, image/video file output). · 矩阵/向量数据操

11、作及线性代数运算(矩阵乘积、矩阵方程求解、特征值、奇异值分解) Matrix and vector manipulation and linear algebra routines (products, solvers, eigenvalues, SVD). · 支持多种动态数据结构(链表、队列、数据集、树、图) Various dynamic data structures (lists, queues, sets, trees, graphs). · 基本图像处理(去噪、边缘检测、角点检测、采样与插值、色彩变换、形态学处理、直方图、图像金字塔结构) Basic imag

12、e processing (filtering, edge detection, corner detection, sampling and interpolation, color conversion, morphological operations, histograms, image pyramids). · 结构分析(连通域/分支、轮廓处理、距离转换、图像矩、模板匹配、霍夫变换、多项式逼近、曲线拟合、椭圆拟合、狄劳尼三角化) Structural analysis (connected components, contour processing, distance tr

13、ansform, various moments, template matching, Hough transform, polygonal approximation, line fitting, ellipse fitting, Delaunay triangulation). · 摄像头定标(寻找和跟踪定标模式、参数定标、基本矩阵估计、单应矩阵估计、立体视觉匹配) Camera calibration (finding and tracking calibration patterns, calibration, fundamental matrix estimation, h

14、omography estimation, stereo correspondence). · 运动分析(光流、动作分割、目标跟踪) Motion analysis (optical flow, motion segmentation, tracking). · 目标识别(特征方法、HMM模型) Object recognition (eigen-methods, HMM). · 基本的GUI(显示图像/视频、键盘/鼠标操作、滑动条) Basic GUI (display image/video, keyboard and mouse handling, scroll-

15、bars). · 图像标注(直线、曲线、多边形、文本标注) Image labeling (line, conic, polygon, text drawing) [编辑] (3) OpenCV模块 · cv – 核心函数库 · cvaux – 辅助函数库 · cxcore – 数据结构与线性代数库 · highgui – GUI函数库 · ml – 机器学习函数库 [编辑] 2、有用的学习资源 [编辑] (1) 参考手册: · /docs/index.htm (译注:在你的OpenCV安装目录内)

16、 [编辑] (2) 网络资源: · 官方网站: · 软件下载: [编辑] (3) 书籍: · Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). chenyusiyuan: 补充以下书籍 · Learning OpenCV - Computer Vision with the OpenCV Library by Gary Bradski & Adrian

17、Kaehler, O'Reilly Media, 1 st ed. (September, 2008). · OpenCV教程——基础篇 作者:刘瑞祯 于仕琪,北京航空航天大学出版社,出版日期:200706 [编辑] (4) 视频处理例程(在 /samples/c/): · 颜色跟踪: camshiftdemo · 点跟踪: lkdemo · 动作分割: motempl · 边缘检测: laplace [编辑] (5) 图像处理例程 (在 /samples/c/): · 边缘检测: edge · 图像分

18、割: pyramid_segmentation · 形态学: morphology · 直方图: demhist · 距离变换: distrans · 椭圆拟合: fitellipse [编辑] 3、OpenCV 命名规则 [编辑] (1) 函数名: cvActionTargetMod(...) Action = 核心功能(core functionality) (e.g. set, create) Target = 目标图像区域(target image area) (e.g. contour, polygon) Mod =

19、(可选的)调整语(optional modifiers) (e.g. argument type) [编辑] (2) 矩阵数据类型: CV_(S|U|F)C S = 符号整型 U = 无符号整型 F = 浮点型 E.g.: CV_8UC1 是指一个8位无符号整型单通道矩阵, CV_32FC2是指一个32位浮点型双通道矩阵. [编辑] (3) 图像数据类型: IPL_DEPTH_(S|U|F) E.g.: IPL_

20、DEPTH_8U 图像像素数据是8位无符号整型. IPL_DEPTH_32F图像像素数据是32位浮点型. [编辑] (4) 头文件: #include #include #include #include #include // 一般不需要,cv.h 内已包含该头文件 [编辑] 4、编译建议 [编辑] (1) Linux: g++ hello-world.cpp -o hello-world \ -I /us

21、r/local/include/opencv -L /usr/local/lib \ -lm -lcv -lhighgui -lcvaux [编辑] (2) Windows: 在Visual Studio的‘选项’和‘项目’中设置好OpenCV相关文件的路径。 [编辑] 5、C例程 //////////////////////////////////////////////////////////////////////// // // hello-world.cpp // // 该程序从文件中读入一幅图像,将之反色,然后显示出来. // //////

22、////////////////////////////////////////////////////////////////// #include #include #include #include #include   int main(int argc, char *argv[]) { IplImage* img = 0; int height,width,step,channels; uchar *data; int i,j,k;  

23、 if(argc<2){ printf("Usage: main \n\7"); exit(0); }   // load an image img=cvLoadImage(argv[1]); if(!img){ printf("Could not load image file: %s\n",argv[1]); exit(0); }   // get the image data height = img->height; width = im

24、g->width; step = img->widthStep; channels = img->nChannels; data = (uchar *)img->imageData; printf("Processing a %dx%d image with %d channels\n",height,width,channels);   // create a window cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin", 100,

25、100);   // invert the image // 相当于 cvNot(img); for(i=0;i

26、ease the image cvReleaseImage(&img ); return 0; } [编辑] 二、GUI 指令 [编辑] 1、窗口管理 [编辑] (1) 创建和定位一个新窗口: cvNamedWindow("win1", CV_WINDOW_AUTOSIZE); cvMoveWindow("win1", 100, 100); // offset from the UL corner of the screen [编辑] (2) 载入图像: IplImage* img=0; img=cvLoadImage(fileName

27、); if(!img) printf("Could not load image file: %s\n",fileName); [编辑] (3) 显示图像: cvShowImage("win1",img); 该函数可以显示彩色或灰度的字节型/浮点型图像。字节型图像像素值范围为[0-255];浮点型图像像素值范围为[0-1]。彩色图像的三色元素按BGR(蓝-红-绿)顺序存储。 [编辑] (4) 关闭窗口: cvDestroyWindow("win1"); [编辑] (5) 改变窗口大小: cvResizeWindow("win1",100,100); // new w

28、idth/heigh in pixels [编辑] 2、输入处理 [编辑] (1) 处理鼠标事件: · 定义一个鼠标处理程序: void mouseHandler(int event, int x, int y, int flags, void* param) { switch(event){ case CV_EVENT_LBUTTONDOWN: if(flags & CV_EVENT_FLAG_CTRLKEY) printf("Left button down with CTRL pressed\n");

29、 break;   case CV_EVENT_LBUTTONUP: printf("Left button up\n"); break; } } x,y: 相对于左上角的像素坐标 event: CV_EVENT_LBUTTONDOWN, CV_EVENT_RBUTTONDOWN, CV_EVENT_MBUTTONDOWN, CV_EVENT_LBUTTONUP, CV_EVENT_RBUTTONUP, CV_EVENT_MBUTTONUP,

30、 CV_EVENT_LBUTTONDBLCLK, CV_EVENT_RBUTTONDBLCLK, CV_EVENT_MBUTTONDBLCLK, CV_EVENT_MOUSEMOVE: flags: CV_EVENT_FLAG_CTRLKEY, CV_EVENT_FLAG_SHIFTKEY, CV_EVENT_FLAG_ALTKEY, CV_EVENT_FLAG_LBUTTON, CV_EVENT_FLAG_RBUTTON, CV_EVENT_FLAG_MBUTTON · 注册该事件处理程序: mouseParam=5; cvSe

31、tMouseCallback("win1",mouseHandler,&mouseParam); [编辑] (2) 处理键盘事件: · 实际上对于键盘输入并没有专门的事件处理程序. · 按一定间隔检测键盘输入(适用于循环体中): int key; key=cvWaitKey(10); // wait 10ms for input · 中止程序等待键盘输入: int key; key=cvWaitKey(0); // wait indefinitely for input · 键盘输入的循环处理程序: while(1){ key=cvWaitKey

32、(10); if(key==27) break;   switch(key){ case 'h': ... break; case 'i': ... break; } } [编辑] (3) 处理滑动条事件: · 定义一个滑动条处理程序: void trackbarHandler(int pos) { printf("Trackbar position: %d\n",pos); } · 注册该事件处理程序: int tr

33、ackbarVal=25; int maxVal=100; cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler); · 获取当前的滑动条位置: int pos = cvGetTrackbarPos("bar1","win1"); · 设置滑动条位置: cvSetTrackbarPos("bar1", "win1", 25); [编辑] 三、OpenCV的基本数据结构 (译注:OpenCV 1.1、1.2或2.0版本中各数据结构的结构体元素有所调整,以下仅作参考)

34、[编辑] 1、图像数据结构 [编辑] (1) IPL 图像: IplImage |-- int nChannels; // 颜色通道数目 (1,2,3,4) |-- int depth; // 像素的位深: | // IPL_DEPTH_8U, IPL_DEPTH_8S, | // IPL_DEPTH_16U,IPL_DEPTH_16S, | // IPL_DEPTH_32S,I

35、PL_DEPTH_32F, | // IPL_DEPTH_64F |-- int width; // 图像宽度(像素为单位) |-- int height; // 图像高度 |-- char* imageData; // 图像数据指针 | // 注意彩色图像按BGR顺序存储数据 |-- int dataOrder; // 0 - 将像素点不同通道的值交错排在一起,形成单一像素平面 |

36、 // 1 - 把所有像素同通道值排在一起,形成若干个通道平面,再把平面排列起来 | // cvCreateImage 只能创建像素交错排列式的图像 |-- int origin; // 0 – 像素原点为左上角, | // 1 – 像素原点为左下角 (Windows bitmaps style) |-- int widthStep; // 相邻行的同列点之间的字节数 |-- int imageSize; // 图像的大小(

37、字节为单位) = height*widthStep |-- struct _IplROI *roi;// 图像的感兴趣区域(ROI). ROI非空时对图像的 | // 处理仅限于ROI区域. |-- char *imageDataOrigin; // 图像数据未对齐时的数据原点指针 | // (需要正确地重新分配图像内存 ) | // (needed for correct image deallocation) |

38、-- int align; // 图像数据的行对齐: 4 or 8 byte alignment | // OpenCV 中无此项,采用widthStep代替 |-- char colorModel[4]; // 颜色模型 – OpenCV中忽略此项 [编辑] 2、矩阵与向量 [编辑] (1) 矩阵: CvMat // 2D 矩阵 |-- int type; // 元素类型 (uchar,short,int,float,double) 与标

39、志 |-- int step; // 整行长度字节数 |-- int rows, cols; // 行、列数 |-- int height, width; // 矩阵高度、宽度,与rows、cols对应 |-- union data; |-- uchar* ptr; // data pointer for an unsigned char matrix |-- short* s; // data pointer for a short matrix |-- int*

40、 i; // data pointer for an integer matrix |-- float* fl; // data pointer for a float matrix |-- double* db; // data pointer for a double matrix CvMatND // N-维矩阵 |-- int type; // 元素类型 (uchar,short,int,float,double) 与标志 |-- int dim

41、s; // 矩阵维数 |-- union data; | |-- uchar* ptr; // data pointer for an unsigned char matrix | |-- short* s; // data pointer for a short matrix | |-- int* i; // data pointer for an integer matrix | |-- float* fl; // data pointer for a float matr

42、ix | |-- double* db; // data pointer for a double matrix | |-- struct dim[]; // 各维信息 |-- size; // 元素数目 |-- step; // 元素间距(字节为单位) CvSparseMat // N-维稀疏矩阵 [编辑] (2) 一般矩阵: CvArr* // 仅作为函数定义的参数使用, // 表明函数可以接受不同类型的矩阵作为参数,

43、 // 例如:IplImage*, CvMat* 甚至是 CvSeq*. // 矩阵的类型通过矩阵头的前4个字节信息来确定 [编辑] (3) 标量: CvScalar |-- double val[4]; //4D 向量 初始化函数: CvScalar s = cvScalar(double val0, double val1=0, double val2=0, double val3=0); // Example: CvScalar s = cvScalar(20.0); s.val[0]=20.0; 注意该初始化函数的函数名

44、与对应的结构体名称几乎同名,差别仅在于函数名第一个字母是小写的,而结构体名第一个字母是大写的。它并不是一个 C++ 构造函数。(译注:类似的还有 cvMat 与 CvMat、cvPoint 与 CvPoint 等等) [编辑] 3、其它结构类型 [编辑] (1) 点: CvPoint p = cvPoint(int x, int y); CvPoint2D32f p = cvPoint2D32f(float x, float y); CvPoint3D32f p = cvPoint3D32f(float x, float y, float z); //E.g.:

45、 p.x=5.0; p.y=5.0; [编辑] (2) 矩形框大小(以像素为精度): CvSize r = cvSize(int width, int height); CvSize2D32f r = cvSize2D32f(float width, float height); [编辑] (3) 矩形框的偏置和大小: CvRect r = cvRect(int x, int y, int width, int height); [编辑] 四、图像处理 [编辑] 1、图像的内存分配与释放 [编辑] (1) 分配内存给一幅新图像: I

46、plImage* cvCreateImage(CvSize size, int depth, int channels); size: cvSize(width,height); depth: 像素深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F channels: 像素通道数. Can be 1, 2, 3 or 4. 各通道是交错排列的. 一幅彩色图像的数据排列格式如下: b0 g0 r0 b1 g1

47、r1 ... 示例: // Allocate a 1-channel byte image IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);   // Allocate a 3-channel float image IplImage* img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); [编辑] (2) 释放图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); c

48、vReleaseImage(&img); [编辑] (3) 复制图像: IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage* img2; img2=cvCloneImage(img1); // 注意通过cvCloneImage得到的图像 // 也要用 cvReleaseImage 释放,否则容易产生内存泄漏 [编辑] (4) 设置/获取感兴趣区域ROI: void cvSetImageROI(IplImage* image, CvRect

49、 rect); void cvResetImageROI(IplImage* image); CvRect cvGetImageROI(const IplImage* image); 大多数OpenCV函数都支持 ROI. [编辑] (5) 设置/获取感兴趣通道COI: void cvSetImageCOI(IplImage* image, int coi); // 0=all int cvGetImageCOI(const IplImage* image); 大多数OpenCV函数不支持 COI. [编辑] 2、图像读写 [编辑] (1) 从文件中读入图像:

50、 IplImage* img=0; img=cvLoadImage(fileName); if(!img) printf("Could not load image file: %s\n",fileName); 支持的图像格式: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM, SR, RAS, TIFF, TIF OpenCV默认将读入的图像强制转换为一幅三通道彩色图像. 不过可以按以下方法修改读入方式: img=cvLoadImage(fileName,flag);

51、flag: >0 将读入的图像强制转换为一幅三通道彩色图像 =0 将读入的图像强制转换为一幅单通道灰度图像 <0 读入的图像通道数与所读入的文件相同. [编辑] (2) 保存图像: if(!cvSaveImage(outFileName,img)) printf("Could not save: %s\n", outFileName); 保存的图像格式由 outFileName 中的扩展名确定. [编辑] 3、访问图像像素 [编辑] (1) 假设你要访问第k通道、第i行、第j列的像素。 [编辑] (2) 间接访问: (通用,但效率低,可访问

52、任意格式的图像) · 对于单通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); CvScalar s; s=cvGet2D(img,i,j); // get the (i,j) pixel value printf("intensity=%f\n",s.val[0]); s.val[0]=111; cvSet2D(img,i,j,s); // set the (i,j) pixel value · 对于多通道字节型/浮点型图像: IplImage* img=cvCreateImage

53、(cvSize(640,480),IPL_DEPTH_32F,3); CvScalar s; s=cvGet2D(img,i,j); // get the (i,j) pixel value printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); s.val[0]=111; s.val[1]=111; s.val[2]=111; cvSet2D(img,i,j,s); // set the (i,j) pixel value [编辑] (3) 直接访问: (效率高,但容易出错) · 对于单通道字节型图像: Ip

54、lImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); ((uchar *)(img->imageData + i*img->widthStep))[j]=111; · 对于多通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B ((uchar *)(img->imageData

55、+ i*img->widthStep))[j*img->nChannels + 1]=112; // G ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R · 对于多通道浮点型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B ((float

56、 *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R [编辑] (4) 基于指针的直接访问: (简单高效) · 对于单通道字节型图像: IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); int height = img->height; int w

57、idth = img->width; int step = img->widthStep/sizeof(uchar); uchar* data = (uchar *)img->imageData; data[i*step+j] = 111; · 对于多通道字节型图像: IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); int height = img->height; int width = img->width; int step = im

58、g->widthStep/sizeof(uchar); int channels = img->nChannels; uchar* data = (uchar *)img->imageData; data[i*step+j*channels+k] = 111; · 对于多通道浮点型图像(假设图像数据采用4字节(32位)行对齐方式): IplImage* img = cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); int height = img->height; int width = img->wi

59、dth; int step = img->widthStep/sizeof(float); int channels = img->nChannels; float * data = (float *)img->imageData; data[i*step+j*channels+k] = 111; [编辑] (5) 基于 c++ wrapper 的直接访问: (更简单高效) · 首先定义一个 c++ wrapper ‘Image’,然后基于Image定义不同类型的图像: template class Image { priva

60、te: IplImage* imgp; public: Image(IplImage* img=0) {imgp=img;} ~Image(){imgp=0;} void operator=(IplImage* img) {imgp=img;} inline T* operator[](const int rowIndx) { return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));} };   typedef struct{ unsigned char b,g,r; }

61、RgbPixel;   typedef struct{ float b,g,r; } RgbPixelFloat;   typedef Image RgbImage; typedef Image RgbImageFloat; typedef Image BwImage; typedef Image BwImageFloat; · 对于单通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,480

62、),IPL_DEPTH_8U,1); BwImage imgA(img); imgA[i][j] = 111; · 对于多通道字节型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); RgbImage imgA(img); imgA[i][j].b = 111; imgA[i][j].g = 111; imgA[i][j].r = 111; · 对于多通道浮点型图像: IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

63、 RgbImageFloat imgA(img); imgA[i][j].b = 111; imgA[i][j].g = 111; imgA[i][j].r = 111; [编辑] 4、图像转换 [编辑] (1) 字节型图像的灰度-彩色转换: cvConvertImage(src, dst, flags=0); src = float/byte grayscale/color image dst = byte grayscale/color image flags = CV_CVTIMG_FLIP (垂直翻转图像) CV_CVTIMG_

64、SWAP_RB (置换 R 和 B 通道) [编辑] (2) 彩色图像->灰度图像: // Using the OpenCV conversion: cvCvtColor(cimg,gimg,CV_BGR2GRAY); // cimg -> gimg   // Using a direct conversion: for(i=0;iheight;i++) for(j=0;jwidth;j++) gimgA[i][j]= (uchar)(cimgA[i][j].b*0.114 + cimg

65、A[i][j].g*0.587 + cimgA[i][j].r*0.299); [编辑] (3) 不同彩色空间之间的转换: cvCvtColor(src,dst,code); // src -> dst code = CV_2 / = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab [编辑] 5、绘图指令 [编辑] (1) 绘制矩形: // 在点 (100,

66、100) 和 (200,200) 之间绘制一矩形,边线用红色、宽度为 1 cvRectangle(img, cvPoint(100,100), cvPoint(200,200), cvScalar(255,0,0), 1); [编辑] (2) 绘制圆形: // 圆心为(100,100)、半径为20. 圆周绿色、宽度为1 cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1); [编辑] (3) 绘制线段: // 在 (100,100) 和 (200,200) 之间、线宽为 1 的绿色线段 cvLine(img, cvPoint(100,100), cvPoint(200,200), cvScalar(0,255,0), 1); [编辑] (4) 绘制一组线段: CvPoint curve1[]={10,10, 1

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档

相关搜索

关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!