主要学习函数 createTrackbar 如何创建 trackbar,和编写回调函数
erode 腐蚀图像
dilate 膨胀操作
int createTrackbar(const string& trackbarname, const string& winname, int* value, int count,
CvTrackbarCallbackonChange=0, void* userdata=0)
trackbarname -- Trackbar名字
winname-- 指定trackbar的父窗口
value -- 关联变量,改动trackbar位置,value值会跟着改变
count-- 指定trackbar的最大值,最小值默认为0
onChange-- 回调函数直接传递函数名即可,但函数形式应该这样void Foo(int,void*),第一个参数是trackbar当前位置,第二个参数是用户数据(见下一个参数)。如果该参数为NULL,则只更新 value值
userdata-- 用户自定义的数据类型,可以用来处理trackbar事件而不使用全局变量
void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1,
intborderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )
这个函数主要说明一下 kernel 参数
element: 腐蚀操作的内核。 如果不指定,默认为一个简单的 矩阵。否则,我们就要明确指定它的形状,
可以使用函数getStructuringElement:
Mat element = getStructuringElement(dilation_type, Size(2*dilation_size+1, 2*dilation_size+1));
1,矩形: MORPH_RECT
2,交叉形: MORPH_CROSS
3,椭圆形: MORPH_ELLIPSE
然后,我们还需要指定内核大小,以及 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。
下面就贴出相关的代码,如果你想更清楚的了解这两个操作可以点击这个链接
#include "stdafx.h"
#include "Morphology_1.h"
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
//全局变量
Mat src, erosion_dst, dilation_dst;
int erosion_elem = 0;
int erosion_size = 0;
int dilation_elem = 0;
int dilation_size = 0;
const int max_elem = 2;
const int max_kernel_size = 21;
//回调函数
void Erosion( int, void* );
void Dilation( int, void* );
void morphology1_test()
{
src = imread("left08.jpg");
if(src.empty())
return;
//创建显示窗口
namedWindow("Erosion Demo", CV_WINDOW_AUTOSIZE);
namedWindow("Dilation Demo", CV_WINDOW_AUTOSIZE);
// cvMoveWindow("Dilation Demo", 0, 0);
//创建腐蚀 trackbar
createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
&erosion_elem, max_elem, Erosion);
createTrackbar("Kernel Size:\n 2n+1", "Erosion Demo",
&erosion_size, max_kernel_size, Erosion);
createTrackbar("Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
&dilation_elem, max_elem, Dilation);
createTrackbar("Kernel Size:\n 2n+1", "Dilation Demo",
&dilation_size, max_kernel_size, Dilation);
Erosion(0, 0);
Dilation(0, 0);
}
void Erosion( int, void* )
{
int erosion_type;
if(erosion_elem==0) erosion_type = MORPH_RECT;
else if(erosion_elem == 1) erosion_type = MORPH_CROSS;
else if(erosion_elem == 2) erosion_type = MORPH_ELLIPSE;
Mat element = getStructuringElement(erosion_type,
Size(2*erosion_size+1, 2*erosion_size+1)
);
//腐蚀操作
erode(src, erosion_dst, element);
imshow("Erosion Demo", erosion_dst);
}
void Dilation( int, void* )
{
int dilation_type;
if(dilation_elem == 0) dilation_type = MORPH_RECT;
else if(dilation_elem == 1) dilation_type = MORPH_CROSS;
else if(dilation_elem == 2) dilation_type = MORPH_ELLIPSE;
Mat element = getStructuringElement(dilation_type, Size(2*dilation_size+1, 2*dilation_size+1));
//膨胀操作
dilate(src, dilation_dst, element);
imshow("Dilation Demo", dilation_dst);
}