(3)OpenCV 4 学习之图像创建与赋值

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zl_95520/article/details/88836651

前言:

最近心血来潮,想具体的去学习一下图像处理,所以报了知识星球的一个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

二、示例

#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;
}

三、结果

依旧女神镇楼!
在这里插入图片描述

四、官方教程

传送门:官方教程 ---- copyTo、clone
传送门:官方教程 ---- zeros、ones

猜你喜欢

转载自blog.csdn.net/zl_95520/article/details/88836651
今日推荐