opencv-建立自己的角點檢測

pamxy發表於2013-05-29

轉自:http://blog.csdn.net/tianzhaixing/article/details/8988731

本文運用opencv函式cornerEigenValsAndVecs來查詢eigenvalues和eigenvectors判斷畫素點是否為角點。

運用opencv函式cornerMinEigenVal查詢檢測角點的最小值。

  1. /** 
  2.  * @function cornerDetector_Demo.cpp 
  3.  * @brief Demo code for detecting corners using OpenCV built-in functions 
  4.  * @author OpenCV team 
  5.  */  
  6. #include "opencv2/highgui/highgui.hpp"  
  7. #include "opencv2/imgproc/imgproc.hpp"  
  8. #include <iostream>   
  9. #include <stdio.h>   
  10. #include <stdlib.h>   
  11.   
  12. using namespace cv;  
  13. using namespace std;  
  14.   
  15. /// Global variables   
  16. Mat src, src_gray;  
  17. Mat myHarris_dst; Mat myHarris_copy; Mat Mc;  
  18. Mat myShiTomasi_dst; Mat myShiTomasi_copy;  
  19.   
  20. int myShiTomasi_qualityLevel = 50;  
  21. int myHarris_qualityLevel = 50;  
  22. int max_qualityLevel = 100;  
  23.   
  24. double myHarris_minVal; double myHarris_maxVal;  
  25. double myShiTomasi_minVal; double myShiTomasi_maxVal;  
  26.   
  27. RNG rng(12345);  
  28.   
  29. const char* myHarris_window = "My Harris corner detector";  
  30. const char* myShiTomasi_window = "My Shi Tomasi corner detector";  
  31.   
  32. /// Function headers   
  33. void myShiTomasi_function( intvoid* );  
  34. void myHarris_function( intvoid* );  
  35.   
  36. /** 
  37.  * @function main 
  38.  */  
  39. int main( intchar** argv )  
  40. {  
  41.   /// Load source image and convert it to gray  
  42.   src = imread( argv[1], 1 );  
  43.   cvtColor( src, src_gray, COLOR_BGR2GRAY );  
  44.   
  45.   /// Set some parameters   
  46.   int blockSize = 3; int apertureSize = 3;  
  47.   
  48.   /// My Harris matrix -- Using cornerEigenValsAndVecs  
  49.   myHarris_dst = Mat::zeros( src_gray.size(), CV_32FC(6) );  
  50.   Mc = Mat::zeros( src_gray.size(), CV_32FC1 );  
  51.   
  52.   cornerEigenValsAndVecs( src_gray, myHarris_dst, blockSize, apertureSize, BORDER_DEFAULT );  
  53.   
  54.   /* calculate Mc */  
  55.   forint j = 0; j < src_gray.rows; j++ )  
  56.      { forint i = 0; i < src_gray.cols; i++ )  
  57.           {  
  58.             float lambda_1 = myHarris_dst.at<Vec6f>(j, i)[0];  
  59.             float lambda_2 = myHarris_dst.at<Vec6f>(j, i)[1];  
  60.             Mc.at<float>(j,i) = lambda_1*lambda_2 - 0.04f*pow( ( lambda_1 + lambda_2 ), 2 );  
  61.           }  
  62.      }  
  63.   
  64.   minMaxLoc( Mc, &myHarris_minVal, &myHarris_maxVal, 0, 0, Mat() );  
  65.   
  66.   /* Create Window and Trackbar */  
  67.   namedWindow( myHarris_window, WINDOW_AUTOSIZE );  
  68.   createTrackbar( " Quality Level:", myHarris_window, &myHarris_qualityLevel, max_qualityLevel, myHarris_function );  
  69.   myHarris_function( 0, 0 );  
  70.   
  71.   /// My Shi-Tomasi -- Using cornerMinEigenVal  
  72.   myShiTomasi_dst = Mat::zeros( src_gray.size(), CV_32FC1 );  
  73.   cornerMinEigenVal( src_gray, myShiTomasi_dst, blockSize, apertureSize, BORDER_DEFAULT );  
  74.   
  75.   minMaxLoc( myShiTomasi_dst, &myShiTomasi_minVal, &myShiTomasi_maxVal, 0, 0, Mat() );  
  76.   
  77.   /* Create Window and Trackbar */  
  78.   namedWindow( myShiTomasi_window, WINDOW_AUTOSIZE );  
  79.   createTrackbar( " Quality Level:", myShiTomasi_window, &myShiTomasi_qualityLevel, max_qualityLevel, myShiTomasi_function );  
  80.   myShiTomasi_function( 0, 0 );  
  81.   
  82.   waitKey(0);  
  83.   return(0);  
  84. }  
  85.   
  86. /** 
  87.  * @function myShiTomasi_function 
  88.  */  
  89. void myShiTomasi_function( intvoid* )  
  90. {  
  91.   myShiTomasi_copy = src.clone();  
  92.   
  93.   if( myShiTomasi_qualityLevel < 1 ) { myShiTomasi_qualityLevel = 1; }  
  94.   
  95.   forint j = 0; j < src_gray.rows; j++ )  
  96.      { forint i = 0; i < src_gray.cols; i++ )  
  97.           {  
  98.             if( myShiTomasi_dst.at<float>(j,i) > myShiTomasi_minVal + ( myShiTomasi_maxVal - myShiTomasi_minVal )*myShiTomasi_qualityLevel/max_qualityLevel )  
  99.               { circle( myShiTomasi_copy, Point(i,j), 4, Scalar( rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255) ), -1, 8, 0 ); }  
  100.           }  
  101.      }  
  102.   imshow( myShiTomasi_window, myShiTomasi_copy );  
  103. }  
  104.   
  105. /** 
  106.  * @function myHarris_function 
  107.  */  
  108. void myHarris_function( intvoid* )  
  109. {  
  110.   myHarris_copy = src.clone();  
  111.   
  112.   if( myHarris_qualityLevel < 1 ) { myHarris_qualityLevel = 1; }  
  113.   
  114.   forint j = 0; j < src_gray.rows; j++ )  
  115.      { forint i = 0; i < src_gray.cols; i++ )  
  116.           {  
  117.             if( Mc.at<float>(j,i) > myHarris_minVal + ( myHarris_maxVal - myHarris_minVal )*myHarris_qualityLevel/max_qualityLevel )  
  118.               { circle( myHarris_copy, Point(i,j), 4, Scalar( rng.uniform(0,255), rng.uniform(0,255), rng.uniform(0,255) ), -1, 8, 0 ); }  
  119.           }  
  120.      }  
  121.   imshow( myHarris_window, myHarris_copy );  
  122. }  
/**
 * @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 <iostream>
#include <stdio.h>
#include <stdlib.h>

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);

const char* myHarris_window = "My Harris corner detector";
const 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, char** argv )
{
  /// Load source image and convert it to gray
  src = imread( argv[1], 1 );
  cvtColor( src, src_gray, COLOR_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<Vec6f>(j, i)[0];
            float lambda_2 = myHarris_dst.at<Vec6f>(j, i)[1];
            Mc.at<float>(j,i) = lambda_1*lambda_2 - 0.04f*pow( ( lambda_1 + lambda_2 ), 2 );
          }
     }

  minMaxLoc( Mc, &myHarris_minVal, &myHarris_maxVal, 0, 0, Mat() );

  /* Create Window and Trackbar */
  namedWindow( myHarris_window, 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, 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<float>(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<float>(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 );
}


 

 

 

 

 

 

 

 

 

相關文章