openCV2 角點檢測

2021-07-01 21:55:12 字數 3130 閱讀 7066

文章目錄:

一、harris角點檢測基本理論

二、opencv**實現

三、改進的harris角點檢測

四、fast角點檢測

五、參考文獻

六、附錄(資料和原始碼)

一、harris角點檢測基本理論(要講清楚東西太多,附錄提供文件詳細說明)

1.1 簡略表達:

角點:最直觀的印象就是在水平、豎直兩個方向上變化均較大的點,即ix、iy都較大 

邊緣:僅在水平、或者僅在豎直方向有較大的變化量,即ix和iy只有其一較大 

平坦地區:在水平、豎直方向的變化量均較小,即ix、iy都較小

角點響應

r=det(m)-k*(trace(m)^2)   (附錄資料給出k=0.04~0.06,opencv指出是0.05-0.5,浮動較大)

det(m)=λ1*λ2      trace(m)=λ1+λ2

r取決於m的特徵值,對於角點|r|很大,平坦的區域|r|很小,邊緣的r為負值。

1.2 詳細描述:見附錄裡的ppt

1.3 演算法步驟

其中,區域性極大值可用先膨脹後與原圖比較的方法求得,具體見二中原始碼。

二、opencv**實現

#ifndef harris_h

#define harris_h

#include "opencv2/opencv.hpp"

class harris

; void setlocalmaxwindowsize(int nonmaxsize);

//計算角點響應函式以及非最大值抑制

void detect(const cv::mat &image)

//獲取角點圖

cv::mat getcornermap(double qualitylevel)

void getcorners(std::vector&points,

double qualitylevel)

// 遍歷全圖,獲得角點

void getcorners(std::vector&points,

const cv::mat& cornermap) }}

}//用圈圈標記角點

//灰度變換

cv::cvtcolor (image1,image,cv_bgr2gray);

// 經典的harris角點方法

harris harris;

// 計算角點

harris.detect(image);

//獲得角點

std::vectorpts;

harris.getcorners(pts,0.01);

// 標記角點

harris.drawonimage(image,pts);

cv::namedwindow ("harris");

cv::imshow ("harris",image);

cv::waitkey (0);

return 0;

三、改進的harris角點檢測

從經典的harris角點檢測方法不難看出,該演算法的穩定性和k有關,而k是個經驗值,不好把握,浮動也有可能較大。鑑於此,改進的harris方法()直接計算出兩個特徵值,通過比較兩個特徵值直接分類,這樣就不用計算harris響應函式了。

另一方面,我們不再用非極大值抑制了,而選取容忍距離:容忍距離內只有乙個特徵點。

該演算法首先選取乙個具有最大   最小特徵值的點(即:max(min(e1,e2)),e1,e2是harris矩陣的特徵值)作為角點,然後依次按照最大最小特徵值順序尋找餘下的角點,當然和前一角點距離在容忍距離內的新角點唄忽略。

opencv測試該演算法**如下:

//灰度變換

cv::cvtcolor (image1,image,cv_bgr2gray);

// 改進的harris角點檢測方法

std::vectorcorners;

cv::goodfeaturestotrack(image,corners,

200,

//角點最大數目

0.01,

// 質量等級,這裡是0.01*max(min(e1,e2)),e1,e2是harris矩陣的特徵值

10);

// 兩個角點之間的距離容忍度

harris().drawonimage(image,corners);//標記角點

四、fast角點檢測

演算法原理比較簡單,但實時性很強。

該演算法的角點定義為:若某畫素點圓形鄰域圓周上有3/4的點和該畫素點不同(程式設計時不超過某閾值th),則認為該點就是候選角點。opencv更極端,選用半徑為3的圓周上(上下左右)四個點,若超過三個點和該畫素點不同,則該點為候選角點。

和harris演算法類似,該演算法需要非極大值抑制。

opencv**:

cv::cvtcolor (image1,image,cv_bgr2gray);

//快速角點檢測

std::vectorkeypoints;

cv::fastfeaturedetector fast(40,true);

fast .detect (image,keypoints);

cv::drawkeypoints (image,keypoints,image,cv::scalar::all(255),cv::drawmatchesflags::draw_over_outimg);

opencv角點檢測

什麼叫角點呢?如果某一點在任意方向的乙個微小變化都會造成影象灰度很大的變化,那麼這個點就是角點 我們可以把角落看成是角點的現實體現,對於牆角來說,牆角是所有平面的開始點,只要這個點變化,就會引起所有從這個點出發的平面的變化,這就是角點。下面是幾個角點的具體描述 1 一階導數,也就是影象灰度的梯度的區...

OpenCV2 Shi Tomasi角點檢測

角點檢測理論 和harris角點檢測的理論幾乎完全一致,唯一不同的是在使用矩陣特徵值 1 lambda 1 1 2 lambda 2 2 計算角度響應的時候的公式不同。shi tomasi角點響應公式 r m in 1,2 r min lambda 1,lambda 2 r min 1 2 引數說明...

OpenCV角點檢測小結

棋盤點匹配的問題?不考慮,因為r,t對內參標定沒影響。固定取左上角為原點就行了。注意 靶標是以什麼為單位無所謂,反正求出的內參是以畫素為單位的,t的單位和靶標單位一致。劉博確實很強大,均衡化後巧妙的統計得到了理想的門限,對光照相當魯棒!影象處理是一門藝術。opencv角點檢測小結 1,cvgoodf...