morphology2.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #include "opencv2/imgproc.hpp"
  2. #include "opencv2/imgcodecs.hpp"
  3. #include "opencv2/highgui.hpp"
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string>
  7. using namespace cv;
  8. static void help(char** argv)
  9. {
  10. printf("\nShow off image morphology: erosion, dialation, open and close\n"
  11. "Call:\n %s [image]\n"
  12. "This program also shows use of rect, ellipse, cross and diamond kernels\n\n", argv[0]);
  13. printf( "Hot keys: \n"
  14. "\tESC - quit the program\n"
  15. "\tr - use rectangle structuring element\n"
  16. "\te - use elliptic structuring element\n"
  17. "\tc - use cross-shaped structuring element\n"
  18. "\td - use diamond-shaped structuring element\n"
  19. "\tSPACE - loop through all the options\n" );
  20. }
  21. Mat src, dst;
  22. int element_shape = MORPH_RECT;
  23. //the address of variable which receives trackbar position update
  24. int max_iters = 10;
  25. int open_close_pos = 0;
  26. int erode_dilate_pos = 0;
  27. // callback function for open/close trackbar
  28. static void OpenClose(int, void*)
  29. {
  30. int n = open_close_pos;
  31. int an = abs(n);
  32. Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );
  33. if( n < 0 )
  34. morphologyEx(src, dst, MORPH_OPEN, element);
  35. else
  36. morphologyEx(src, dst, MORPH_CLOSE, element);
  37. imshow("Open/Close",dst);
  38. }
  39. // callback function for erode/dilate trackbar
  40. static void ErodeDilate(int, void*)
  41. {
  42. int n = erode_dilate_pos;
  43. int an = abs(n);
  44. Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );
  45. if( n < 0 )
  46. erode(src, dst, element);
  47. else
  48. dilate(src, dst, element);
  49. imshow("Erode/Dilate",dst);
  50. }
  51. int main( int argc, char** argv )
  52. {
  53. cv::CommandLineParser parser(argc, argv, "{help h||}{ @image | baboon.jpg | }");
  54. if (parser.has("help"))
  55. {
  56. help(argv);
  57. return 0;
  58. }
  59. std::string filename = samples::findFile(parser.get<std::string>("@image"));
  60. if( (src = imread(filename,IMREAD_COLOR)).empty() )
  61. {
  62. help(argv);
  63. return -1;
  64. }
  65. //create windows for output images
  66. namedWindow("Open/Close",1);
  67. namedWindow("Erode/Dilate",1);
  68. open_close_pos = erode_dilate_pos = max_iters;
  69. createTrackbar("iterations", "Open/Close",&open_close_pos,max_iters*2+1,OpenClose);
  70. setTrackbarMin("iterations", "Open/Close", -max_iters);
  71. setTrackbarMax("iterations", "Open/Close", max_iters);
  72. setTrackbarPos("iterations", "Open/Close", 0);
  73. createTrackbar("iterations", "Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);
  74. setTrackbarMin("iterations", "Erode/Dilate", -max_iters);
  75. setTrackbarMax("iterations", "Erode/Dilate", max_iters);
  76. setTrackbarPos("iterations", "Erode/Dilate", 0);
  77. for(;;)
  78. {
  79. OpenClose(open_close_pos, 0);
  80. ErodeDilate(erode_dilate_pos, 0);
  81. char c = (char)waitKey(0);
  82. if( c == 27 )
  83. break;
  84. if( c == 'e' )
  85. element_shape = MORPH_ELLIPSE;
  86. else if( c == 'r' )
  87. element_shape = MORPH_RECT;
  88. else if( c == 'c' )
  89. element_shape = MORPH_CROSS;
  90. else if( c == 'd' )
  91. element_shape = MORPH_DIAMOND;
  92. else if( c == ' ' )
  93. element_shape = (element_shape + 1) % 4;
  94. }
  95. return 0;
  96. }