Mat对象的使用及注意事项

来源:互联网 发布:7英寸windows平板 编辑:程序博客网 时间:2024/06/03 04:07

1,什么是Mat对象 ,见下图


Mat对象封装了图像在内存中的信息,用于表示一副加载到内存中的图像,是opencv2.0以后引入的

相比之前的IpImage对象,具有自动分配内存,不存在内存泄漏的优点,Mat对象分为头部与数据部分。

2,Mat对象的使用

因为Mat对象分为头部和数据两部分,所以当复制mat对象时有两种情况


1,完全复制:就是把Mat对象的头部和数据部分完全复制  可以通过 clone()和copyTo两个API实现

比如Mat dst=src.clone() 或者  src.copyTo(dst)

2,部分复制:只复制Mat对象的头和指针部分,不复制数据

比如 Mat src=imread("path"),Mat dst(src) 


3,注意事项

1,Mat对象输出图像的内存是自动分配的,无需考虑内存分配问题

2,赋值操作和拷贝构造函数只会复制头部

3,完全复制只能通过clone和copyTo实现


4,Mat对象的创建

Mat M(2,2,CV_8UC3,Scalar(0,0,255))

前两个参数分别表示行(row)跟列(column)也就是图像的宽,高,CV_8UC3中的8表示每个通道占8位

U表示无符号,C表示Char类型,3表示图像的通道是数目是3,Scalar(0,0,255)用于初始化每个像素通道的值

这是个向量,向量的维度和图像的通道数目保持一致。


演示代码


#include <opencv2\opencv.hpp>#include <highgui.h>using namespace cv;using namespace std;int main(int argc, char** argv){Mat src;src = imread("test.jpg");if (src.empty()){printf("图像加载错误!");return -1;}//创建显示窗口namedWindow("input",CV_WINDOW_AUTOSIZE);//imshow("input",src);//Mat dst;//dst = Mat(src.size(),src.type());//dst = Scalar(127,0,255);//初始化每个像素BGR通道的值//namedWindow("output-1", CV_WINDOW_AUTOSIZE);//imshow("output-1",dst);Mat dst;//src.copyTo(dst);//namedWindow("output-2", CV_WINDOW_AUTOSIZE);//imshow("output-2",dst);cvtColor(src,dst,CV_BGR2GRAY);printf("input image channel:%d\n", src.channels());printf("output image channel:%d\n",dst.channels());int cols = dst.cols;int rows = dst.rows;//输出图像的宽,高printf("rows:%d cols:%d",rows,cols);//获取第0行第一个像素的值const uchar* firstRow = dst.ptr<uchar>(0);printf("first pixel value:%d\n",*firstRow);Mat M(10,10,CV_8UC1,Scalar(127));cout << "M=" << endl << M << endl;waitKey(0);return 0;}



原创粉丝点击