(3)OpenCV 4 学习之图像创建与赋值
前言:
最近心血来潮,想具体的去学习一下图像处理,所以报了知识星球的一个OpenCV研习社,将自己每天的学习,分享一下。写个 blog 加深一下知识。
一、函数解析
1、copyTo 、clone、= (图像赋值)
void copyTo( OutputArray m ) const;
参数一:目标矩阵(输出的图片)。 如果在操作之前没有适当的大小或类型,则重新分配。
对于clone 函数我们可以先看一下它的定义,它是一个内联函数,返回值为 Mat,函数体部分调用的还是 copyTo() 函数
inline Mat Mat::clone() const
{
Mat m;
copyTo(m);
return m;
}
虽然都是图像对象的赋值,但是本质上还是有区别的,克隆和复制都是另外开辟的内存空间,而复制是共享同一块内存空间的。
可以根据下图加深理解:
2、Mat::zeros、Mat::ones、Mat::eye(图像创建)
static MatExpr zeros(Size size, int type);
参数一:替代矩阵大小规范大小(cols,rows)。
参数二:创建矩阵类型。
功能:返回指定大小和类型的零数组。
static MatExpr ones(Size size, int type);
参数一:替代矩阵大小规范大小(cols,rows)。
参数二:创建矩阵类型。
功能:返回指定大小和类型的所有1的数组。类似于 Mat::zeros
static MatExpr eye(Size size, int type);
参数一:替代矩阵大小规范大小(cols,rows)。
参数二:创建矩阵类型。
功能:返回指定大小和类型的标识矩阵。类似于 Mat::zeros 、 Mat::ones
3、示例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
Mat src = imread("F:/Cvimage/test.png");
if (src.empty())
{
printf("could not load image!\n");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//创建方法 - 克隆
Mat m1 = src.clone();
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input1", m1);
//复制
Mat m2;
src.copyTo(m2);
//赋值法
Mat m3 = src;
//创建空白图像
Mat m4 = Mat::zeros(src.size(), src.type());
Mat m5 = Mat::zeros(Size(512, 512), CV_8UC3);
Mat m6 = Mat::ones(Size(512, 512), CV_8UC3);
namedWindow("input2", WINDOW_AUTOSIZE);
imshow("input2", m4);
//创建一个 3*3 的数组
Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0,
-1, -5, -1,
0, -1, 0);
waitKey(0);
return 0;
}
4、结果
依旧女神镇楼!