日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cornerHarris函数

發布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cornerHarris函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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)。格式. 當輸入圖像是浮點數格式時,該參數表示用來計算差分固定的浮點濾波器的個數。
k
harris 檢測器的自由參數。參見下面的公式。
函數 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 graysrc = imread( argv[1], 1 );cvtColor( src, src_gray, CV_BGR2GRAY );/// Create a window and a trackbarnamedWindow( 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 parametersint blockSize = 2;int apertureSize = 3;double k = 0.04;/// Detecting cornerscornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );/// Normalizingnormalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );convertScaleAbs( dst_norm, dst_norm_scaled );/// Drawing a circle around cornersfor( 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 resultnamedWindow( 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; }

總結

以上是生活随笔為你收集整理的cornerHarris函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。