📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【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;
}