Advertisement

OpenCV形态morphology的实例(附完整代码)

阅读量:

该实例展示了如何使用OpenCV进行形态学操作(侵蚀与膨胀)。代码包括以下主要内容:
环境设置:

  • 包括opencv2/imgproc.hpp、opencv2/highgui.hpp等头文件
  • 使用cv::Mat处理图像数据
    主要变量:
  • erosion_elem:结构化元素类型(矩形/十字/椭圆)
  • erosion_size:核尺寸
  • dilation_elem: dilation结构化元素类型
  • dilation_size: dilation核尺寸
    功能模块:
  • 主函数加载图像并创建两个窗口展示侵蚀与膨胀结果
  • 通过滑动条控制侵蚀与膨胀的结构化元素类型及尺寸
  • 实现了两个核心功能:
  • Erosion():执行侵蚀操作
  • Dilation():执行膨胀操作
    运行结果:
  • 显示两个窗口:“Erosion Demo”展示侵蚀结果
  • 显示“Dilation Demo”展示膨胀结果

OpenCV形态morphology的实例

    • OpenCV形态morphology的实例

OpenCV形态morphology的实例

复制代码
    #include "opencv2/imgproc.hpp"
    #include "opencv2/highgui.hpp"
    #include <iostream>
    using namespace cv;
    using namespace std;
    Mat src, erosion_dst, dilation_dst;
    int erosion_elem = 0;
    int erosion_size = 0;
    int dilation_elem = 0;
    int dilation_size = 0;
    int const max_elem = 2;
    int const max_kernel_size = 21;
    /** Function Headers */
    void Erosion( int, void* );
    void Dilation( int, void* );
    int main( int argc, char** argv )
    {
      /// Load an image
      CommandLineParser parser( argc, argv, "{@input | LinuxLogo.jpg | input image}" );
      src = imread( samples::findFile( parser.get<String>( "@input" ) ), IMREAD_COLOR );
      if( src.empty() )
      {
    cout << "Could not open or find the image!\n" << endl;
    cout << "Usage: " << argv[0] << " <Input image>" << endl;
    return -1;
      }
    
      /// Create windows
      namedWindow( "Erosion Demo", WINDOW_AUTOSIZE );
      namedWindow( "Dilation Demo", WINDOW_AUTOSIZE );
      moveWindow( "Dilation Demo", src.cols, 0 );
    
      /// Create Erosion Trackbar
      createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Erosion Demo",
          &erosion_elem, max_elem,
          Erosion );
    
      createTrackbar( "Kernel size:\n 2n +1", "Erosion Demo",
          &erosion_size, max_kernel_size,
          Erosion );
    
      /// Create Dilation Trackbar
      createTrackbar( "Element:\n 0: Rect \n 1: Cross \n 2: Ellipse", "Dilation Demo",
          &dilation_elem, max_elem,
          Dilation );
    
      createTrackbar( "Kernel size:\n 2n +1", "Dilation Demo",
          &dilation_size, max_kernel_size,
          Dilation );
    
      /// Default start
      Erosion( 0, 0 );
      Dilation( 0, 0 );
    
      waitKey(0);
      return 0;
    }
    //![main]
    
    //![erosion]
    /** * @function Erosion
     */
    void Erosion( int, void* )
    {
      int erosion_type = 0;
      if( erosion_elem == 0 ){ erosion_type = MORPH_RECT; }
      else if( erosion_elem == 1 ){ erosion_type = MORPH_CROSS; }
      else if( erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; }
    
      //![kernel]
      Mat element = getStructuringElement( erosion_type,
                       Size( 2*erosion_size + 1, 2*erosion_size+1 ),
                       Point( erosion_size, erosion_size ) );
      //![kernel]
    
      /// Apply the erosion operation
      erode( src, erosion_dst, element );
      imshow( "Erosion Demo", erosion_dst );
    }
    //![erosion]
    
    //![dilation]
    /** * @function Dilation
     */
    void Dilation( int, void* )
    {
      int dilation_type = 0;
      if( dilation_elem == 0 ){ dilation_type = MORPH_RECT; }
      else if( dilation_elem == 1 ){ dilation_type = MORPH_CROSS; }
      else if( dilation_elem == 2) { dilation_type = MORPH_ELLIPSE; }
    
      Mat element = getStructuringElement( dilation_type,
                       Size( 2*dilation_size + 1, 2*dilation_size+1 ),
                       Point( dilation_size, dilation_size ) );
    
      /// Apply the dilation operation
      dilate( src, dilation_dst, element );
      imshow( "Dilation Demo", dilation_dst );
    }
    //![dilation]

全部评论 (0)

还没有任何评论哟~