主要学习函数 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
然后,我们还需要指定内核大小,以及 锚点 位置。不指定锚点位置,则默认锚点在内核中心位置。
下面就贴出相关的代码,如果你想更清楚的了解这两个操作可以点击这个链接
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); }