Home | History | Annotate | Download | only in ImgTrans
      1 /**
      2  * @file HoughLines_Demo.cpp
      3  * @brief Demo code for Hough Transform
      4  * @author OpenCV team
      5  */
      6 
      7 #include "opencv2/imgcodecs.hpp"
      8 #include "opencv2/highgui/highgui.hpp"
      9 #include "opencv2/imgproc/imgproc.hpp"
     10 #include <iostream>
     11 #include <stdio.h>
     12 
     13 using namespace cv;
     14 using namespace std;
     15 
     16 /// Global variables
     17 
     18 /** General variables */
     19 Mat src, edges;
     20 Mat src_gray;
     21 Mat standard_hough, probabilistic_hough;
     22 int min_threshold = 50;
     23 int max_trackbar = 150;
     24 
     25 const char* standard_name = "Standard Hough Lines Demo";
     26 const char* probabilistic_name = "Probabilistic Hough Lines Demo";
     27 
     28 int s_trackbar = max_trackbar;
     29 int p_trackbar = max_trackbar;
     30 
     31 /// Function Headers
     32 void help();
     33 void Standard_Hough( int, void* );
     34 void Probabilistic_Hough( int, void* );
     35 
     36 /**
     37  * @function main
     38  */
     39 int main( int, char** argv )
     40 {
     41    /// Read the image
     42    src = imread( argv[1], 1 );
     43 
     44    if( src.empty() )
     45      { help();
     46        return -1;
     47      }
     48 
     49    /// Pass the image to gray
     50    cvtColor( src, src_gray, COLOR_RGB2GRAY );
     51 
     52    /// Apply Canny edge detector
     53    Canny( src_gray, edges, 50, 200, 3 );
     54 
     55    /// Create Trackbars for Thresholds
     56    char thresh_label[50];
     57    sprintf( thresh_label, "Thres: %d + input", min_threshold );
     58 
     59    namedWindow( standard_name, WINDOW_AUTOSIZE );
     60    createTrackbar( thresh_label, standard_name, &s_trackbar, max_trackbar, Standard_Hough);
     61 
     62    namedWindow( probabilistic_name, WINDOW_AUTOSIZE );
     63    createTrackbar( thresh_label, probabilistic_name, &p_trackbar, max_trackbar, Probabilistic_Hough);
     64 
     65    /// Initialize
     66    Standard_Hough(0, 0);
     67    Probabilistic_Hough(0, 0);
     68    waitKey(0);
     69    return 0;
     70 }
     71 
     72 /**
     73  * @function help
     74  * @brief Indications of how to run this program and why is it for
     75  */
     76 void help()
     77 {
     78   printf("\t Hough Transform to detect lines \n ");
     79   printf("\t---------------------------------\n ");
     80   printf(" Usage: ./HoughLines_Demo <image_name> \n");
     81 }
     82 
     83 /**
     84  * @function Standard_Hough
     85  */
     86 void Standard_Hough( int, void* )
     87 {
     88   vector<Vec2f> s_lines;
     89   cvtColor( edges, standard_hough, COLOR_GRAY2BGR );
     90 
     91   /// 1. Use Standard Hough Transform
     92   HoughLines( edges, s_lines, 1, CV_PI/180, min_threshold + s_trackbar, 0, 0 );
     93 
     94   /// Show the result
     95   for( size_t i = 0; i < s_lines.size(); i++ )
     96      {
     97       float r = s_lines[i][0], t = s_lines[i][1];
     98       double cos_t = cos(t), sin_t = sin(t);
     99       double x0 = r*cos_t, y0 = r*sin_t;
    100       double alpha = 1000;
    101 
    102        Point pt1( cvRound(x0 + alpha*(-sin_t)), cvRound(y0 + alpha*cos_t) );
    103        Point pt2( cvRound(x0 - alpha*(-sin_t)), cvRound(y0 - alpha*cos_t) );
    104        line( standard_hough, pt1, pt2, Scalar(255,0,0), 3, LINE_AA);
    105      }
    106 
    107    imshow( standard_name, standard_hough );
    108 }
    109 
    110 /**
    111  * @function Probabilistic_Hough
    112  */
    113 void Probabilistic_Hough( int, void* )
    114 {
    115   vector<Vec4i> p_lines;
    116   cvtColor( edges, probabilistic_hough, COLOR_GRAY2BGR );
    117 
    118   /// 2. Use Probabilistic Hough Transform
    119   HoughLinesP( edges, p_lines, 1, CV_PI/180, min_threshold + p_trackbar, 30, 10 );
    120 
    121   /// Show the result
    122   for( size_t i = 0; i < p_lines.size(); i++ )
    123      {
    124        Vec4i l = p_lines[i];
    125        line( probabilistic_hough, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255,0,0), 3, LINE_AA);
    126      }
    127 
    128    imshow( probabilistic_name, probabilistic_hough );
    129 }
    130