- 学习方法总结:
- 通过视频学习初步了解理论知识点+相关API用法
- 梳理知识点,从课本中查阅相关数学理论支撑
- 回调函数:主函数调用回调函数,主函数执行完毕后, 执行回调函数
-
createTrackbar
- 原型: createTrackbar(const String& trackbarname, const String& winname,int* value, int count,TrackbarCallback onChange = 0, void* userdata = 0);
- 实例: createTrackbar("Element Size", "dst_image", &element_size, max_size,CallBack_Dem);
- 参数:滑动控件名称,显示在的窗口名称, 初始化阈值(形参指针,故传地址), 控件刻度最大值, 回调函数
- 回调函数可以理解为一个函数变量
- 回调函数原型是void (*TrackbarCallback)(int pos, void* userdata);
- (*TrackbarCallback)为函数void (int pos,void* userdata)的别名
- 回调函数是专门为滑动控件而产生的,
- 第一个形参pos,它表示的是当前滑块所在的位置,它的值是createTrackbar()传给他的,就是初始化阈值
-
getStructuringElement
- 得到一个结构元素, 如何理解???
- 可以这么理解,之前定义filter\kernel都是先用Mat声明一个对象,然后元素逐个赋值,比较麻烦,这里opencv封装了一个函数,直接指定参数就可以得到一个同样的东西, 只是封装了一下步骤,没有什么优化
- 用直接修改参数的方法得到一个kernel\filter
- getStructruingElement(shape, ksize, anchor=None);
- kernel形状: MORPH_RECT矩形, MORPH_CORSS交叉形, MORPH_ELLIPSE椭圆形
- kernel的维度尺寸, (n,n) ,如Size(3,3);
- 锚点, (-1,-1)为默认值
- 得到一个结构元素, 如何理解???
-
膨胀: 求局部最大值的操作
- 原理:膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积
- kernel可以是任何形状,它有一个单独定义的参考点, anchor锚点,kernel可以理解成filter掩膜等
- 而膨胀就是求局部最大值的操作,核B与图形卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素.这样就会使图像中的高亮区域逐渐增长
- 膨胀可以简单理解为将B与A接触的所有背景点合并到A中的过程。
- API: dilate
- dilate(src0, dst, structureElement, Point(-1, -1));
- 参数: 源图像, 结果图, kernel,anchor点(-1,-1为默认)
- 原理:膨胀或者腐蚀操作就是将图像(或图像的一部分区域,我们称之为A)与核(我们称之为B)进行卷积
-
腐蚀:腐蚀就是求局部最小值的操作。
- 原理:腐蚀可以理解为B的中心(锚点)沿着A的内边界走了一圈。腐蚀也是对高亮部分而言,A区域之外的部分 < A的高亮像素,所里里面被外面取代。A中能完全包含B的像素被留下来了。
- 腐蚀可以简单理解为消除物体A所有边界点的过程。
- API:erode(src0, dst, structureElement, Point(-1, -1);
- 原理:腐蚀可以理解为B的中心(锚点)沿着A的内边界走了一圈。腐蚀也是对高亮部分而言,A区域之外的部分 < A的高亮像素,所里里面被外面取代。A中能完全包含B的像素被留下来了。
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace std;
using namespace cv;
Mat src0, src1, dst;
int element_size = 3;
int max_size = 21;
void CallBack_Dem(int, void*);
int main(int argc, char ** argv)
{
src0 = imread("C:\\Users\\xujin\\Desktop\\test0.JPG");
if (!src0.data)
{
cout << "no image";
return -1;
}
namedWindow("src0_image", WINDOW_AUTOSIZE);
imshow("src0_image", src0);
namedWindow("dst_image", WINDOW_AUTOSIZE);
createTrackbar("Element Size", "dst_image", &element_size, max_size,CallBack_Dem);
//CallBack_Dem(0, 0);
waitKey(0);
return 0;
}
void CallBack_Dem(int, void*)
{
int s = element_size * 2 + 1;
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
dilate(src0, dst, structureElement, Point(-1, -1));
//erode(src0, dst, structureElement, Point(-1, -1);
imshow("dst_image", dst);
return;
}
MillenniumFalcon 发布了11 篇原创文章 · 获赞 2 · 访问量 6985 私信 关注