cornerHarris函数
2015-08-26 17:03
309 查看
1、 cornerHarris函数
函数主要用于检测图像的哈里斯(Harris)角点检测,,判断出某一点是不是图像的角点
2、cornerHarris函数调用形式
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代码:
或者:
函数主要用于检测图像的哈里斯(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; }
相关文章推荐
- PL/SQL 出现死锁解决办法
- MongoDB数据库安装及测试
- i2c内核驱动分析
- FZU 2150 Fire Game (DFS + BFS)
- 在线测试正则表达式工具 jQuery.Validate验证库
- 获取app和手机信息的一些方法
- U3D学习笔记(1)
- 独挡一面
- 4. jQuery 事件
- HEVC去方块滤波原理以及代码流程
- Badboy自动化测试工具 Incrementing Variables
- HDU 1054 Strategic Game (最小顶点覆盖)
- alter system reset
- 人最重要的能力是什么
- leetcode 33 : Search in Rotated Sorted Array
- woj-1301
- [华为机试] 最高分是多少
- 论文提要“Hypercolumns for Object Segmentation and Fine-grained Localization”
- volatile和explicit
- sass 使用 css预编译