原理
程序
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat g_srcImage, g_dstImage; //原始图和效果图
int g_nTrackbarNumber = 0; //0表示腐蚀erode,1表示膨胀dilate
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
void process(); //膨胀和腐蚀的处理函数
void on_TrackNumChange(int, void *); //回调函数
void on_ElementSizeChange(int, void *); //回调函数
int main()
{
//载入原图
g_srcImage = imread("test.jpg");
if (!g_srcImage.data)
{
printf("读取srcImage错误!\n");
return -1;
}
//显示原始图
namedWindow("【原始图】");
imshow("【原始图】", g_srcImage);
//进行初次腐蚀操作并显示效果图
namedWindow("【效果图】");
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1), Point(g_nStructElementSize, g_nStructElementSize));
erode(g_srcImage, g_dstImage, element);
//创建轨迹条
createTrackbar("腐蚀/膨胀", "【效果图】", &g_nTrackbarNumber, 1, on_TrackNumChange);
createTrackbar("内核尺寸", "【效果图】", &g_nStructElementSize, 21, on_ElementSizeChange);
//轮询获取按键信息,若按下q键,程序退出
while (char(waitKey(1)) != 'q') {}
destroyAllWindows();
return 0;
}
void process()
{
Mat element = getStructuringElement(MORPH_RECT, Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1), Point(g_nStructElementSize, g_nStructElementSize));
//进行腐蚀或膨胀操作
if (g_nStructElementSize == 0)
{
erode(g_srcImage, g_dstImage, element);
}
else
{
dilate(g_srcImage, g_dstImage, element);
}
//显示效果图
imshow("【效果图】", g_dstImage);
}
void on_TrackNumChange(int, void *)
{
//腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次process函数,使改变后的效果立即生效并显示出来
process();
}
void on_ElementSizeChange(int, void *)
{
//腐蚀和膨胀之间效果已经切换,回调函数体内需调用一次process函数,使改变后的效果立即生效并显示出来
process();
}