From e2da35dc6e285a066e7805183c018bbb4862c175 Mon Sep 17 00:00:00 2001 From: Ana Huaman Date: Mon, 11 Jul 2011 19:59:17 +0000 Subject: [PATCH] Added Harris corner detection sample tutorial --- .../TrackingMotion/cornerHarris_Demo.cpp | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp diff --git a/samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp b/samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp new file mode 100644 index 000000000..6bf3cacd0 --- /dev/null +++ b/samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp @@ -0,0 +1,82 @@ +/** + * @function cornerHarris_Demo.cpp + * @brief Demo code for detecting corners using Harris-Stephens method + * @author OpenCV team + */ + +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/imgproc/imgproc.hpp" +#include +#include +#include + +using namespace cv; +using namespace std; + +/// Global variables +Mat src, src_gray; +int thresh = 200; +int max_thresh = 255; + +char* source_window = "Source image"; +char* corners_window = "Corners detected"; + +/// Function header +void cornerHarris_demo( int, void* ); + +/** + * @function main + */ +int main( int argc, char** argv ) +{ + /// Load source image and convert it to gray + src = imread( argv[1], 1 ); + cvtColor( src, src_gray, CV_BGR2GRAY ); + + /// Create a window and a trackbar + namedWindow( source_window, CV_WINDOW_AUTOSIZE ); + createTrackbar( "Threshold: ", source_window, &thresh, max_thresh, cornerHarris_demo ); + imshow( source_window, src ); + + cornerHarris_demo( 0, 0 ); + + waitKey(0); + return(0); +} + +/** + * @function cornerHarris_demo + * @brief Executes the corner detection and draw a circle around the possible corners + */ +void cornerHarris_demo( int, void* ) +{ + + Mat dst, dst_norm, dst_norm_scaled; + dst = Mat::zeros( src.size(), CV_32FC1 ); + + /// Detector parameters + int blockSize = 2; + int apertureSize = 3; + double k = 0.04; + + /// Detecting corners + cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT ); + + /// Normalizing + normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() ); + convertScaleAbs( dst_norm, dst_norm_scaled ); + + /// Drawing a circle around corners + for( int j = 0; j < dst_norm.rows ; j++ ) + { for( int i = 0; i < dst_norm.cols; i++ ) + { + if( (int) dst_norm.at(j,i) > thresh ) + { + circle( dst_norm_scaled, Point( i, j ), 5, Scalar(0), 2, 8, 0 ); + } + } + } + /// Showing the result + namedWindow( corners_window, CV_WINDOW_AUTOSIZE ); + imshow( corners_window, dst_norm_scaled ); +}