【OpenCV入门教程之十一】 形态学图像处理 二开运算 闭运算 形态学梯度( 七 )


另外 , 还可以通过键盘按键1,2,3以及空格 , 来调节成不同的元素结构(矩形、椭圆、十字形) 。说明页面如下:

【OpenCV入门教程之十一】 形态学图像处理 二开运算 闭运算 形态学梯度

文章插图
废话不多说 , 上代码吧:
//-----------------------------------【程序说明】----------------------------------------------//程序名称::《【OpenCV入门教程之十一】形态学图像处理(一):膨胀与腐蚀》 博文配套源码 //开发所用IDE版本:Visual Studio 2010//开发所用OpenCV版本: 2.4.8//2014年4月25日 Create by 浅墨//----------------------------------------------------------------------------------------------//-----------------------------------【头文件包含部分】---------------------------------------//描述:包含程序所依赖的头文件//---------------------------------------------------------------------------------------------- #include #include #include //-----------------------------------【命名空间声明部分】--------------------------------------//描述:包含程序所使用的命名空间//----------------------------------------------------------------------------------------------- using namespace std;using namespace cv;//-----------------------------------【全局变量声明部分】--------------------------------------//描述:全局变量声明//-----------------------------------------------------------------------------------------------Mat g_srcImage, g_dstImage;//原始图和效果图int g_nElementShape = MORPH_RECT;//元素结构的形状//变量接收的TrackBar位置参数int g_nMaxIterationNum = 10;int g_nOpenCloseNum = 0;int g_nErodeDilateNum = 0;int g_nTopBlackHatNum = 0;//-----------------------------------【全局函数声明部分】--------------------------------------//描述:全局函数声明//-----------------------------------------------------------------------------------------------static void on_OpenClose(int, void*);//回调函数static void on_ErodeDilate(int, void*);//回调函数static void on_TopBlackHat(int, void*);//回调函数static void ShowHelpText();//帮助文字显示//-----------------------------------【main( )函数】--------------------------------------------//描述:控制台应用程序的入口函数 , 我们的程序从这里开始//-----------------------------------------------------------------------------------------------int main( ){ //改变console字体颜色 system("color 2F");ShowHelpText(); //载入原图 g_srcImage = imread("1.jpg");//工程目录下需要有一张名为1.jpg的素材图 if( !g_srcImage.data ) { printf("Oh , no , 读取srcImage错误~! \n"); return false; } //显示原始图 namedWindow("【原始图】"); imshow("【原始图】", g_srcImage); //创建三个窗口 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); //轮询获取按键信息 while(1) {int c;//执行回调函数on_OpenClose(g_nOpenCloseNum, 0);on_ErodeDilate(g_nErodeDilateNum, 0);on_TopBlackHat(g_nTopBlackHatNum,0);//获取按键c = waitKey(0);//按下键盘按键Q或者ESC , 程序退出if( (char)c == 'q'||(char)c == 27 )break;//按下键盘按键1 , 使用椭圆(Elliptic)结构元素结构元素MORPH_ELLIPSEif( (char)c == 49 )//键盘按键1的ASII码为49g_nElementShape = MORPH_ELLIPSE;//按下键盘按键2 , 使用矩形(Rectangle)结构元素MORPH_RECTelse if( (char)c == 50 )//键盘按键2的ASII码为50g_nElementShape = MORPH_RECT;//按下键盘按键3 , 使用十字形(Cross-shaped)结构元素MORPH_CROSSelse if( (char)c == 51 )//键盘按键3的ASII码为51g_nElementShape = MORPH_CROSS;//按下键盘按键space , 在矩形、椭圆、十字形结构元素中循环else if( (char)c == ' ' )g_nElementShape = (g_nElementShape + 1) % 3; } return 0;}//-----------------------------------【on_OpenClose( )函数】----------------------------------//描述:【开运算/闭运算】窗口的回调函数//-----------------------------------------------------------------------------------------------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