【OpenCV + VS】OpenCV中Mat对象的创建与赋值操作

        在OpenCV中,
Mat
(矩阵)是用于存储图像数据的主要数据结构。掌握如何创建、复制、赋值和初始化
Mat
对象是学习图像处理的基础。

一、Mat对象的创建方法

使用已有图像对象创建新
Mat
对象

克隆(
clone()


clone()
方法用于创建一个新的
Mat
对象,并将原图像的内容完整复制到新图像中。通过克隆,可以独立操作新图像,原图像不受影响。


Mat m1 = src.clone();  // 克隆src图像

复制(
copyTo()


copyTo()
方法将原图像的内容复制到另一个
Mat
对象中。与
clone()
方法类似,不同之处在于
copyTo()
通常用于将图像复制到已有的目标矩阵中。



Mat m2;
src.copyTo(m2);  // 将src图像复制到m2中

赋值(直接赋值)
通过直接赋值,可以将一个
Mat
对象的内容赋给另一个
Mat
对象。需要注意的是,这种赋值方式会让两个
Mat
对象共享相同的数据,因此对其中一个对象的修改也会影响另一个对象。


Mat m3 = src;  // 直接赋值,m3和src共享相同的数据

创建空白图像

创建零矩阵(
Mat::zeros()


Mat::zeros()
方法创建一个指定大小和类型的空白图像,所有像素值初始化为0。可以通过传递图像的尺寸和类型来创建不同的图像。



// 创建一个与src图像相同大小和类型的零矩阵
Mat m4 = Mat::zeros(src.size(), src.type());
 
// 创建一个大小为512x512,三通道(CV_8UC3)的零矩阵
Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);

创建单通道和三通道的空白图像
OpenCV允许创建不同通道数的空白图像(例如,单通道图像和三通道图像)。



// 创建一个单通道的空白图像(512x512,单通道)
Mat m8 = Mat::zeros(Size(512, 512), CV_8UC1);
 
// 创建一个三通道的空白图像(512x512,三通道)
Mat m9 = Mat::zeros(Size(512, 512), CV_8UC3);

为图像赋标量值(
Scalar

使用
Scalar
可以给图像的所有像素赋一个统一的值。对于三通道图像,
Scalar
接收一个包含三个值的对象,分别对应BGR通道的值。



// 给三通道空白图像m9赋一个标量值,表示BGR通道值
m9 = Scalar(0, 128, 64);  // 蓝色0,绿色128,红色64

显示图像

使用
imshow()
函数来显示图像窗口。
imshow()
函数接收两个参数,第一个是窗口的名称,第二个是要显示的图像。



imshow("窗口1", m1);  // 显示m1图像
imshow("窗口2", m2);  // 显示m2图像
imshow("窗口3", m3);  // 显示m3图像
二、代码示例解析

以下是一个关于如何创建和操作
Mat
对象的完整代码示例:



void Qmat_creation_demo(Mat& image) {
    Mat src = image;  // 传入图像,作为源图像
 
    // 1. 使用克隆创建新图像
    Mat m1 = src.clone();
 
    // 2. 使用copyTo复制图像
    Mat m2;
    src.copyTo(m2);
 
    // 3. 使用赋值操作创建新图像(共享数据)
    Mat m3 = src;
 
    // 4. 创建空白图像(与src大小相同)
    Mat m4 = Mat::zeros(src.size(), src.type());
 
    // 5. 创建固定尺寸的空白图像
    Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);
 
    // 6. 显示图像
    imshow("窗口1", m1);  // 显示克隆图像
    imshow("窗口2", m2);  // 显示复制图像
    imshow("窗口3", m3);  // 显示赋值图像
 
    // 等待用户按键
    //cv::waitKey(0);
 
    // 7. 进一步赋值,创建空白图像并赋标量值
    Mat m6, m7;
    m6 = image.clone();  // 克隆图像
    image.copyTo(m7);    // 复制图像
 
    // 8. 创建单通道和三通道的空白图像
    Mat m8 = Mat::zeros(Size(512, 512), CV_8UC1);  // 单通道图像
    Mat m9 = Mat::zeros(Size(512, 512), CV_8UC3);  // 三通道图像
 
    // 9. 给三通道图像赋值
    m9 = Scalar(0, 128, 64);  // 给三通道图像赋BGR值
 
    // 输出图像的宽度、高度和通道数
    std::cout << "width: " << m9.cols << " height: " << m9.rows << " channels: " << m9.channels() << std::endl;
 
    // 输出图像的内容
    //std::cout << m9 << std::endl;
 
	imshow("窗口4", m6);
	imshow("窗口5", m7);
	imshow("窗口6", m8);
	imshow("窗口7", m9);
 
    // 等待用户按键
    cv::waitKey(0);  // 保持窗口直到用户按键
}
 
 
int main()
{
    //ShowOnePicture();
    //test02();
    Mat image = cv::imread("恐非太.jpg");
    Qmat_creation_demo(image);
    return 0;
}

【OpenCV + VS】OpenCV中Mat对象的创建与赋值操作

在这段代码中,我们通过多种方式创建了
Mat
对象,包括克隆、复制、赋值以及创建空白图像。每个方法的选择取决于具体的需求:

克隆和复制适用于需要保留原图像数据独立副本的场景。

赋值用于共享图像数据,注意修改副本时会影响原图。

创建空白图像适用于需要初始化图像空间的场景,常见于图像处理算法中的中间结果存储。

三、总结

在OpenCV中,
Mat
是图像处理的核心数据结构,掌握如何创建、复制和赋值
Mat
对象是图像处理的基础。我们可以使用不同的方法(如克隆、复制、赋值)来管理图像数据,并通过各种方式初始化空白图像。

© 版权声明

相关文章

暂无评论

none
暂无评论...