Mat对象和图像混合

2019-06-23  本文已影响0人  思思入扣

一、在计算机中,一幅图片对应的是矩阵,矩阵包含了所有像素点的数值,opencv1.0是基于C语言写的,当时采用的是IplImage的C语言结构体,用户必须手动管理内存。但是从2.0开始,使用Mat类存储图像,它可以自动分配和释放图像的内存
1.Mat的组成:一个是Matrix header 这部分的大小是固定的,包含矩阵的大小,存储方式,矩阵存储的地址等,另一个是指向矩阵包含像素值的指针
2.Mat的创建
(1)使用Mat构造函数

Mat M(7,7,CV_32FC2,Scalar(1,3));

创建了 7X7 的像素图像,每个像素有两个通道,且每个通道的值都为(1,3),深度为32,CV_32F表示每个元素的值的类型为32位浮点数,C2表示通道数为2,Scalar(1,3)表示对矩阵每个元素都赋值为(1,3),第一个通道中的值都是1,第二个通道中的值都是3
值得注意是的,Mat 三通道依次是 BGR,而不是我们熟知的 RGB。
(2)通过 create() 创建
Mat M;

//create不能指定初始值, CV_8UC(4)为自定义通道数
M.create(100,60,CV_8UC(15)); 

3.拷贝

Mat A, C; // creates just the header parts
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // here we’ll know the method used (allocate matrix)
Mat B(A); // Use the copy constructor
C = A;

copy这样的操作只是copy了矩阵的matrix header和那个指针,而不是矩阵的本身,也就意味着两个矩阵的数据指针指向的是同一个地址
比如上面这段程序,A、B、C指向的是同一块数据,他们的header不同,但对于A的操作同样也影响着B、C的结果
如果想建立互不影响的Mat,是真正的复制操作,需要使用函数clone()或者copyTo()
4.Mat有3个重要的方法:
Mat mat = imread(const String* filename); 读取图像
imshow(const string frameName, InputArray mat); 显示图像
imwrite (const string& filename, InputArray img); 储存图像

上一篇下一篇

猜你喜欢

热点阅读