Mat, IplImage, CvMat, Cvarr关系及元素获取
自己目前正打算整理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:
- Mat m;
- IplImage* transIplimage = cvCloneImage(&(IplImage) m);
IplImage -> Mat
- IplImage* transIplImage;
- Mat m = cvarrToMat(transIplImage,true);
2.2 CvMat与IplImage相互转换
- IplImage* transIplImage;
- CvMat* cvmat;
- cvGetMat(transIplImage,cvmat);
- cvGetImage(cvmat,transIplImage);
3. (多通道)Mat, IplImage, CvMat的元素获取
单通道的网上很多,这里只写多通道:
3.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)
3.2 Mat
本人这几天都在探索如何访问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
- }
- }
- }
后来经过本人的跋山涉水,发现正确的访问三通道Mat数据的代码如下:
定位像素不能使用int,而是应该使用size_t,前车之鉴,希望大家不要重蹈覆辙,这两天的努力没有白费,马克一下,哈哈~
3.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;
- }
Mat, IplImage, CvMat, Cvarr关系及元素获取的更多相关文章
- OpenCV——Mat,IplImage,CvMat类型转换
Mat,cvMat和IplImage这三种类型都可以代表和显示图像,三者区别如下 Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. 而CvMat和IplImage类型更侧 ...
- Mat ,IplImage, CvMat 之间的转换的总结
在新版本与旧版本之间纠结,到底是用Mat,还是Iplimage? Mat 侧重于数据计算,而Iplimage注重于图像的处理. 因此,应根据具体需要灵活使用,那个好用用哪个,只要在两者之间进行转换即可 ...
- IplImage, CvMat, Mat 的关系和相互转换(转)
(看到的一篇非常好的文章,讲opencv内部类之间的关系的.) opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重 ...
- IplImage, CvMat, Mat 的关系
IplImage, CvMat, Mat 的关系 转载来源:http://www.cnblogs.com/summerRQ/articles/2406109.html opencv中常见的与图像操作有 ...
- opencv学习笔记(一)IplImage, CvMat, Mat 的关系
opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...
- opencv基础知识------IplImage, CvMat, Mat 的关系和相互转换
Mat,cvMat和IplImage这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化.而CvMat和IplImage类型更侧重于“图像 ...
- [转] IplImage, CvMat, Mat 的关系
拼装小火车 的原文 IplImage, CvMat, Mat 的关系 opencv中常见的 与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat ...
- CvArr、Mat、CvMat、IplImage、BYTE转换
一.Mat类型:矩阵类型,Matrix. 在openCV中.Mat是一个多维的密集数据数组. 能够用来处理向量和矩阵.图像.直方图等等常见的多维数据. Mat有3个重要的方法: ...
- OpenCV中IplImage/CvMat/Mat转化关系
原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...
随机推荐
- Vue2学习(2)
按键修饰符 还可以自定义按键修饰符别名,通过全局 config.keyCodes 对象设置: // 可以使用 `v-on:keyup.f1` Vue.config.keyCodes.f1 = 112 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用第三方组件
Unity开发中,常常会用到一些第三方组件.本文以实例介绍如何在热更新脚本中使用这些第三方组件. 首先说明几个基本步骤: 第三方组件通常是以dll或者源码方式提供的,它们本身往往无法热更. 我们在脚本 ...
- pytorch_SRU(Simple Recurrent Unit)
导读 本文讨论了最新爆款论文(Training RNNs as Fast as CNNs)提出的LSTM变种SRU(Simple Recurrent Unit),以及基于pytorch实现了SRU,并 ...
- 指尖大冒险H5小游戏
前些天看了一篇很赞的文章,又因为想学习phaser,所以有了这个案例,在线预览可以点下方链接. 本案例中,核心原理是按文章中所提到的内容制作,整体遵循"大道至简"的原则开发,其实是 ...
- Redis持久化的两种方式(RDB和AOF)
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File). RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储 ...
- 正确在遍历中删除List元素
最近在写代码的时候遇到了遍历时删除List元素的问题,在此写一篇博客记录一下. 一般而言,遍历List元素有以下三种方式: 使用普通for循环遍历 使用增强型for循环遍历 使用iterator遍历 ...
- php中AJAX请求中使用post和get请求的区别
之前使用这两个请求的时候,主要从几个方面考虑: 1.语义,get就是从服务器获取,一般就是获取/查询资源信息.post就是提交给服务器,一般就是更新资源信息. 2.请求文件大小,get一般只有2k这样 ...
- 73. Set Matrix Zeroes(中等)
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 重点是空间复 ...
- CSS实现元素居中原理解析
在 CSS 中要设置元素水平垂直居中是一个非常常见的需求了.但就是这样一个从理论上来看似乎实现起来极其简单的,在实践中,它往往难住了很多人. 让元素水平居中相对比较简单:如果它是一个行内元素,就对它的 ...
- 【移动开发】targetSdkVersion的作用
在AndroidMenifest.xml中,常常会有下面的语句: <uses-sdk android:minSdkVersion="4" android:targetSdkV ...
