自己目前正打算整理opencv数据结构之间关系,寻寻觅觅之间,发现这篇博文很全面,总结得很好,故转之。红色部分不对,自己已修改!

原文地址:http://blog.csdn.net/abcjennifer/article/details/17640195

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





本人这几天都在探索如何访问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. }

后来经过本人的跋山涉水,发现正确的访问三通道Mat数据的代码如下:

定位像素不能使用int,而是应该使用size_t,前车之鉴,希望大家不要重蹈覆辙,这两天的努力没有白费,马克一下,哈哈~

3.3 CvMat

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. for (int i = 0;i<h;i++)
  7. {
  8. for(int j = 0;j<w;j++)
  9. {
  10. Vec3b& elem = m.at<Vec3b>(i,j);
  11. for (int c = 0; c<nc; c++)
  12. {
  13. //以下两种都可以
  14. //((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c] =  elem[c];
  15. CV_IMAGE_ELEM(pImg,uchar,i,3*j+c) = elem[c];
  16. }
  17. }
  18. }
  19. return pImg;
  20. }


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

  1. OpenCV——Mat,IplImage,CvMat类型转换

    Mat,cvMat和IplImage这三种类型都可以代表和显示图像,三者区别如下 Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. 而CvMat和IplImage类型更侧 ...

  2. Mat ,IplImage, CvMat 之间的转换的总结

    在新版本与旧版本之间纠结,到底是用Mat,还是Iplimage? Mat 侧重于数据计算,而Iplimage注重于图像的处理. 因此,应根据具体需要灵活使用,那个好用用哪个,只要在两者之间进行转换即可 ...

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

    (看到的一篇非常好的文章,讲opencv内部类之间的关系的.) opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重 ...

  4. IplImage, CvMat, Mat 的关系

    IplImage, CvMat, Mat 的关系 转载来源:http://www.cnblogs.com/summerRQ/articles/2406109.html opencv中常见的与图像操作有 ...

  5. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

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

    Mat,cvMat和IplImage这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化.而CvMat和IplImage类型更侧重于“图像 ...

  7. [转] IplImage, CvMat, Mat 的关系

    拼装小火车 的原文 IplImage, CvMat, Mat 的关系 opencv中常见的 与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat ...

  8. CvArr、Mat、CvMat、IplImage、BYTE转换

    一.Mat类型:矩阵类型,Matrix.     在openCV中.Mat是一个多维的密集数据数组. 能够用来处理向量和矩阵.图像.直方图等等常见的多维数据.     Mat有3个重要的方法:     ...

  9. OpenCV中IplImage/CvMat/Mat转化关系

    原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...

随机推荐

  1. DeepMoji:机器学习模型分析情绪, 情感

    DeepMoji 是一个模型,接受12亿个带有表情的推文,以了解语言如何表达情绪. 通过转移学习,该模型可以在许多情感相关的文本建模任务上获得最先进的表现. 在 http://deepmoji.mit ...

  2. Java 读取 json文件

    public ResponseBean getAreas() { String path = getClass().getClassLoader().getResource("area.js ...

  3. android基础-界面开发注意事项

    做安卓开发时一定要注意,主线程不能更改UI界面,如果出现程序运行时崩溃的情况,如果没有明显的语法错误,请检查自己的进程是否出现冲突,崩溃.如果有与后台的连接,即请求向服务器发送请求的时尤其需要注意,或 ...

  4. 如何去掉修改Joomla、joomlart及其模版版权、标志、图标的方法

    Joomla是遵循GNU通用公共授权(GPL)的自由软件,我们虽然不推荐将Joomla的所有版权删除,但有些必要的信息还是需要修改的,下面以JoomlArt.com 的JA_teline_iii_v2 ...

  5. 匿名函数lambda

    匿名函数的定义 在python中,匿名函数的定义如下: func =lambda x:x+1 #定义匿名函数,x为传参,x+1为返回值,func为函数名 res = func(10) #执行匿名函数 ...

  6. 克拉默法则(Cramer's Rule)的证明

    克拉默法则: 先说一下为什么要写这个,作为一个大一新生,必须要学的就包括了线性代数,而且线性代数等数学知识对计算机专业也有很大帮助.但是在学习过程中遇到一个讲解的不清楚的知识点(Cramer's Ru ...

  7. React Native自定义导航条

    Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...

  8. Django 是如何实现用户登录和登出机制的(默认版本-数据库版本)

    Django session 字典,保存到数据库的时候是要先序列化的(session.encode方法), 读取的时候反序列化(session.decode),这样比较安全. 一 settings.p ...

  9. 23 服务的创建Demo1

    结构 MainActivity.java package com.qf.day23_service_demo1; import android.app.Activity; import android ...

  10. Leetcode解题-链表(2.2.2)ReverseLinkedList

    题目:2.2.2 Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in on ...