打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OpenCV学习笔记

一个可以调节参数的形态学例题,用到的自定义核函数为:

  1. IplConvKernel * cvCreateStructuringElementEx(  
  2. int cols,  
  3. int rows,  
  4. int anchor_x,  
  5. int anchor_y,  
  6. int shape,  
  7. int *value=NULL  
  8. );  


函数中参数cols,rows确定了构造的矩形大小。

anchor_x,anchor_y确定了封闭矩形内参考点的横纵坐标。

shape是自定义核的形状,具体为

1.CV_SHAPE_RECT  核是矩形

2.CV_SHAPE_CROSS 核是勺子交叉形

3.CV_SHAPE_ELLIPSE 核是椭圆形

4.CV_SHAPE_CUSTOM 核是用户自定义类型


其释放函数为

  1. void cvReleaseStructuringElement( IplConvKernel **element);  

实例代码如下:

  1. #include <cv.h>   
  2. #include <highgui.h>   
  3. #include <stdlib.h>   
  4. #include <stdio.h>   
  5. IplImage* src = 0;  
  6. IplImage* dst = 0;  
  7. IplConvKernel* element = 0;  
  8. int element_shape = CV_SHAPE_RECT;  
  9. //the address of variable which receives trackbar position update    
  10. int max_iters = 10;  
  11. int open_close_pos = 0;  
  12. int erode_dilate_pos = 0;  
  13. // callback function for open/close trackbar   
  14. void OpenClose(int pos)     
  15. {  
  16.     int n = open_close_pos - max_iters;  
  17.     int an = n > 0 ? n : -n;  
  18.     element = cvCreateStructuringElementEx( an*2+1, an*2+1, an, an, element_shape, 0 );  
  19.     if( n < 0 )  
  20.     {  
  21.         cvErode(src,dst,element,1);  
  22.         cvDilate(dst,dst,element,1);  
  23.     }  
  24.     else  
  25.     {  
  26.         cvDilate(src,dst,element,1);  
  27.         cvErode(dst,dst,element,1);  
  28.     }  
  29.     cvReleaseStructuringElement(&element);  
  30.     cvShowImage("Open/Close",dst);  
  31. }    
  32. // callback function for erode/dilate trackbar   
  33. void ErodeDilate(int pos)     
  34. {  
  35.     int n = erode_dilate_pos - max_iters;  
  36.     int an = n > 0 ? n : -n;  
  37.     element = cvCreateStructuringElementEx( an*2+1, an*2+1, an, an, element_shape, 0 );  
  38.     if( n < 0 )  
  39.     {  
  40.         cvErode(src,dst,element,1);  
  41.     }  
  42.     else  
  43.     {  
  44.         cvDilate(src,dst,element,1);  
  45.     }  
  46.     cvReleaseStructuringElement(&element);  
  47.     cvShowImage("Erode/Dilate",dst);  
  48. }    
  49.   
  50. int main( int argc, char** argv )  
  51. {  
  52.     char* filename = argc == 2 ? argv[1] : (char*)"baboon.jpg";  
  53.     if( (src = cvLoadImage(filename,1)) == 0 )  
  54.         return -1;  
  55.     printf( "Hot keys: \n"  
  56.         "\tESC - quit the program\n"  
  57.         "\tr - use rectangle structuring element\n"  
  58.         "\te - use elliptic structuring element\n"  
  59.         "\tc - use cross-shaped structuring element\n"  
  60.         "\tENTER - loop through all the options\n" );  
  61.     dst = cvCloneImage(src);  
  62.     //create windows for output images   
  63.     cvNamedWindow("Open/Close",1);  
  64.     cvNamedWindow("Erode/Dilate",1);  
  65.     open_close_pos = erode_dilate_pos = max_iters;  
  66.     cvCreateTrackbar("iterations""Open/Close",&open_close_pos,max_iters*2+1,OpenClose);  
  67.     cvCreateTrackbar("iterations""Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);  
  68.     for(;;)  
  69.     {  
  70.         int c;  
  71.           
  72.         OpenClose(open_close_pos);  
  73.         ErodeDilate(erode_dilate_pos);  
  74.         c = cvWaitKey(0);  
  75.         if( (char)c == 27 )  
  76.             break;  
  77.         if( (char)c == 'e' )  
  78.             element_shape = CV_SHAPE_ELLIPSE;  
  79.         else if( (char)c == 'r' )  
  80.             element_shape = CV_SHAPE_RECT;  
  81.         else if( (char)c == 'c' )  
  82.             element_shape = CV_SHAPE_CROSS;  
  83.         else if( (char)c == '\n' )  
  84.             element_shape = (element_shape + 1) % 3;  
  85.     }  
  86.     //release images   
  87.     cvReleaseImage(&src);  
  88.     cvReleaseImage(&dst);  
  89.     //destroy windows    
  90.     cvDestroyWindow("Open/Close");   
  91.     cvDestroyWindow("Erode/Dilate");  
  92.     return 0;  
  93. }  

运行结果图为:


说明:

在此例题中开运算和闭运算都是通过腐蚀-膨胀来实现的,而在OpenCV中有封装好的开闭运算可以直接调用。该函数为

  1. void cvMorphologyEx(  
  2. const CvArr * src,  
  3. CvArr *dst,  
  4. CvArr *temp,  
  5. IplConvKernel *element,  
  6. int operation,  
  7. int iterations=1  
  8. )  

参考资料:

1.http://hi.baidu.com/shentuhongfeng/blog/item/077c2b63377dfc6c0c33fab8.html

2.学习OpenCV,于仕祺,刘瑞祯,清华大学出版社,134-139

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
腐蚀膨胀的快速实现
【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀
sunday 算法
鬼才把python当成PS用,抠图合成图片样样精通!
AI 图像智能修复老照片,效果惊艳到我了!| 附代码
【从零学习OpenCV 4】图像膨胀
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服