OpenCV Mat结构关键特性记录
扫描二维码
随时随地手机看文章
最近准备开始阅读Opencv 3 Computer Vision Application Programming CodeBook, 在第一章中学习到Mat的一些特性,在此记录一下,以后在OpenCV开发中肯定可以用得到。
Mat结构(类)是OpenCV中进行图像处理的基本元素,代表一幅图像。可以创建一个空的Mat对象(cv::Mat img),可以创建指定图像大小和数据格式的Mat对象(cv::Mat img(128, 128, cv::CV_8UC3, cv::Scalar(255,255,0)) - 经过初始化的彩色图像, cv::Mat img(cv::Size(128,128), cv::CV_8U) - 未初始化的灰度图像),可以从文件读取图片然后赋值给一个Mat对象(cv::Mat img = cv::imread("img.jpg", 1)),还可以从摄像头等设备读取数据然后保存到Mat对象。同时,也可以将一个cv::Mat对象赋值给另一个cv::Mat对象。
cv::Mat对象的赋值操作需要注意,首先,cv::Mat结构包括两个部分:特性区和数据区,特性区存放的是图像或者数据矩阵的行/列值,数据类型(无符号值,整数,浮点数等)等信息,数据区存放的是图像中像素值。在赋值中,OpenCV虽然新建了一个cv::Mat对象,但是两个对象共用一个数据区,只是特性区属于各自对象,当其中一个对象的生命期结束要释放空间时,如果数据区仍然被其他cv::Mat对象引用,那么就不会释放,直到最后引用此数据区的cv::Mat对象被释放。
根据cv::Mat数据区的这一特性,在选择ROI(Region of Interest)的时候,创建的小图像从大图像中选择一块区域,实际小图像的Mat对象只是新建了特性区,数据区仍然指向大图像的数据区的兴趣部分。
同时,在函数传参时,虽然传入的是cv::Mat对象,但是,并非将整个cv::Mat对象进行拷贝,只是拷贝了特性区,形参和传参共用同一块数据区。因此在函数内部修改数据区,那么传入的cvMat对象也会被修改,而不必用传入引用或者传入指针代替。
还有一个特点,使用cv::Mat::create()成员函数时,虽然使为cv::Mat对象特性变化,如果原对象的数据区能够容下新对象的数据区,那么OpenCV就不会释放旧的数据区再新建,而是直接采用原数据区。