127 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * @file Morphology_3(Extract_Lines).cpp
 | |
|  * @brief Use morphology transformations for extracting horizontal and vertical lines sample code
 | |
|  * @author OpenCV team
 | |
|  */
 | |
| 
 | |
| #include <iostream>
 | |
| #include <opencv2/opencv.hpp>
 | |
| 
 | |
| using namespace std;
 | |
| using namespace cv;
 | |
| 
 | |
| int main(int, char** argv)
 | |
| {
 | |
| //! [load_image]
 | |
|     // Load the image
 | |
|     Mat src = imread(argv[1]);
 | |
| 
 | |
|     // Check if image is loaded fine
 | |
|     if(!src.data)
 | |
|         cerr << "Problem loading image!!!" << endl;
 | |
| 
 | |
|     // Show source image
 | |
|     imshow("src", src);
 | |
| //! [load_image]
 | |
| 
 | |
| //! [gray]
 | |
|     // Transform source image to gray if it is not
 | |
|     Mat gray;
 | |
| 
 | |
|     if (src.channels() == 3)
 | |
|     {
 | |
|         cvtColor(src, gray, CV_BGR2GRAY);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         gray = src;
 | |
|     }
 | |
| 
 | |
|     // Show gray image
 | |
|     imshow("gray", gray);
 | |
| //! [gray]
 | |
| 
 | |
| //! [bin]
 | |
|     // Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol
 | |
|     Mat bw;
 | |
|     adaptiveThreshold(~gray, bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
 | |
| 
 | |
|     // Show binary image
 | |
|     imshow("binary", bw);
 | |
| //! [bin]
 | |
| 
 | |
| //! [init]
 | |
|     // Create the images that will use to extract the horizontal and vertical lines
 | |
|     Mat horizontal = bw.clone();
 | |
|     Mat vertical = bw.clone();
 | |
| //! [init]
 | |
| 
 | |
| //! [horiz]
 | |
|     // Specify size on horizontal axis
 | |
|     int horizontalsize = horizontal.cols / 30;
 | |
| 
 | |
|     // Create structure element for extracting horizontal lines through morphology operations
 | |
|     Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontalsize,1));
 | |
| 
 | |
|     // Apply morphology operations
 | |
|     erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));
 | |
|     dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));
 | |
| 
 | |
|     // Show extracted horizontal lines
 | |
|     imshow("horizontal", horizontal);
 | |
| //! [horiz]
 | |
| 
 | |
| //! [vert]
 | |
|     // Specify size on vertical axis
 | |
|     int verticalsize = vertical.rows / 30;
 | |
| 
 | |
|     // Create structure element for extracting vertical lines through morphology operations
 | |
|     Mat verticalStructure = getStructuringElement(MORPH_RECT, Size( 1,verticalsize));
 | |
| 
 | |
|     // Apply morphology operations
 | |
|     erode(vertical, vertical, verticalStructure, Point(-1, -1));
 | |
|     dilate(vertical, vertical, verticalStructure, Point(-1, -1));
 | |
| 
 | |
|     // Show extracted vertical lines
 | |
|     imshow("vertical", vertical);
 | |
| //! [vert]
 | |
| 
 | |
| //! [smooth]
 | |
|     // Inverse vertical image
 | |
|     bitwise_not(vertical, vertical);
 | |
|     imshow("vertical_bit", vertical);
 | |
| 
 | |
|     // Extract edges and smooth image according to the logic
 | |
|     // 1. extract edges
 | |
|     // 2. dilate(edges)
 | |
|     // 3. src.copyTo(smooth)
 | |
|     // 4. blur smooth img
 | |
|     // 5. smooth.copyTo(src, edges)
 | |
| 
 | |
|     // Step 1
 | |
|     Mat edges;
 | |
|     adaptiveThreshold(vertical, edges, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
 | |
|     imshow("edges", edges);
 | |
| 
 | |
|     // Step 2
 | |
|     Mat kernel = Mat::ones(2, 2, CV_8UC1);
 | |
|     dilate(edges, edges, kernel);
 | |
|     imshow("dilate", edges);
 | |
| 
 | |
|     // Step 3
 | |
|     Mat smooth;
 | |
|     vertical.copyTo(smooth);
 | |
| 
 | |
|     // Step 4
 | |
|     blur(smooth, smooth, Size(2, 2));
 | |
| 
 | |
|     // Step 5
 | |
|     smooth.copyTo(vertical, edges);
 | |
| 
 | |
|     // Show final result
 | |
|     imshow("smooth", vertical);
 | |
| //! [smooth]
 | |
| 
 | |
|     waitKey(0);
 | |
|     return 0;
 | |
| } | 
