Blame view

3rdparty/opencv-4.5.4/samples/cpp/lsd_lines.cpp 2.1 KB
f4334277   Hu Chunming   提交3rdparty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  #include "opencv2/imgproc.hpp"
  #include "opencv2/imgcodecs.hpp"
  #include "opencv2/highgui.hpp"
  #include <iostream>
  
  using namespace std;
  using namespace cv;
  
  int main(int argc, char** argv)
  {
      cv::CommandLineParser parser(argc, argv,
                                   "{input   i|building.jpg|input image}"
                                   "{refine  r|false|if true use LSD_REFINE_STD method, if false use LSD_REFINE_NONE method}"
                                   "{canny   c|false|use Canny edge detector}"
                                   "{overlay o|false|show result on input image}"
                                   "{help    h|false|show help message}");
  
      if (parser.get<bool>("help"))
      {
          parser.printMessage();
          return 0;
      }
  
      parser.printMessage();
  
      String filename = samples::findFile(parser.get<String>("input"));
      bool useRefine = parser.get<bool>("refine");
      bool useCanny = parser.get<bool>("canny");
      bool overlay = parser.get<bool>("overlay");
  
      Mat image = imread(filename, IMREAD_GRAYSCALE);
  
      if( image.empty() )
      {
          cout << "Unable to load " << filename;
          return 1;
      }
  
      imshow("Source Image", image);
  
      if (useCanny)
      {
          Canny(image, image, 50, 200, 3); // Apply Canny edge detector
      }
  
      // Create and LSD detector with standard or no refinement.
      Ptr<LineSegmentDetector> ls = useRefine ? createLineSegmentDetector(LSD_REFINE_STD) : createLineSegmentDetector(LSD_REFINE_NONE);
  
      double start = double(getTickCount());
      vector<Vec4f> lines_std;
  
      // Detect the lines
      ls->detect(image, lines_std);
  
      double duration_ms = (double(getTickCount()) - start) * 1000 / getTickFrequency();
      std::cout << "It took " << duration_ms << " ms." << std::endl;
  
      // Show found lines
      if (!overlay || useCanny)
      {
          image = Scalar(0, 0, 0);
      }
  
      ls->drawSegments(image, lines_std);
  
      String window_name = useRefine ? "Result - standard refinement" : "Result - no refinement";
      window_name += useCanny ? " - Canny edge detector used" : "";
  
      imshow(window_name, image);
  
      waitKey();
      return 0;
  }