opencv中Mat、CvMat和IplImage的相互转化
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:
- Mat m;
- IplImage* transIplimage = cvCloneImage(&(IplImage) m);
IplImage -> Mat
- IplImage* transIplImage;
- Mat m = cvarrToMat(transIplImage,true);
2). CvMat与IplImage相互转换
- IplImage* transIplImage;
- CvMat* cvmat;
- cvGetMat(transIplImage,cvmat);
- cvGetImage(cvmat,transIplImage);
3. (多通道)Mat, IplImage, CvMat的元素获取
单通道的网上很多,这里只写多通道:
1). IplImage
- //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
- 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小节)
- 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;
- }
opencv中Mat、CvMat和IplImage的相互转化相关推荐
- OpenCV中Mat的属性
OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...
- Opencv中Mat的data数据只定义为uchar*类型,
opencv中Mat的数据定义为指向uchar 的指针,而构造函数又提供了许多其他类型. 其实数据在内存中是一维存储的,而图像基本结构是二维的,3D图像还会是三维的:同时,彩色图像还有多个channe ...
- C++下的OpenCV中Mat类型存储的图像格式
在调用CV进行图像处理时,经常涉及图像格式转换,经常出现原始图像输入后CV_32F与ushort之间的数据差异导致程序报错,可使用std::cout << "dilated_ty ...
- opencv中Mat究竟是什么?
opencv中Mat究竟是什么?(试着运行一下两个代码) 首先看opencv是怎么显示一张图的 : //#include "stdafx.h"#include <opencv ...
- opencv中Mat与IplImage,CVMat类型之间转换
opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...
- OpenCV中Mat数据结构使用举例
#include "stdafx.h" #include <string> #include <iostream> #include <opencv2 ...
- OpenCV中Mat总结
一.数字图像存储概述 数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵. 二.Mat的存储 1.OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘 ...
- opencv java水平投影_使用OpenCv中Mat进行水平投影与垂直投影并实现字符切分
由于要做图像的处理,所以最近在学习Opencv的相关知识,学习了Opencv中的Mat对象,查阅了网上的资料,了解了相关知识.现在实现了一个使用Mat对象来进行图像的水平投影与垂直投影,并在此基础之上 ...
- opencv中mat详细解析
##1.起源 OpenCV作为强大的计算机视觉开源库,很大程度上参考了MatLab的实现细节和风格,比如说,在OpenCV2.x 版本以后,越来越多的函数实现了MatLab具有的功能,甚至干脆连函数名 ...
- opencv获取mat的指针_数字图像处理之opencv中Mat数据操作
数字图像处理其实就是处理二维矩阵数据.利用opencv来学习处理算法是一种比较好的方式.学习opencv,主要就是调用其中的图像处理函数来实现各种操作.如果要得到想要的处理结果,还需要对图像处理算法有 ...
最新文章
- 查找内存泄漏的一个思路
- 超酷的超级DataGrid
- java 获取文件所在的文件夹_【Java视频教程】day32-文件IO??
- 51nod 1536不一样的猜数游戏 思路:O(n)素数筛选法。同Codeforces 576A Vasya and Petya‘s Game。
- RN自定义组件封装 - 播放类似PPT动画
- linux live使用方法,使用linux-live kit对Linux备份/部署
- Python pickle库
- 占用51cto。记录自己
- NSURLSession访问HTTPS网站
- RUI手机桌面,开年大更新绝对值得拥有!
- 实时系统解决方案 TIBCO Rendezvous — 技术介绍(消息中间件|基于数据库的主动推送)...
- 收录 几篇 关于 广义相对论 水星进动 的 文章
- 通过IP地址绘制信息地图(Python+PowerBI+MapBox)
- Java泛型 T的用法
- 初中计算机毕业测试,2019年初中信息技术毕业考试顺利结束
- 【博学谷学习记录】超强总结,用心分享|HiveSQL面试题实战(二)|详细的步骤解析
- XZ_iOS之内存泄露exc_bad_access
- 贝壳智能客服中的数据建设
- iphone闹铃的稍后提醒什么意思
- 内网渗透-域横向smbwmin明文hash传递
热门文章
- java多线程开发--语法糖之synchronized关键字
- CF1399B Gifts Fixing
- [2018.10.17 T2] 最优路线
- BZOJ2716[Violet] 天使玩偶/SJY摆棋子
- nodejs后台系列--第五篇-购买云服务器,安装宝塔面板
- vuex的基础小案例(黑马教程)
- Nginx虚拟主机别名的配置
- Linux中mount挂载命令及其概念
- linux的mongo主从异常,解决Linux系统下MongoDB数据库异常退出的问题
- springcloud eureka集群_SpringCloud入门学习之Eureka