Mat,CvMat,IPIImage,Cvarr转换及元素提取
2016-07-07 20:44
731 查看
1、Mat, IplImage, CvMat, CvArr的关系:
1. opencv文档中明确声明,CvMat已经过时了(CvMat is now obsolete, consider
using Mat instead)不建议用;
2. 派生关系:CvArr -> CvMat -> IplImage
3. Mat用的一套东西是imread,imshow等,有别于CvArr及其子类的cvLoadImage(),cvShowImage()...
2. 相互转换
所有代码已经过测试,但是这里我就示意一下,真正写的时候不要忘记初始化转化过去的变量。
2.1 Mat与IplImage相互转换
IplImage* src;
某文章说,转换应该是Mat m(src); 而这不会复制内容,真正能复制内容的是:
Mat -> IplImage:
[cpp] view
plain copy
Mat m;
IplImage* transIplimage = cvCloneImage(&(IplImage) m);
IplImage -> Mat
[cpp] view
plain copy
IplImage* transIplImage;
Mat m = cvarrToMat(transIplImage,true);
2.2 CvMat与IplImage相互转换
[cpp] view
plain copy
IplImage* transIplImage;
CvMat* cvmat;
cvGetMat(transIplImage,cvmat);
cvGetImage(cvmat,transIplImage);
3. (多通道)[b]Mat, IplImage, CvMat的元素获取[/b]
单通道的网上很多,这里只写多通道:
3.1 IplImage
[cpp] view
plain copy
//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)
3.2 Mat
[cpp] view
plain copy
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.3 CvMat
CV_MAT_ELEM(cvmat,uchar,i,3*j+c)
4. 验证获取元素代码(Mat转IplImage)
此代码只用于验证多通道元素获取没有错误,具体用的时候最好还是用opencv直接给的吧(见第3小节)
[cpp] view
plain copy
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;
}
1. opencv文档中明确声明,CvMat已经过时了(CvMat is now obsolete, consider
using Mat instead)不建议用;
2. 派生关系:CvArr -> CvMat -> IplImage
3. Mat用的一套东西是imread,imshow等,有别于CvArr及其子类的cvLoadImage(),cvShowImage()...
2. 相互转换
所有代码已经过测试,但是这里我就示意一下,真正写的时候不要忘记初始化转化过去的变量。
2.1 Mat与IplImage相互转换
IplImage* src;
某文章说,转换应该是Mat m(src); 而这不会复制内容,真正能复制内容的是:
Mat -> IplImage:
[cpp] view
plain copy
Mat m;
IplImage* transIplimage = cvCloneImage(&(IplImage) m);
IplImage -> Mat
[cpp] view
plain copy
IplImage* transIplImage;
Mat m = cvarrToMat(transIplImage,true);
2.2 CvMat与IplImage相互转换
[cpp] view
plain copy
IplImage* transIplImage;
CvMat* cvmat;
cvGetMat(transIplImage,cvmat);
cvGetImage(cvmat,transIplImage);
3. (多通道)[b]Mat, IplImage, CvMat的元素获取[/b]
单通道的网上很多,这里只写多通道:
3.1 IplImage
[cpp] view
plain copy
//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)
3.2 Mat
[cpp] view
plain copy
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.3 CvMat
CV_MAT_ELEM(cvmat,uchar,i,3*j+c)
4. 验证获取元素代码(Mat转IplImage)
此代码只用于验证多通道元素获取没有错误,具体用的时候最好还是用opencv直接给的吧(见第3小节)
[cpp] view
plain copy
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;
}
相关文章推荐
- PHP GD 图像处理组件的常用函数总结
- PHP图像处理之imagecreate、imagedestroy函数介绍
- jsvascript图像处理―(计算机视觉应用)图像金字塔
- Javascript图像处理思路及实现代码
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- PHP图像处理之使用imagecolorallocate()函数设置颜色例子
- java数字图像处理基础使用imageio写图像文件示例
- 使用Java进行图像处理的一些基础操作
- javascript图像处理―边缘梯度计算函数
- Javascript图像处理―阈值函数实例应用
- Javascript图像处理―虚拟边缘介绍及使用方法
- Android Studio中配置OpenCV库开发环境的教程
- 基于C++实现kinect+opencv 获取深度及彩色数据
- visual studio 2012安装配置方法图文教程 附opencv配置教程
- OpenCV 2.4.3 C++ 平滑处理分析
- PHP图像处理类库及演示分享
- CI框架文件上传类及图像处理类用法分析
- php图像处理函数大全(推荐收藏)