C++ OpenCV #004 Mat的创建

Mat类似Python中的矩阵,常用来储存图像的通道数据


1. Mat 介绍

  • Mat 由两部分组成:

    矩阵头: 包含矩阵尺寸、存储方法等

    uchar* data: 指向存储数据的矩阵指针



2. Mat 的创建

#include<opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<iostream>
#include<string>

using namespace std;
using namespace cv;


void close_log() {
    utils::logging::setLogLevel(utils::logging::LOG_LEVEL_ERROR);
}

// Mat的创建
void mat_creat() {
    Mat m1;					// 无初始化矩阵

    Mat m2(100, 100, CV_8UC3, Scalar(0,0,255));	// 创建 100行100列,8位无符号字符型数据的三通道矩阵,颜色为(0,0,255)
    						// 同:Mat m2(Size(100, 100), CV_8UC3, Scalar(0, 0, 255));

    Mat m3(100, 100, CV_8UC3);			// 先创建矩阵,后指定通道的数值
    m3 = Scalar(255, 0, 0);

    Mat m4(m3);					// m4共享m3矩阵对象(深拷贝)

    Mat m5 = Mat::zeros(100, 100, CV_8UC3);	// 初始化全 0 矩阵,8位无符号字符型数据的三通道矩阵

    Mat m6 = Mat::zeros(m2.size(), m2.type());	// 初始化与m2相同大小,相同数据类型的矩阵,常用于初始化矩阵

    waitKey(0);
    destroyAllWindows();
}

int main() {
    close_log();
    mat_creat();

    return 0;
}


3. Mat 的拷贝函数

  • 浅拷贝:把数据复制出一份新的,储存在新的内存地址,与原数据互不干涉。

  • 深拷贝:把数据复制出一份新的,与原数据共用内存地址,原数据改变,也发生改变。

#include<opencv2/opencv.hpp>
#include <opencv2/core/utils/logger.hpp>
#include<iostream>
#include<string>

using namespace std;
using namespace cv;

void close_log() {
    utils::logging::setLogLevel(utils::logging::LOG_LEVEL_ERROR);
}

// mat 的浅拷贝和深拷贝
void mat_copy() {
    Mat imga, imgb, imgc, imgd, imge;
    imga = Mat::zeros(Size(100, 200), CV_8UC3);
    	
    // 浅拷贝,imgb, imgc的值等于 imga
    imgb = imga.clone();
    imgc.copyTo(imga);

    // 深拷贝,改变imgd, imge的值,imga也会改变
    imgd = imga;
    imge(imga);
}

int main() {
    close_log();
    mat_copy();

    return 0;
}
posted @ 2023-06-28 23:06  枫_Null  阅读(37)  评论(0)    收藏  举报