• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file Morphology_3(Extract_Lines).cpp
3  * @brief Use morphology transformations for extracting horizontal and vertical lines sample code
4  * @author OpenCV team
5  */
6 
7 #include <iostream>
8 #include <opencv2/opencv.hpp>
9 
10 using namespace std;
11 using namespace cv;
12 
main(int,char ** argv)13 int main(int, char** argv)
14 {
15 //! [load_image]
16     // Load the image
17     Mat src = imread(argv[1]);
18 
19     // Check if image is loaded fine
20     if(!src.data)
21         cerr << "Problem loading image!!!" << endl;
22 
23     // Show source image
24     imshow("src", src);
25 //! [load_image]
26 
27 //! [gray]
28     // Transform source image to gray if it is not
29     Mat gray;
30 
31     if (src.channels() == 3)
32     {
33         cvtColor(src, gray, CV_BGR2GRAY);
34     }
35     else
36     {
37         gray = src;
38     }
39 
40     // Show gray image
41     imshow("gray", gray);
42 //! [gray]
43 
44 //! [bin]
45     // Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol
46     Mat bw;
47     adaptiveThreshold(~gray, bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
48 
49     // Show binary image
50     imshow("binary", bw);
51 //! [bin]
52 
53 //! [init]
54     // Create the images that will use to extract the horizontal and vertical lines
55     Mat horizontal = bw.clone();
56     Mat vertical = bw.clone();
57 //! [init]
58 
59 //! [horiz]
60     // Specify size on horizontal axis
61     int horizontalsize = horizontal.cols / 30;
62 
63     // Create structure element for extracting horizontal lines through morphology operations
64     Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontalsize,1));
65 
66     // Apply morphology operations
67     erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));
68     dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));
69 
70     // Show extracted horizontal lines
71     imshow("horizontal", horizontal);
72 //! [horiz]
73 
74 //! [vert]
75     // Specify size on vertical axis
76     int verticalsize = vertical.rows / 30;
77 
78     // Create structure element for extracting vertical lines through morphology operations
79     Mat verticalStructure = getStructuringElement(MORPH_RECT, Size( 1,verticalsize));
80 
81     // Apply morphology operations
82     erode(vertical, vertical, verticalStructure, Point(-1, -1));
83     dilate(vertical, vertical, verticalStructure, Point(-1, -1));
84 
85     // Show extracted vertical lines
86     imshow("vertical", vertical);
87 //! [vert]
88 
89 //! [smooth]
90     // Inverse vertical image
91     bitwise_not(vertical, vertical);
92     imshow("vertical_bit", vertical);
93 
94     // Extract edges and smooth image according to the logic
95     // 1. extract edges
96     // 2. dilate(edges)
97     // 3. src.copyTo(smooth)
98     // 4. blur smooth img
99     // 5. smooth.copyTo(src, edges)
100 
101     // Step 1
102     Mat edges;
103     adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
104     imshow("edges", edges);
105 
106     // Step 2
107     Mat kernel = Mat::ones(2, 2, CV_8UC1);
108     dilate(edges, edges, kernel);
109     imshow("dilate", edges);
110 
111     // Step 3
112     Mat smooth;
113     vertical.copyTo(smooth);
114 
115     // Step 4
116     blur(smooth, smooth, Size(2, 2));
117 
118     // Step 5
119     smooth.copyTo(vertical, edges);
120 
121     // Show final result
122     imshow("smooth", vertical);
123 //! [smooth]
124 
125     waitKey(0);
126     return 0;
127 }