Mat, IplImage, CvMat, Cvarr关系及元素获取

原文链接:http://blog.csdn.net/abcjennifer/article/details/17640195

因为之前查资料关于opencv几种坑爹类型CvMat, Mat, IplImage, Cvarr的详细讲解很多,但详细到多通道元素获取和涉及到类型转换的文章极少,还有更坑爹的一些误导文章,所以本文很简要地讲一下怎样获取这几种类型的元素,及其类型转换。

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:

1 Mat m;
2 IplImage* transIplimage = cvCloneImage(&(IplImage) m); 

IplImage -> Mat

1 IplImage* transIplImage;
2 Mat m = cvarrToMat(transIplImage,true);  

2.2 CvMat与IplImage相互转换

1 IplImage* transIplImage;
2 CvMat* cvmat;
3 cvGetMat(transIplImage,cvmat);
4 cvGetImage(cvmat,transIplImage);  

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

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

3.1 IplImage

1 //i is the index of rows
2 //j is the index of cols
3 //c is the index of channel
4 ((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c]
5 CV_IMAGE_ELEM(pImg,uchar,i,3*j+c)   

3.2 Mat

 1 Mat m;
 2 int h = m.rows; int w = m.cols;
 3 int nc = m.channels();
 4 for (int i = 0;i<h;i++)
 5 {
 6     for(int j = 0;j<w;j++)
 7     {
 8         Vec3b& elem = m.at<Vec3b>(i,j);
 9         for (int c = 0; c<nc; c++)
10         {
11             uchar uc = elem[c] ;//Mat(i,j) of channel c
12         }
13     }
14 }  

3.3 CvMat

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

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

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

 1 IplImage* cvcvt_mat2IplImage(Mat m)
 2 {
 3     int h = m.rows; int w = m.cols;
 4     int nc = m.channels();
 5     IplImage* pImg = cvCreateImage(cvSize(w,h),8,nc);
 6
 7     for (int i = 0;i<h;i++)
 8     {
 9         for(int j = 0;j<w;j++)
10         {
11             Vec3b& elem = m.at<Vec3b>(i,j);
12             for (int c = 0; c<nc; c++)
13             {
14                 //以下两种都可以
15                 //((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c] =  elem[c];
16                 CV_IMAGE_ELEM(pImg,uchar,i,3*j+c) = elem[c];
17             }
18         }
19     }
20     return pImg;
21 }  
时间: 2024-12-20 23:48:28

Mat, IplImage, CvMat, Cvarr关系及元素获取的相关文章

OpenCV:Mat,IplImage,CvMat类型转换

Mat,cvMat和IplImage这三种类型都可以代表和显示图像,三者区别如下 Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. 而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放.单通道提取.图像阈值操作等)进行了优化.IplImage类型与CvMat类型的关系类似于面向对象中的继承关系.实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见.在opencv2.0之前,opencv是完全用C实现的.

CvArr、Mat、CvMat、IplImage、BYTE转换

一.Mat类型:矩阵类型,Matrix. 在openCV中,Mat是一个多维的密集数据数组.可以用来处理向量和矩阵.图像.直方图等等常见的多维数据. Mat有3个重要的方法: 1.Mat mat = imread(const String* filename);            读取图像 2.imshow(const string frameName, InputArray mat);      显示图像 3.imwrite (const string& filename, InputAr

opencv基础知识------IplImage, CvMat, Mat 的关系和相互转换

Mat,cvMat和IplImage这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化.而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放.单通道提取.图像阈值操作等)进行了优化.在opencv2.0之前,opencv是完全用C实现的,但是,IplImage类型与CvMat类型的关系类似于面向对象中的继承关系.实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见. 一.

IplImage, CvMat, Mat 的关系和相互转换(转)

(看到的一篇非常好的文章,讲opencv内部类之间的关系的.) opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化.而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放.单通道提取.图像阈值操作等)进行了优化.在opencv2.0之前,opencv是完全用C实现的,但是,IplImage类型与CvMat类型的关系类似

OpenCV数据结构:CvMat,IplImage,CvArr的应用

最近看HS算法时,发现在新的OpenCV3.0已经移除了该算法,于是不得不看老版的.这其中涉及到了CvMat,CvArr,IplImage的使用.关于这三个结构与Mat的转换关系,总结如下: (1)派生关系:CvArr->CvMat->IplImage 传参问题:CvArr作为函数参数,可传入CvMat或IplImage,但内部都按CvMat处理. (2)Mat转IplImage和CvMat IplImage img=IplImage(mat) CvMat cvmat=mat (3)CvMat

opencv中Mat与IplImage,CVMat类型之间转换

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

openCV学习笔记(9)Mat与IplImage,CvMat类型之间转换

opencv中图像数据容器一般有Mat,cvMat和IplImage.我们在平常的代码中,由于不同的函数的参数类型不一致,经常需要转换这三者之间的相互转化.网上有大量的杂七杂八的资料,望结合实际而用之. Mat是一个多维的密集数据数组,可以用来处理向量和矩阵.图像.直方图等等常见的多维数据,所以Mat侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. 而CvMat和IplImage类型更侧重于"图像",opencv对其中的图像操作(缩放.单通道提取.图像阈值操作等)进

JQuery元素获取

前言:这是本类别博文JQuery即用即查开篇. 因为查手册太麻烦,而且有时候需要深入命令所在详细页面才能了解此命令的具体作用是什么. 写这几篇文章就是为了,工作遇到问题时,一看这几篇文章就可以查到哪个命令的作用正好符合,然后自己再深入手册进行具体学习用法. 写的都是常用的一些,前提是你对jquery命令有一定了解,且有jquery手册. 第一篇:JQuery元素获取常见用法 1.利用标签名获取元素 $("标签名") 2.通过ID获取元素 $("#id_name")

Javascript基础简单汇总(一):元素获取

在页面脚本中,如果要对页面元素进行操作,那么我们就要获取到这个元素 那么在获取元素之前首先得要了解什么是DOM(document object  model) 在DOM,元素是以节点的形式表示的,每一个节点都是对象,我们平时写的特效也就是修改的节点对象的属性来的,这个就是传说中的DOM操作 而节点树其实也就是元素的父子级关系的树状图而已,所以啊,不要想的太复杂 这个元素节点了原生JS不能直接操作的,只能通过document这个文档对象再去获取 比如我要通过元素ID名获取元素: document.