// ConsoleApplication36.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
//************************************
// 形态学
//************************************
Mat g_srcImage, g_dstImage;
int g_nElementShape = MORPH_RECT;
int g_nMaxIterationNum = 10;
int g_nOpenCloseNum = 0;
int g_nErodeDilateNum = 0;
int g_nTopBlackHatNum = 0;
int g_nGradientNum = 0;
static void on_OpenClose(int, void *);
static void on_ErodeDilate(int, void *);
static void on_TopBlackHat(int, void *);
static void on_Gradient(int, void *);
static void ShowHelpText();
int main()
{
system("color 5E");
ShowHelpText();
g_srcImage = imread("C:/Users/hasee-pc/Desktop/girl.jpg");
if (!g_srcImage.data)
{
printf("error in srcImage\n");
return -1;
}
namedWindow("【原始图】");
imshow("【原始图】", g_srcImage);
namedWindow("【开运算/闭运算】", 1);
namedWindow("【腐蚀/膨胀】", 1);
namedWindow("【顶帽/黑帽】", 1);
namedWindow("【形态学梯度】", 1);
g_nOpenCloseNum = 9;
g_nErodeDilateNum = 9;
g_nTopBlackHatNum = 2;
createTrackbar("迭代值:", "【开运算/闭运算】", &g_nOpenCloseNum, g_nMaxIterationNum * 2 + 1, on_OpenClose);
createTrackbar("迭代值:", "【腐蚀/膨胀】", &g_nErodeDilateNum, g_nMaxIterationNum * 2 + 1, on_ErodeDilate);
createTrackbar("迭代值:", "【顶帽/黑帽】", &g_nTopBlackHatNum, g_nMaxIterationNum * 2 + 1, on_TopBlackHat);
createTrackbar("迭代值:", "【形态学梯度】", &g_nGradientNum, g_nMaxIterationNum + 1, on_Gradient);
while (1)
{
int c;
on_OpenClose(g_nOpenCloseNum, 0);
on_ErodeDilate(g_nErodeDilateNum, 0);
on_TopBlackHat(g_nTopBlackHatNum, 0);
on_Gradient(g_nGradientNum, 0);
c = waitKey(0);
if ((char)c == 'q' || char(c) == 27)
break;
if ((char)c == 49)//1 椭圆形
g_nElementShape = MORPH_ELLIPSE;
else if ((char)c == 50)//2 矩形
g_nElementShape = MORPH_RECT;
else if ((char)c == 51)//3 十字形
g_nElementShape = MORPH_CROSS;
else if ((char)c == ' ')// 空格 三种情况循环
g_nElementShape = (g_nElementShape + 1) % 3;
}
// while (char(waitKey(1) != 'q')) {}
waitKey(0);
}
static void on_Gradient(int, void *)
{
int Absolute_offset = g_nGradientNum;
Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
morphologyEx(g_srcImage, g_dstImage, MORPH_GRADIENT, element);
imshow("【形态学梯度】", g_dstImage);
}
static void on_OpenClose(int, void *)
{
int offset = g_nOpenCloseNum - g_nMaxIterationNum;//偏移量
int Absolute_offset = offset > 0 ? offset : -offset;//偏移量绝对值
Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
if (offset < 0)
{
morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element);
}
else
{
morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element);
}
imshow("【开运算/闭运算】", g_dstImage);
}
static void on_ErodeDilate(int, void *)
{
int offset = g_nErodeDilateNum - g_nMaxIterationNum;
int Absolute_offset = offset > 0 ? offset : -offset;
Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
if (offset < 0)
erode(g_srcImage, g_dstImage, element);
else
dilate(g_srcImage, g_dstImage, element);
imshow("【腐蚀/膨胀】", g_dstImage);
}
static void on_TopBlackHat(int, void *)
{
int offset = g_nTopBlackHatNum - g_nMaxIterationNum;
int Absolute_offset = offset > 0 ? offset : -offset;
Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1,Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset));
if (offset < 0)
morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT, element);
else
morphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element);
imshow("【顶帽/黑帽】", g_dstImage);
}
static void ShowHelpText()
{
cout << "1 ----> 表示椭圆形\n";
cout << "2 ----> 表示矩形\n";
cout << "3 ----> 表示十字形\n";
cout << "q ----> 退出\n";
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门提示:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件