Added Harris corner detection sample tutorial
authorAna Huaman <no@email>
Mon, 11 Jul 2011 19:59:17 +0000 (19:59 +0000)
committerAna Huaman <no@email>
Mon, 11 Jul 2011 19:59:17 +0000 (19:59 +0000)
samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp [new file with mode: 0644]

diff --git a/samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp b/samples/cpp/tutorial_code/TrackingMotion/cornerHarris_Demo.cpp
new file mode 100644 (file)
index 0000000..6bf3cac
--- /dev/null
@@ -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 <iostream>
+#include <stdio.h>
+#include <stdlib.h>
+
+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<float>(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 );
+}