在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()
方法创建一个指定大小和类型的空白图像,所有像素值初始化为0。可以通过传递图像的尺寸和类型来创建不同的图像。
Mat::zeros()
// 创建一个与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接收一个包含三个值的对象,分别对应BGR通道的值。
Scalar
// 给三通道空白图像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;
}

在这段代码中,我们通过多种方式创建了对象,包括克隆、复制、赋值以及创建空白图像。每个方法的选择取决于具体的需求:
Mat
克隆和复制适用于需要保留原图像数据独立副本的场景。
赋值用于共享图像数据,注意修改副本时会影响原图。
创建空白图像适用于需要初始化图像空间的场景,常见于图像处理算法中的中间结果存储。
三、总结
在OpenCV中,是图像处理的核心数据结构,掌握如何创建、复制和赋值
Mat对象是图像处理的基础。我们可以使用不同的方法(如克隆、复制、赋值)来管理图像数据,并通过各种方式初始化空白图像。
Mat

