您的位置:首页 > 运维架构

Opencv形态学滤波-综合

2015-09-17 23:07 489 查看
#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat srcImage, dstImage;
int g_nDilorEro = 0, g_nValue = 0, g_nWay = 0;
Mat DilateElement, ErodeElement, Element;

//有滚动条事件时,可以进入回调函数
void on_Trackbar(int, void *)
{
if (g_nDilorEro == 0)
{
Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
morphologyEx(srcImage, dstImage, CV_MOP_DILATE, Element);
imshow("【形态学滤波窗口】", dstImage);
}
else if (g_nDilorEro == 1)
{
Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
morphologyEx(srcImage, dstImage, CV_MOP_ERODE, Element);
imshow("【形态学滤波窗口】", dstImage);
}
else if (g_nDilorEro == 2)
{
Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
morphologyEx(srcImage, dstImage, CV_MOP_OPEN, Element);
imshow("【形态学滤波窗口】", dstImage);
}
else if (g_nDilorEro == 3)
{
Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
morphologyEx(srcImage, dstImage, CV_MOP_CLOSE, Element);
imshow("【形态学滤波窗口】", dstImage);
}
else if (g_nDilorEro == 4)
{
Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
morphologyEx(srcImage, dstImage, CV_MOP_GRADIENT, Element);
imshow("【形态学滤波窗口】", dstImage);
}
else if (g_nDilorEro == 5)
{
Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
morphologyEx(srcImage, dstImage, CV_MOP_TOPHAT, Element);
imshow("【形态学滤波窗口】", dstImage);
}
else
{
Element = getStructuringElement(g_nWay, Size(2 * g_nValue + 1, 2 * g_nValue + 1));
morphologyEx(srcImage, dstImage, CV_MOP_BLACKHAT, Element);
imshow("【形态学滤波窗口】", dstImage);
}
}

int main()
{
srcImage = imread("tiger.jpg");
imshow("【原图】", srcImage);
dstImage.create(srcImage.size(), srcImage.type());

//选择形态学滤波方式  0代表是膨胀运算,1代表是腐蚀运算,2代表是开运算,3代表是闭运算,4代表是形态学梯度,5代表是顶帽
//6代表是黑帽
namedWindow("【滚动条窗口】");
createTrackbar("1234567", "【滚动条窗口】", &g_nDilorEro, 6, on_Trackbar);
on_Trackbar(g_nDilorEro, 0);
createTrackbar("Value", "【滚动条窗口】", &g_nValue, 100, on_Trackbar);
on_Trackbar(g_nValue, 0);
createTrackbar("way", "【滚动条窗口】", &g_nWay, 2, on_Trackbar);
on_Trackbar(g_nWay, 0);

char c;
char name[50];
int num = 0;
while (1)
{
//获取按键值
c = waitKey(0);

//如果按下键盘的Esc就表示是退出
if (c == 27)
break;
//如果按下空格键就保存照片
if (c == 32)
{
sprintf(name, "照片%d.jpg", num++);
imwrite(name, dstImage);
}
}

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: