IpIImage -> CvMat 转换方法
Ipl转为CvMat 一般为这两种方法:
1:
/*cvGetMat*/ CvMat matheader; CvMat * mat = cvGetMat(img, &matheader);
2:
/*cvConvert*/ CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3); cvConvert(img, mat)
不过经过测试,感觉cvGetMat并不好用,因为需要多一步初始化matheader的步骤。麻烦。所以推荐方法
-------------------------------------------------------------------------------------------------------------------
方法2测试如下图所示,
我们可以看到,如果声明不同的话——在cvCreateMat理,第三个参数:type,可以是任何预定义类型,预定义类型的结构如下:CV_<bit_depth> (S|U|F)C<number_of_channels>。于是,矩阵的元素可以是32位浮点型数据(CV_32FC1),或者是无符号的8位三元组的整型数据(CV_8UC3),或者是无数的其他类型的元素——那么mat的内部结构也就不同,从step来说,我的理解step是一行所占的内存空间,mat1是无符号3通道,即内部的数据类型应该是unsigned char,即占用1个字节每个单元,mat2则是float,4个字节每单元,也就是说mat2同等数据个数,其空间大小是mat1的四倍,这也正好由step验证。
从ipl这一端来看,ipl的imageData数据类型为unsigned char*,那么如果把数据转到mat2中的话,则要涉及到一个强制转换,unsigned char 转为 float,按照常识,一般都是以强转为0收尾。所以为了ipl转mat成功,将type声明为CV_8UC3是必须的。
三通道转换成功,便自然想到一通道的灰度图转换。
其代码如下:实验证明,这是成功的。
void ReadIpl2Mat() { int temp1, temp2; int row, col; IplImage *img = cvLoadImage("11.jpg",1); IplImage *pImgGray = cvCreateImage(cvGetSize(img), img->depth, 1); uchar *pImg, *pMat; CvMat *mat1; cvCvtColor(img, pImgGray, CV_BGR2GRAY); mat1 = cvCreateMat(pImgGray->height, pImgGray->width, CV_8UC1); cvConvert(pImgGray, mat1); for ( row=0; row<mat1->rows; row++) { pImg = (char*)(pImgGray->imageData + row*pImgGray->widthStep); pMat = (char*)(mat1->data.ptr + row*mat1->step); for(col=0; col<mat1->cols; col++) { temp2 = *(pImg+col); temp1 = *(pMat+col); } } }
1. 任何单位或个人认为本博的内容可能涉嫌侵犯其合法权益,可以及时的联系我(olenet#126#com),我会立即更正或删除。
2. 欢迎转载,记得贴链接^_^。www.cnblogs.com/OleNet