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);
		}
	}
}

  

posted @ 2013-07-19 21:07  OleNet  阅读(1152)  评论(0编辑  收藏  举报