opencv Mat对象与它各种用法
2017-07-19 17:42
162 查看
http://www.cnblogs.com/opecvschool/p/6049128.html
学习OpenCV大家都会遇到一个对象叫做Mat,此对象非常神奇,支持各种操作。很多初学者因此被搞得头晕脑胀,它各种用法太多太杂,搞得初学者应接不暇,感觉有心无力、无处下手之感。这里我们首先要正本清源,从Mat对象的产生原因说起,然后再把Mat各种神奇用法一一梳理总结。
Mat对象起源:
当OpenCV 1.0发布时候没有Mat对象,是个C语言风格的数据结构IPlImage来表示内存中图像对象,但是OpenCV开发者在做复杂图像处理算法分析与计算时候,创建了很多IplImage这样的数据结构,偶尔最后可能忘记释放内存了,这样算法就有了内存泄漏,导致开发者浪费很多精力去寻找这个错误,这个已经跟图像处理算法没有关系了,但是它却困扰了很多OpenCV开发者。Intel发现自己做的库居然这么渣,广大群众不满意,决定从OpenCV 2.0开始使用一个新的内存对象Mat来表示内存中的图像对象。它是C++风格的数据结构,自动实现内存分配与回收,这样OpenCV开发者就再也不用担心因为使用OpenCV的图像对象数据结构而导致内存泄漏问题了。但是仍然有些开发者直到现在还在顽固的使用IplImage这个对象,Intel为了照顾他们,所以允许IplImage对象继续存在,还提供可以把IplImage对象转换成Mat对象的构造函数,作为开源SDK可谓仁至义尽。
Mat对象构造函数
自从OpenCV2.0引入Mat对象之后,在通过imread函数读入一张图像的时候开发者无需先分配内存然后使用完之后释放它,因为OpenCV框架会帮你完成这些事情,自动管理Mat相关的内存,那么在OpenCV中如何创建一个Mat对象,下列方法都是你的选择之一:
方法一:
通过读入一张图像,直接转换为Mat对象即可:
Mat image = imread("test.jpg");
其中 imread()方法需要传入String类型的值,一般都是图像文件路径。
方法二:
使用无参数构造函数,创建Mat对象
此刻表示创建一个4x4大小的像素块,每个像素都是三通道每个通道的位数都是8位,一个字节的。上述CV_8UC3中的8表示8位、UC表示uchar类型、3表示三个通道。打印显示是这样的:
方法三:
使用行、列、类型带这个三个参数的构造函数创建Mat对象
表示创建一个跟方法二一样的像素块,打印显示跟方法二内容一致:
方法四:
使用行、列、类型、Scalar向量四个参数的构造函数创建Mat对象
同样表示创建一个4x4的像素块,唯一不一样的是颜色不是默认值而是我们指定的三通道颜色值向量Scalar(0, 255, 255)。其中Scalar向量数目永远是等于通道数目,打印显示如下
方法五:
使用大小、类型两个参数的构造函数创建Mat对象
同样创建一个4x4的每个通道8位三个通道的像素块,打印显示如下:
方法六:
使用大小、类型、Scalar向量三个参数的构造函数创建Mat对象
同样创建一个4x4的每个通道8位三个通道的像素块,打印显示如下:
方法七:
使用Mat::zeros函数实现,两个参数一个是Size表示图像宽与高,另外一个表示类型
同样创建一个4x4的每个通道8位三个通道的像素块,打印显示如下:
方法八:
使用Mat::ones函数实现,两个参数一个是Size表示图像宽与高,另外一个表示类型
同样创建一个4x4的每个通道8位一个通道的像素块,打印显示如下:
注意这次类型是CV_8UC1表示创建的是一个通道类型数据。
复制Mat对象
在OpenCV中可以通过如下几种方法对Mat对象进行复制
或者
通过上述两种方法Mat对象只会复制头部分和指向像素数据的指针,不会真正复制数据部分。通过如下方法Mat可以实现数据对象的完全复制
或者
Mat对象中获取像素
方法一:通过指针读取像素值,实现像素值操作。函数Mat.ptr(row)其中row表示行索引,从零开始基数,表示每一行的结果。
Mat src = imread("test.jpg");
const uchar* currentRow = src.ptr(row) ;
表示获取指定行int row = 0的像素数组指针。
演示代码:
方法二:通过随机进入像素点读取像素值,实现像素操作。函数Mat.at<type>(row, col)支持获取单通道或者多通道的图像,通过这种方式的时候,需要提前预知图像的类型。代码演示如下:
结果显示如下:
Mat作为OpenCV 2.0之后推出新图像内存对象数据结构,是每个学习OpenCV的开发者必须熟知与掌握的。
附带:
注:
1.新的opencv库需要使用cv名称空间
2.新的cv函数应该是将前面的cv字符去掉的函数。 如 namedWindow ===> cvNamedWindow
学习OpenCV大家都会遇到一个对象叫做Mat,此对象非常神奇,支持各种操作。很多初学者因此被搞得头晕脑胀,它各种用法太多太杂,搞得初学者应接不暇,感觉有心无力、无处下手之感。这里我们首先要正本清源,从Mat对象的产生原因说起,然后再把Mat各种神奇用法一一梳理总结。
Mat对象起源:
当OpenCV 1.0发布时候没有Mat对象,是个C语言风格的数据结构IPlImage来表示内存中图像对象,但是OpenCV开发者在做复杂图像处理算法分析与计算时候,创建了很多IplImage这样的数据结构,偶尔最后可能忘记释放内存了,这样算法就有了内存泄漏,导致开发者浪费很多精力去寻找这个错误,这个已经跟图像处理算法没有关系了,但是它却困扰了很多OpenCV开发者。Intel发现自己做的库居然这么渣,广大群众不满意,决定从OpenCV 2.0开始使用一个新的内存对象Mat来表示内存中的图像对象。它是C++风格的数据结构,自动实现内存分配与回收,这样OpenCV开发者就再也不用担心因为使用OpenCV的图像对象数据结构而导致内存泄漏问题了。但是仍然有些开发者直到现在还在顽固的使用IplImage这个对象,Intel为了照顾他们,所以允许IplImage对象继续存在,还提供可以把IplImage对象转换成Mat对象的构造函数,作为开源SDK可谓仁至义尽。
Mat对象构造函数
自从OpenCV2.0引入Mat对象之后,在通过imread函数读入一张图像的时候开发者无需先分配内存然后使用完之后释放它,因为OpenCV框架会帮你完成这些事情,自动管理Mat相关的内存,那么在OpenCV中如何创建一个Mat对象,下列方法都是你的选择之一:
方法一:
通过读入一张图像,直接转换为Mat对象即可:
Mat image = imread("test.jpg");
其中 imread()方法需要传入String类型的值,一般都是图像文件路径。
方法二:
使用无参数构造函数,创建Mat对象
方法三:
使用行、列、类型带这个三个参数的构造函数创建Mat对象
方法四:
使用行、列、类型、Scalar向量四个参数的构造函数创建Mat对象
方法五:
使用大小、类型两个参数的构造函数创建Mat对象
方法六:
使用大小、类型、Scalar向量三个参数的构造函数创建Mat对象
方法七:
使用Mat::zeros函数实现,两个参数一个是Size表示图像宽与高,另外一个表示类型
方法八:
使用Mat::ones函数实现,两个参数一个是Size表示图像宽与高,另外一个表示类型
注意这次类型是CV_8UC1表示创建的是一个通道类型数据。
复制Mat对象
在OpenCV中可以通过如下几种方法对Mat对象进行复制
方法一:通过指针读取像素值,实现像素值操作。函数Mat.ptr(row)其中row表示行索引,从零开始基数,表示每一行的结果。
Mat src = imread("test.jpg");
const uchar* currentRow = src.ptr(row) ;
表示获取指定行int row = 0的像素数组指针。
演示代码:
Mat作为OpenCV 2.0之后推出新图像内存对象数据结构,是每个学习OpenCV的开发者必须熟知与掌握的。
附带:
#include <opencv2/opencv.hpp> #include <opencv2/core.hpp> using namespace cv; int main(int argc, const char * argv[]) { Mat img = imread("D://lena.png"); if(img.empty()) return; //const uchar* currentRow = img.ptr(0); data row0 namedWindow("lena", CV_WINDOW_AUTOSIZE); imshow("lena", img); waitKey(0); destroyWindow("lena"); #if 0 //get the image from the directed path IplImage* img = cvLoadImage("D://lena.png", 1); //NSLog(img); //create a window to display the image cvNamedWindow("picture", 1); //show the image in the window cvShowImage("picture", img); //wait for the user to hit a key cvWaitKey(0); //delete the image and window cvReleaseImage(&img); cvDestroyWindow("picture"); #endif //return return 0; }
注:
1.新的opencv库需要使用cv名称空间
2.新的cv函数应该是将前面的cv字符去掉的函数。 如 namedWindow ===> cvNamedWindow
相关文章推荐
- JSP简介以及各种内置对象的用法
- javascript之string对象 以及字符串各种用法
- 【iOS开发-7】UILabel类的用法以及实例化对象的各种属性介绍
- Oracle中自定义函数 无参数 输入参数 输出参数等各种用法
- h5程序设计基础 对象 各种运算符
- android各种适配器的用法
- 关于arguments对象的一些用法
- js的数组、对象数组和对象的定义和js内部对象和with、for..in的用法
- UISwipeGestureRecognizer各种手势的用法
- JQuery各种用法参考
- android service 的各种用法(IPC、AIDL)
- sringboot redis五大类型用法 各种方法
- 四种对象生存期和作用域、static 用法总结
- <s:iterator>各种遍历用法
- Javascript面向对象三大特性(封装性、继承性、多态性)详解及创建对象的各种方法
- jQuery.extend 函数各种用法
- PHP面向对象程序设计之接口用法
- ASP.NET泛型List的各种用法Skip、Take等
- 函数返回类对象的各种形式
- Flex编程注意之直接获取某个组件的对象(this[]用法)通过id获取控件