您的位置:首页 > 其它

cornerHarris函数

2015-08-26 17:03 309 查看
1、 cornerHarris函数

函数主要用于检测图像的哈里斯(Harris)角点检测,,判断出某一点是不是图像的角点

2、cornerHarris函数调用形式

c语言:void cvCornerHarris( const CvArr* image, CvArr* harris_responce, int block_size, int aperture_size=3, double k=0.04 );


C++: void cornerHarris(InputArray src,
OutputArray dst, int blockSize,
int ksize, double k,
int borderType=BORDER_DEFAULT)

参数详解:image

输入图像。harris_responce存储哈里斯(Harris)检测responces的图像。与输入图像等大。block_size邻域大小(见关于cvCornerEigenValsAndVecs的讨论)。aperture_size扩展 Sobel 核的大小(见 cvSobel)。格式. 当输入图像是浮点数格式时,该参数表示用来计算差分固定的浮点滤波器的个数。kharris 检测器的自由参数。参见下面的公式。函数 cvCornerHarris 对输入图像进行 Harris 边界检测。类似于 cvCornerMinEigenVal 和 cvCornerEigenValsAndVecs。对每个像素,在 block_size*block_size 大小的邻域上,计算其2*2梯度共变矩阵(或相关异变矩阵)M。然后,将det(M) - k*trace(M)2 (这里2是平方)

保存到输出图像中。输入图像中的角点在输出图像中由局部最大值表示。
3、原理

因为角点是两个边缘的连接点,它代表了两个边缘变化的方向上的点。图像梯度有很高的变化。这种变化是可以用来帮助检测角点的。



由于角点代表了图像像素梯度变化,我们将寻找这个”变化”。

考虑到一个灰度图像

. 划动窗口

(with
displacements

在x方向和

方向)

计算像素灰度变化。



其中:


is the window at position



is the intensity at



is the intensity at the moved window


为了寻找带角点的窗口,我们搜索像素灰度变化较大的窗口。于是, 我们期望最大化以下式子:



使用 泰勒(Taylor)展开式:



式子可以展开为:



一个举证表达式可以写为:



表示为:



因此我们有等式:



每个窗口中计算得到一个值。这个值决定了这个窗口中是否包含了角点:



其中:

det(M) =


trace(M) =


一个窗口,它的分数

大于一个特定值,这个窗口就可以被认为是”角点

opencv代码:
#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 */
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 );
}


或者:
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main()
{
	Mat src,src_gray;
	src= imread("D:6.jpg");
	cvtColor(src, src_gray, CV_RGB2GRAY);
	Mat cornerStrength;
	cornerHarris(src_gray, cornerStrength, 3, 3, 0.01);
	threshold(cornerStrength, cornerStrength, 0.0001, 255, THRESH_BINARY);
	imshow("shiyan", cornerStrength);
	waitKey(0);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: