首页 opencv编程简介笔记4四、图像处理【整理】

opencv编程简介笔记4四、图像处理【整理】

举报
开通vip

opencv编程简介笔记4四、图像处理【整理】opencv编程简介笔记4四、图像处理【整理】 四、图像处理 1、图像的内存分配与释放 (1) 分配内存给一幅新图像: IplImage* 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, I...

opencv编程简介笔记4四、图像处理【整理】
opencv编程简介笔记4四、图像处理【整理】 四、图像处理 1、图像的内存分配与释放 (1) 分配内存给一幅新图像: IplImage* 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. 各通道是交错排列的. 一幅彩色图像的数据排列 格式 pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载 如下: b0 g0 r0 b1 g1 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); cvReleaseImage(&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 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) 从文件中读入图像: 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); flag: >0 将读入的图像强制转换为一幅三通道彩色图像 =0 将读入的图像强制转换为一幅单通道灰度图像 <0 读入的图像通道数与所读入的文件相同. (2) 保存图像: if(!cvSaveImage(outFileName,img)) printf("Could not save: %s\n", outFileName); 保存的图像格式由 outFileName 中的扩展名确定. 3、访问图像像素 (1) 假设你要访问第k通道、第i行、第j列的像素。 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) * 对于单通道字节型图像: 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(cvSize(640,480),IPL_DEPTH_32F,3); CvScalar s; s=cvGet2D(img,i,j); // get the (i,j) pixeprintf("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) 直接访问: (效率高,但容易出错) * 对于单通道字节型图像: IplImage* 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 + 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 *)(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 width = 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 = img->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->width; 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 { private: 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; } 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),IPL_DEPTH_8U,1BwImage 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); 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_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 + cimgA[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,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, 10,100, 100,100, 100,10}; CvPoint curve2[]={30,30, 30,130, 130,130, 130,30, 150,10}; CvPoint* curveArr[2]={curve1, curve2}; int nCurvePts[2]={4,5}; int nCurves=2; int isCurveClosed=1; int lineWidth=1; cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScalar(0,255,255),line Width); void cvPolyLine( CvArr* img, CvPoint** pts, int* npts, int contours, int is_closed, CvScalar color, int thickness=1, int line_type=8, int shift=0 ); img 图像。 pts 折线的顶点指针数组。 npts 折线的定点个数数组。也可以认为是pts指针数组的大小 contours 折线的线段数量。 is_closed 指出多边形是否封闭。如果封闭,函数将起始点和结束点连线。 color 折线的颜色。 thickness 线条的粗细程度。 line_type 线段的类型。参见cvLine。 shift 顶点的小数点位数 (5) 绘制一组填充颜色的多边形: cvFillPoly(img,curveArr,nCurvePts,nCurves,cvScalar(0,255,255)); cvFillPoly用void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours,CvScalar color, int line_type=8, int shift=0 ); img 图像。 pts 指向多边形的数组指针。 npts 多边形的顶点个数的数组。 contours 组成填充区域的线段的数量。 color 多边形的颜色。 line_type 组成多边形的线条的类型。 shift 顶点坐标的小数点位数。 (6) 文本标注: CvFont font; double hScale=1.0; double vScale=1.0; int lineWidth=1; cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth); cvPutText (img,"My comment",cvPoint(200,400), &font, cvScalar(255,255,0)); 其它可用的字体类型有: CV_FONT_HERSHEY_SIMPLEX, CV_FONT_HERSHEY_PLAIN, CV_FONT_HERSHEY_DUPLEX, CV_FONT_HERSHEY_COMPLEX, CV_FONT_HERSHEY_TRIPLEX, CV_FONT_HERSHEY_COMPLEX_SMALL, CV_FONT_HERSHEY_SCRIPT_SIMPLEX, CV_FONT_HERSHEY_SCRIPT_COMPLEX,
本文档为【opencv编程简介笔记4四、图像处理【整理】】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_212655
暂无简介~
格式:doc
大小:30KB
软件:Word
页数:10
分类:企业经营
上传时间:2017-10-10
浏览量:42