Home | History | Annotate | Download | only in ImgTrans
      1 /**
      2  * @file HoughCircle_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 
     12 using namespace std;
     13 using namespace cv;
     14 
     15 namespace
     16 {
     17     // windows and trackbars name
     18     const std::string windowName = "Hough Circle Detection Demo";
     19     const std::string cannyThresholdTrackbarName = "Canny threshold";
     20     const std::string accumulatorThresholdTrackbarName = "Accumulator Threshold";
     21     const std::string usage = "Usage : tutorial_HoughCircle_Demo <path_to_input_image>\n";
     22 
     23     // initial and max values of the parameters of interests.
     24     const int cannyThresholdInitialValue = 200;
     25     const int accumulatorThresholdInitialValue = 50;
     26     const int maxAccumulatorThreshold = 200;
     27     const int maxCannyThreshold = 255;
     28 
     29     void HoughDetection(const Mat& src_gray, const Mat& src_display, int cannyThreshold, int accumulatorThreshold)
     30     {
     31         // will hold the results of the detection
     32         std::vector<Vec3f> circles;
     33         // runs the actual detection
     34         HoughCircles( src_gray, circles, HOUGH_GRADIENT, 1, src_gray.rows/8, cannyThreshold, accumulatorThreshold, 0, 0 );
     35 
     36         // clone the colour, input image for displaying purposes
     37         Mat display = src_display.clone();
     38         for( size_t i = 0; i < circles.size(); i++ )
     39         {
     40             Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
     41             int radius = cvRound(circles[i][2]);
     42             // circle center
     43             circle( display, center, 3, Scalar(0,255,0), -1, 8, 0 );
     44             // circle outline
     45             circle( display, center, radius, Scalar(0,0,255), 3, 8, 0 );
     46         }
     47 
     48         // shows the results
     49         imshow( windowName, display);
     50     }
     51 }
     52 
     53 
     54 int main(int argc, char** argv)
     55 {
     56     Mat src, src_gray;
     57 
     58     if (argc < 2)
     59     {
     60         std::cerr<<"No input image specified\n";
     61         std::cout<<usage;
     62         return -1;
     63     }
     64 
     65     // Read the image
     66     src = imread( argv[1], 1 );
     67 
     68     if( src.empty() )
     69     {
     70         std::cerr<<"Invalid input image\n";
     71         std::cout<<usage;
     72         return -1;
     73     }
     74 
     75     // Convert it to gray
     76     cvtColor( src, src_gray, COLOR_BGR2GRAY );
     77 
     78     // Reduce the noise so we avoid false circle detection
     79     GaussianBlur( src_gray, src_gray, Size(9, 9), 2, 2 );
     80 
     81     //declare and initialize both parameters that are subjects to change
     82     int cannyThreshold = cannyThresholdInitialValue;
     83     int accumulatorThreshold = accumulatorThresholdInitialValue;
     84 
     85     // create the main window, and attach the trackbars
     86     namedWindow( windowName, WINDOW_AUTOSIZE );
     87     createTrackbar(cannyThresholdTrackbarName, windowName, &cannyThreshold,maxCannyThreshold);
     88     createTrackbar(accumulatorThresholdTrackbarName, windowName, &accumulatorThreshold, maxAccumulatorThreshold);
     89 
     90     // infinite loop to display
     91     // and refresh the content of the output image
     92     // until the user presses q or Q
     93     int key = 0;
     94     while(key != 'q' && key != 'Q')
     95     {
     96         // those paramaters cannot be =0
     97         // so we must check here
     98         cannyThreshold = std::max(cannyThreshold, 1);
     99         accumulatorThreshold = std::max(accumulatorThreshold, 1);
    100 
    101         //runs the detection, and update the display
    102         HoughDetection(src_gray, src, cannyThreshold, accumulatorThreshold);
    103 
    104         // get user key
    105         key = waitKey(10);
    106     }
    107 
    108     return 0;
    109 }
    110