//! computes harris cornerness criteria at each image pixel
cv_exports_w void cornerharris( inputarray src, outputarray dst, int blocksize,
int ksize, double k,
int bordertype=border_default );
src —— 待檢測影象,單通道灰度圖
dst —— 角點響應值,型別cv_32fc1
blocksize —— **中視窗大小,下面細說
ksize —— sobel視窗大小
k —— 原始**裡的調節引數 0.04到0.05之間
bordertype —— 邊界處理方式
其實寫這個我想說明的就是這個blocksize和ksize的意義,檢視原始碼
static void
cornereigenvalsvecs( const mat& src, mat& eigenv, int block_size,
int aperture_size, int op_type, double k=0.,
int bordertype=border_default )
else
size size = src.size();
mat cov( size, cv_32fc3 );
int i, j;
for( i = 0; i < size.height; i++ )
}boxfilter(cov, cov, cov.depth(), size(block_size, block_size),
point(-1,-1), false, bordertype );//引數blocksize
if( op_type == mineigenval )
calcmineigenval( cov, eigenv );
else
if( op_type == harris )
calcharris( cov, eigenv, k );
else
if( op_type == eigenvalsvecs )
calceigenvalsvecs( cov, eigenv );
}}
標出了使用兩個引數的位置,其中ksize是sobel運算元窗體大小就不用多說了,越大抗雜訊能力越強,但模糊也更加嚴重。opencv用sobel來計算dx和dy,進而求得dx*dy dx*dx dy*dy,也即求得原方法中的海森矩陣。在**中二次型引數m,是乙個視窗內的海森矩陣加權和。視窗可以為方形或者高斯,opencv使用了boxfilter函式(視窗大小由blocksize控制)來實現方形視窗。**這麼實現應該主要還是為了抗噪。不要讓雜訊成為角點被檢測出來,另外也可以用這兩個引數來控制角點對比度。所以值的選取要看具體的應用場景中雜訊的特性了。
#include
#include
#include
using
namespace
std;
using
namespace cv;
int thres;
int blocksize;
int ksize;
void harriscorner(int,void *)
ptr++;}}
//5.顯示
另外一些離的很近的角點可以用非極大值抑制來消除,窗體大小可參考blocksize的大小,一種實現如下
//4.根據閾值記錄角點
opencv實現Harris角點檢測
include include include include include includeusing namespace std using namespace cv harris角點檢測 blocksize是鄰域大小,對每個畫素,考慮blocksize blocksize大小的鄰域,計算鄰域上...
opencv之Harris角點檢測
opencv4.1.2 contrib win10 vs2019 角點是一模擬較特殊的點,構成角點的條件兩條或者多條線的交叉,線可以理解為邊緣特徵很強的畫素點的集合,在opencv中大部分的影象處理基於掩膜移動來實現,在矩形框內如果在沒有角點的區域內也就是所謂的平原地帶,無論向哪個方向移動,矩形框內...
OpenCV之Harris角點檢測
在影象處理領域,角點檢測演算法主要有以下幾類 基於灰度影象的角點檢測 基於二值影象的角點檢測 基於輪廓曲線的角點檢測 而基於灰度影象的角點檢測又可分為基於梯度 基於模板 基於梯度和基於模板組合三類方法。其中基於模板的方法主要考慮畫素鄰域點的灰度變化,即影象亮度的變化,將與相鄰點亮度對比足夠大的點定義...