您的位置:首页 > 运维架构

opencv中Mat、CvMat和IplImage的相互转化

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

1、四者关系:

1).CvMat(CvMat is now obsolete, consider using Mat instead)不建议用;

2). 派生关系:CvArr -> CvMat -> IplImage

3). Mat是C++接口,和IplImage有所不同。

2. 相互转换

1). Mat与IplImage相互转换

IplImage* src;

某文章说,转换应该是Mat m(src); 而这不会复制内容,真正能复制内容的是:

Mat -> IplImage:

[cpp] view
plaincopy





Mat m;

IplImage* transIplimage = cvCloneImage(&(IplImage) m);

IplImage -> Mat

[cpp] view
plaincopy





IplImage* transIplImage;

Mat m = cvarrToMat(transIplImage,true);

2). CvMat与IplImage相互转换

[cpp] view
plaincopy





IplImage* transIplImage;

CvMat* cvmat;

cvGetMat(transIplImage,cvmat);

cvGetImage(cvmat,transIplImage);

3. (多通道)Mat, IplImage, CvMat的元素获取

单通道的网上很多,这里只写多通道:

1). IplImage

[cpp] view
plaincopy





//i is the index of rows

//j is the index of cols

//c is the index of channel

((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c]

CV_IMAGE_ELEM(pImg,uchar,i,3*j+c)

2 ).Mat

[cpp] view
plaincopy





Mat m;

int h = m.rows; int w = m.cols;

int nc = m.channels();

for (int i = 0;i<h;i++)

{

for(int j = 0;j<w;j++)

{

Vec3b& elem = m.at<Vec3b>(i,j);

for (int c = 0; c<nc; c++)

{

uchar uc = elem[c] ;//Mat(i,j) of channel c

}

}

}

3). CvMat

CV_MAT_ELEM(cvmat,uchar,i,3*j+c)

4. 验证获取元素代码(Mat转IplImage)

此代码只用于验证多通道元素获取没有错误,具体用的时候最好还是用opencv直接给的吧(见第3小节)

[cpp] view
plaincopy





IplImage* cvcvt_mat2IplImage(Mat m)

{

int h = m.rows; int w = m.cols;

int nc = m.channels();

IplImage* pImg = cvCreateImage(cvSize(w,h),8,nc);

for (int i = 0;i<h;i++)

{

for(int j = 0;j<w;j++)

{

Vec3b& elem = m.at<Vec3b>(i,j);

for (int c = 0; c<nc; c++)

{

//以下两种都可以

//((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c] = elem[c];

CV_IMAGE_ELEM(pImg,uchar,i,3*j+c) = elem[c];

}

}

}

return pImg;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: