From 7386269943ebf61f7659c4a8cda734f394fcc144 Mon Sep 17 00:00:00 2001 From: Ana Huaman Date: Tue, 12 Jul 2011 00:20:06 +0000 Subject: [PATCH] Added cornerDetector_Demo.cpp sample for tutorial of cornerMinEigenVal and cornerEigenValsAndVecs --- .../TrackingMotion/cornerDetector_Demo.cpp | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 samples/cpp/tutorial_code/TrackingMotion/cornerDetector_Demo.cpp diff --git a/samples/cpp/tutorial_code/TrackingMotion/cornerDetector_Demo.cpp b/samples/cpp/tutorial_code/TrackingMotion/cornerDetector_Demo.cpp new file mode 100644 index 0000000000..42fd7a0036 --- /dev/null +++ b/samples/cpp/tutorial_code/TrackingMotion/cornerDetector_Demo.cpp @@ -0,0 +1,123 @@ +/** + * @function cornerDetector_Demo.cpp + * @brief Demo code for detecting corners using OpenCV built-in functions + * @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; +Mat myHarris_dst; Mat myHarris_copy; Mat Mc; +Mat myShiTomasi_dst; Mat myShiTomasi_copy; + +int myShiTomasi_qualityLevel = 50; +int myHarris_qualityLevel = 50; +int max_qualityLevel = 100; + +double myHarris_minVal; double myHarris_maxVal; +double myShiTomasi_minVal; double myShiTomasi_maxVal; + +RNG rng(12345); + +char* myHarris_window = "My Harris corner detector"; +char* myShiTomasi_window = "My Shi Tomasi corner detector"; + +/// Function headers +void myShiTomasi_function( int, void* ); +void myHarris_function( 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 ); + + /// Set some parameters + int blockSize = 3; int apertureSize = 3; + + /// My Harris matrix -- Using cornerEigenValsAndVecs + myHarris_dst = Mat::zeros( src_gray.size(), CV_32FC(6) ); + Mc = Mat::zeros( src_gray.size(), CV_32FC1 ); + + cornerEigenValsAndVecs( src_gray, myHarris_dst, blockSize, apertureSize, BORDER_DEFAULT ); + + /* calculate Mc */ + for( int j = 0; j < src_gray.rows; j++ ) + { for( int i = 0; i < src_gray.cols; i++ ) + { + float lambda_1 = myHarris_dst.at( j, i, 0 ); + float lambda_2 = myHarris_dst.at( j, i, 1 ); + Mc.at(j,i) = lambda_1*lambda_2 - 0.04*pow( ( lambda_1 + lambda_2 ), 2 ); + } + } + + minMaxLoc( Mc, &myHarris_minVal, &myHarris_maxVal, 0, 0, Mat() ); + + /* Create Window and Trackbar */ + namedWindow( myHarris_window, CV_WINDOW_AUTOSIZE ); + createTrackbar( " Quality Level:", myHarris_window, &myHarris_qualityLevel, max_qualityLevel, myHarris_function ); + myHarris_function( 0, 0 ); + + /// My Shi-Tomasi -- Using cornerMinEigenVal + myShiTomasi_dst = Mat::zeros( src_gray.size(), CV_32FC1 ); + cornerMinEigenVal( src_gray, myShiTomasi_dst, blockSize, apertureSize, BORDER_DEFAULT ); + + minMaxLoc( myShiTomasi_dst, &myShiTomasi_minVal, &myShiTomasi_maxVal, 0, 0, Mat() ); + + /* Create Window and Trackbar */ + namedWindow( myShiTomasi_window, CV_WINDOW_AUTOSIZE ); + createTrackbar( " Quality Level:", myShiTomasi_window, &myShiTomasi_qualityLevel, max_qualityLevel, myShiTomasi_function ); + myShiTomasi_function( 0, 0 ); + + waitKey(0); + return(0); +} + +/** + * @function myShiTomasi_function + */ +void myShiTomasi_function( int, void* ) +{ + myShiTomasi_copy = src.clone(); + + if( myShiTomasi_qualityLevel < 1 ) { myShiTomasi_qualityLevel = 1; } + + for( int j = 0; j < src_gray.rows; j++ ) + { for( int i = 0; i < src_gray.cols; i++ ) + { + if( myShiTomasi_dst.at(j,i) > myShiTomasi_minVal + ( myShiTomasi_maxVal - myShiTomasi_minVal )*myShiTomasi_qualityLevel/max_qualityLevel ) + { circle( myShiTomasi_copy, Point(i,j), 4, Scalar( rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255) ), -1, 8, 0 ); } + } + } + imshow( myShiTomasi_window, myShiTomasi_copy ); +} + +/** + * @function myHarris_function + */ +void myHarris_function( int, void* ) +{ + myHarris_copy = src.clone(); + + if( myHarris_qualityLevel < 1 ) { myHarris_qualityLevel = 1; } + + for( int j = 0; j < src_gray.rows; j++ ) + { for( int i = 0; i < src_gray.cols; i++ ) + { + if( Mc.at(j,i) > myHarris_minVal + ( myHarris_maxVal - myHarris_minVal )*myHarris_qualityLevel/max_qualityLevel ) + { circle( myHarris_copy, Point(i,j), 4, Scalar( rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255) ), -1, 8, 0 ); } + } + } + imshow( myHarris_window, myHarris_copy ); +} +