opencv中的几种常见的图像类型

上传人:飞*** 文档编号:40216839 上传时间:2018-05-24 格式:DOC 页数:7 大小:47.50KB
返回 下载 相关 举报
opencv中的几种常见的图像类型_第1页
第1页 / 共7页
opencv中的几种常见的图像类型_第2页
第2页 / 共7页
opencv中的几种常见的图像类型_第3页
第3页 / 共7页
opencv中的几种常见的图像类型_第4页
第4页 / 共7页
opencv中的几种常见的图像类型_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《opencv中的几种常见的图像类型》由会员分享,可在线阅读,更多相关《opencv中的几种常见的图像类型(7页珍藏版)》请在金锄头文库上搜索。

1、1 opencv 中的几种常见的图像类型中的几种常见的图像类型opencv 中,几种常见的图像类型有:IplImage,Mat,CvMat,CvArr CvArr :老版本的结构了。是一个抽象基类,在函数原型中,常见到 CvArr(CvArr*),这就允许吧 CvMar* 或者 IplImage* 传递到程序或函数参数中了。CvMat :矩阵结构,IplImage :是较老版本的一种类型了,对图像进行”编码“的基本结构。这些图像可能是灰度,彩色,4通道的(RGB+ alpha),其中,每个通道可以包含任意的整数或浮点数。Mat:新版本中的强大的一个图像容器,是和 Matlab 中的函数对应的。

2、基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。2 opencv 中存储图像类型转换中存储图像类型转换(1)将)将 IplImage 类型转换到类型转换到 Mat 类型类型Mat:Mat(const IplImage* img, bool copyData=false);默认情况下,新的 Mat 类型与原来的 IplImage 类型共享图像数据,转换只是创建一个 Mat 矩

3、阵头。当将参数 copyData 设为 true 后,就会复制整个图像数据。例:IplImage*iplImg = cvLoadImage(“greatwave.jpg“, 1);Matmtx(iplImg); / IplImage* -Mat 共享数据/ or : Mat mtx = iplImg;(2)将)将 Mat 类型转换到类型转换到 IplImage 类型类型同样只是创建图像头,而没有复制数据。例:IplImage ipl_img = img; / Mat - IplImage(3)将)将 CvMat 类型转换为类型转换为 Mat 类型类型与 IplImage 的转换类似,可以选择是

4、否复制数据。Mat:Mat(const CvMat* m, bool copyData=false);(4)将)将 Mat 类型转换为类型转换为 CvMat 类型类型与 IplImage 的转换类似,不复制数据,只创建矩阵头。例:/ 假设 Mat 类型的 imgMat 图像数据存在CvMat cvMat = imgMat; / Mat - CvMat几个例子:几个例子:为矩阵定义了一系列方便的操作符。我们可以将一个已经存在的灰度图像 img变成全黑色:img = Scalar(0);选择感兴趣区域:Rect r(10, 10, 100, 100); Mat smallImg = img(r);

5、将 Mat 转为 C API 数据类型:Mat img = imread(“image.jpg“); IplImage img1 = img; CvMat m = img;注意此处无数据复制操作。将彩色图像转为灰度图像:Mat img = imread(“image.jpg“); / loading a 8UC3 image Mat grey; cvtColor(img, grey, CV_BGR2GRAY);将图像的类型从 8UC1 转为 32FC1:src.convertTo(dst, CV_32F);3 总结总结还是要多参考,多用,映像才深刻opencv 中 Mat 与 IplImage

6、,CVMat 类型之间转换opencv 中对图像的处理是最基本的操作,一般的图像类型为 IplImage 类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利Mat 类型较 CvMat 和 IplImage 有更强的矩阵运算能力,支持常见的矩阵运算(参照 Matlab中的各种矩阵运算),所以将 IplImage 类型和 CvMat 类型转换为 Mat 类型更易于数据处理。Mat 类型可用于直接存储图像信息,通过函数 imread、imwrite、imshow 等实现(与Matlab 中的函数相似),似乎在某种程度上可以取代 IplIm

7、age 类型。(1)将 IplImage 类型转换到 Mat 类型Mat:Mat(const IplImage* img, bool copyData=false);默认情况下,新的 Mat 类型与原来的 IplImage 类型共享图像数据,转换只是创建一个 Mat矩阵头。当将参数 copyData 设为 true 后,就会复制整个图像数据。例:IplImage*iplImg = cvLoadImage(“greatwave.jpg“, 1);Matmtx(iplImg); / IplImage* -Mat 共享数据/ or : Mat mtx = iplImg;(2)将 Mat 类型转换到

8、IplImage 类型同样只是创建图像头,而没有复制数据。例:IplImage ipl_img = img; / Mat - IplImage(3)将 CvMat 类型转换为 Mat 类型与 IplImage 的转换类似,可以选择是否复制数据。Mat:Mat(const CvMat* m, bool copyData=false);(4)将 Mat 类型转换为 CvMat 类型与 IplImage 的转换类似,不复制数据,只创建矩阵头。例:/ 假设 Mat 类型的 imgMat 图像数据存在CvMat cvMat = imgMat; / Mat - CvMatOpenCV 中 IplImage

9、 图像格式与 BYTE 图像数据的转换 IplImage* iplImage;BYTE* data;1 由 IplImage*得到 BYTE*图像数据:data = iplImage-imageDataOrigin; /未对齐的原始图像数据或者data = iplImage-imageData; /已对齐的图像数据2 由 BYTE*得到 IplImage*图像数据iplImage = cvCreateImageHeader(cvSize(width,height),depth,channels); cvSetData(iplImage,data,step);首先由 cvCreateImageH

10、eader()创建 IplImage 图像头,制定图像的尺寸,深度和通道数;然后由cvSetData()根据 BYTE*图像数据指针设置 IplImage 图像头的数据数据,其中 step 指定该 IplImage 图像每行占的字节数,对于 1 通道的 IPL_DEPTH_8U 图像,step 可以等于 width。1,如果是从新创造一个 Iplimage,则用 IplImage* cvCreateImage( CvSize size, int depth, int channels ),它创建头并分配数据。注:当不再使用这个新图像时,要调用 void cvReleaseImage( IplI

11、mage* image )将它的头和图像数据释放!2,如果有图像数据没有为图像头分配存储空间(即,没有为IplImage* 指针分配动态存储空间),则先调用 IplImage* cvCreateImageHeader( CvSize size, int depth, int channels )创建图像头,再调用 void cvSetData( CvArr* arr, void* data, int step )指定图像数据,可以理解为将这个新图像的数据指针指向了一个已存在的图像数据上,不存在图像数据存储空间的分配操作。注:当不再使用这个新图像时,要调用 void cvReleaseImage

12、Header( IplImage* image )将它的图像头释放!3,如果有图像数据也有图像头(用于 IplImage 为静态分配存储空间的情况),则先调用 IplImage* cvInitImageHeader( CvSize size, int depth, int channels )更改图像头,再调用 voidcvSetData( CvArr* arr, void* data, int step )指定图像数据。注:因为这个新图像使用的是其它图像的数据和已有的图像头,所以不能使用 cvReleaseImage 将它的头和图像数据释放,也不能使用cvReleaseData 将它的图像数据释放!4,如果从已有的一个图像创建,则用 IplImage* cvCloneImage( const IplImage* image ),它制作图像的完整拷贝包括头、ROI 和数据。注:当不再使用这个新图像时,要调用 void cvReleaseImage( IplImage* image )将它的头和图像数据释放!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号