【OpenCV基础】Mat对象介绍并创建卷积核

本文详细介绍了OpenCV中Mat对象的由来、使用要点,包括如何进行完全复制,并展示了如何定义不同类型的Mat对象,如小数组和指定类型的图像。此外,文章还探讨了卷积的概念,提供了创建卷积核的方法,包括使用getStructuringElement API和自定义卷积核。通过对Mat对象的深入理解,有助于提升OpenCV图像处理的技能。
摘要由CSDN通过智能技术生成

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处


Mat对象

由来-图像的数据结构

iplimage是早期的图像数据结构,opencv自发布以来就一直存在的,是C语言风格的数据类型,需要开发者自己分配和管理内存,对大的程序使用它容易导致内存泄漏的问题。 Mat是opencv2之后引进opencv中的,能自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构,分为两个部分:头部和数据部分。
Mat的作用:主要用于存储图像。

Mat对象使用的四个要点

1.输出对象内存是自动分配的;
2.使用opencv的C++接口不需要考虑内存分配问题;
2.赋值和拷贝构造函数只会复制头部;
3.使用clone与copyto两个函数实现数据的完全复制。

两种完全复制Mat对象的方法

分别完全复制src、dst给对象m1和m2

Mat m1,m2;
    //克隆
	m1 = src.clone();
	//拷贝
	dst.copyTo = m2;

以上就是两种完全复制mat对象的方法。

定义一个小的数组(非常重要)

Mat_<double/char>表示既可以使用duble类型,也可以使用char类型。

Mat m3= (Mat_<double/char>(3,3)<<1,0,0,0,1,0,0,0,1);
cout << "m3" << endl << m3 << endl;

在这里插入图片描述

定义一个指定类型的Mat类

例如创建一个全黑的图像,其尺寸和类型跟src一样,如下代码:
注意:size()和type()都是函数,这里调用两个函数,所以要加上小括号。

Mat m1=Mat::zeros(src.size(),src.type());

自定义卷积核

严格意义上不是一个API,但是其格式如下:
Mat dst=Mat::zeros(src.size(),src.type());
其中src.type()有多种,常见的是CV_8UC1和CV_8UC3,分别表示(单通道)灰度图和(三通道)彩色图,其中8U表示像素值范围为0-255,共256。U-uchar无符号整型。

卷积核本质上也是Mat对象。

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	
	Mat kernel = Mat::ones(Size(3, 3),CV_8UC3);
	cout << kernel << endl;

	Mat kernel2 = Mat::ones(Size(3,3),CV_8UC1);
	cout << kernel2 << endl;

	Mat kernel3 = Mat::ones(Size(3, 3), CV_16UC1);
	cout << kernel3 << endl;
	waitKey(0);
	return 0;
}

在这里插入图片描述

对卷积的理解

在泛函分析中,卷积、旋积或摺积(英语:Convolution)是通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。

通过定义,我们再来理解一下卷积这个名词(注:只是为了帮助大家理解,这是我的个人理解,不一定具有严格的准确性,初学者可以借用这个理解方式快速了解卷积,如果有更完整,更准确的理解方式,还望大家能够评论一起交流):

卷:两个函数的反转和平移,可以理解为两个函数通过运算纠缠到了一起,卷到了一起。

积:积分(本质就是运算的求和)

转载原文链接:https://blog.csdn.net/shuiyixin/article/details/104438655

创建卷积核

创建卷积核的函数原型如下:

1.API-getStructuringElement

getStructuringElement(int shape, Size ksize, Point anchor)

函数中的参数含义如下:

1.int shape - 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
第一个参数表示卷积核的形状,有矩形、圆形、直线、钻石等,主要有如下几种选择:

(1)MORPH_RECT:矩形结构区域。

(2)MORPH_CROSS,十字形结构区域。

(3)MORPH_ELLIPSE,椭圆结构区域,内接于矩形Rect(0,0,esize.width,0.esize.height)的填充椭圆。

2.Size ksize- 卷积核的大小

3.Point anchor - 锚点 默认是Point(-1, -1)意思就是中心像素

例如:getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

2.自定义一个卷积核

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	Mat  kernel1 = Mat::ones(Size(3, 3), CV_32F) / 4;
	Mat kernel2 = (Mat_<int>(2, 2) << 1, 0, 0, -1);
	cout << kernel1<< endl;
   cout << kernel2<< endl;
	waitKey(0);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌小超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值