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
  1. Mat m;
  2. IplImage* transIplimage = cvCloneImage(&(IplImage) m);

IplImage -> Mat

[cpp] view plaincopy
  1. IplImage* transIplImage;
  2. Mat m = cvarrToMat(transIplImage,true);

2). CvMat与IplImage相互转换

[cpp] view plaincopy
  1. IplImage* transIplImage;
  2. CvMat* cvmat;
  3. cvGetMat(transIplImage,cvmat);
  4. cvGetImage(cvmat,transIplImage);


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

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

1). IplImage

[cpp] view plaincopy
  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)

2 ).Mat

[cpp] view plaincopy
  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). CvMat

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

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

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

[cpp] view plaincopy
  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. }

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

  1. OpenCV中Mat的属性

    OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...

  2. Opencv中Mat的data数据只定义为uchar*类型,

    opencv中Mat的数据定义为指向uchar 的指针,而构造函数又提供了许多其他类型. 其实数据在内存中是一维存储的,而图像基本结构是二维的,3D图像还会是三维的:同时,彩色图像还有多个channe ...

  3. C++下的OpenCV中Mat类型存储的图像格式

    在调用CV进行图像处理时,经常涉及图像格式转换,经常出现原始图像输入后CV_32F与ushort之间的数据差异导致程序报错,可使用std::cout << "dilated_ty ...

  4. opencv中Mat究竟是什么?

    opencv中Mat究竟是什么?(试着运行一下两个代码) 首先看opencv是怎么显示一张图的 : //#include "stdafx.h"#include <opencv ...

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

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  6. OpenCV中Mat数据结构使用举例

    #include "stdafx.h" #include <string> #include <iostream> #include <opencv2 ...

  7. OpenCV中Mat总结

    一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...

  8. opencv java水平投影_使用OpenCv中Mat进行水平投影与垂直投影并实现字符切分

    由于要做图像的处理,所以最近在学习Opencv的相关知识,学习了Opencv中的Mat对象,查阅了网上的资料,了解了相关知识.现在实现了一个使用Mat对象来进行图像的水平投影与垂直投影,并在此基础之上 ...

  9. opencv中mat详细解析

    ##1.起源 OpenCV作为强大的计算机视觉开源库,很大程度上参考了MatLab的实现细节和风格,比如说,在OpenCV2.x 版本以后,越来越多的函数实现了MatLab具有的功能,甚至干脆连函数名 ...

  10. opencv获取mat的指针_数字图像处理之opencv中Mat数据操作

    数字图像处理其实就是处理二维矩阵数据.利用opencv来学习处理算法是一种比较好的方式.学习opencv,主要就是调用其中的图像处理函数来实现各种操作.如果要得到想要的处理结果,还需要对图像处理算法有 ...

最新文章

  1. 查找内存泄漏的一个思路
  2. 超酷的超级DataGrid
  3. java 获取文件所在的文件夹_【Java视频教程】day32-文件IO??
  4. 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya‘s Game。
  5. RN自定义组件封装 - 播放类似PPT动画
  6. linux live使用方法,使用linux-live kit对Linux备份/部署
  7. Python pickle库
  8. 占用51cto。记录自己
  9. NSURLSession访问HTTPS网站
  10. RUI手机桌面,开年大更新绝对值得拥有!
  11. 实时系统解决方案 TIBCO Rendezvous — 技术介绍(消息中间件|基于数据库的主动推送)...
  12. 收录 几篇 关于 广义相对论 水星进动 的 文章
  13. 通过IP地址绘制信息地图(Python+PowerBI+MapBox)
  14. Java泛型 T的用法
  15. 初中计算机毕业测试,2019年初中信息技术毕业考试顺利结束
  16. 【博学谷学习记录】超强总结,用心分享|HiveSQL面试题实战(二)|详细的步骤解析
  17. XZ_iOS之内存泄露exc_bad_access
  18. 贝壳智能客服中的数据建设
  19. iphone闹铃的稍后提醒什么意思
  20. 内网渗透-域横向smbwmin明文hash传递

热门文章

  1. java多线程开发--语法糖之synchronized关键字
  2. CF1399B Gifts Fixing
  3. [2018.10.17 T2] 最优路线
  4. BZOJ2716[Violet] 天使玩偶/SJY摆棋子
  5. nodejs后台系列--第五篇-购买云服务器,安装宝塔面板
  6. vuex的基础小案例(黑马教程)
  7. Nginx虚拟主机别名的配置
  8. Linux中mount挂载命令及其概念
  9. linux的mongo主从异常,解决Linux系统下MongoDB数据库异常退出的问题
  10. springcloud eureka集群_SpringCloud入门学习之Eureka