OpenCV学习--腐蚀与膨胀

主要学习函数 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: 腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。否则,我们就要明确指定它的形状,

可以使用函数getStructuringElement:

Mat element = getStructuringElement(dilation_type, Size(2*dilation_size+1, 2*dilation_size+1));

有三种内核可以选择

1,矩形: MORPH_RECT

2,交叉形: MORPH_CROSS

3,椭圆形: MORPH_ELLIPSE

然后,我们还需要指定内核大小,以及 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。

下面就贴出相关的代码,如果你想更清楚的了解这两个操作可以点击这个链接

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html#morphology-1

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





你可能感兴趣的:(opencv,腐蚀与膨胀)