特徵點提取opencv

2021-09-19 08:13:12 字數 2981 閱讀 2792

opencv中提供了harris角點檢測的介面,即cv::cornerharris()

缺陷:角點是畫素級別的,速度較慢

dst = cv2.cornerharris(gray,2,3,0.04)

img - 資料型別為 float32 的輸入影象

blocksize - 角點檢測中要考慮的領域大小

ksize - sobel 求導中使用的視窗大小

k - harris 角點檢測方程中的自由引數,取值引數為 [0,04,0.06]

cv::goodfeaturestotrack()的具體呼叫形式如下:

void cv::goodfeaturestotrack(

cv::inputarray image, // 輸入影象(cv_8uc1 cv_32fc1)

cv::outputarray corners, // 輸出角點vector

int maxcorners, // 最大角點數目

double qualitylevel, // 質量水平係數(小於1.0的正數,一般在0.01-0.1之間)

double mindistance, // 最小距離,小於此距離的點忽略

cv::inputarray mask = noarray(), // mask=0的點忽略

int blocksize = 3, // 使用的鄰域數

bool useharrisdetector = false, // false ='shi tomasi metric'

double k = 0.04 // harris角點檢測時使用

);harris角點檢測

cvgoodfeaturestotrack(img_gray,eig_img,temp_img,corners,&corner_count,quality_level,min_distance)

shi-tomas角點檢測

goodfeaturestotrack(src_gray,corners,maxcorners,qualitylevel,mindistance,mat(),blocksize,useharrisdetector,k);

效果比goodfeaturestotrack()要好

void cv::cornersubpix(

cv::inputarray image, // 輸入影象

cv::inputoutputarray corners, // 角點(既作為輸入也作為輸出)

cv::size winsize, // 區域大小為 nxn; n=(winsize*2+1)

cv::size zerozone, // 類似於winsize,但是總具有較小的範圍,size(-1,-1)表示忽略

cv::termcriteria criteria // 停止優化的標準

);

speeded up robust feature

尺度不變特徵,而且是具有較高計算效率的特徵

surffeaturedetector surfdetector(800);  // 海塞矩陣閾值,在這裡調整精度,值越大點越少,越精準 

vectorkeypoint1, keypoint2;

surfdetector.detect(image1, keypoint1);

surfdetector.detect(image2, keypoint2);

scaleinvariant feature transform

sift演算法檢測的特徵在空間和尺度上定位更加精確

尺度不變特徵,在注重速度的場合難有應用

siftfeaturedetector siftdetector(2000);  // 海塞矩陣閾值,在這裡調整精度,值越大點越少,越精準 

vectorkeypoint1, keypoint2;

siftdetector.detect(image1, keypoint1);

siftdetector.detect(image2, keypoint2);

oriented fast and rotated brief

旋轉不變性,沒有尺度不變性

orb::orb(int nfeatures=500, float scalefactor=1.2f, int nlevels=8, int edgethreshold=31, int firstlevel=0, int wta_k=2, 

int scoretype=orb::harris_score, int patchsize=31)

nfeatures - 最多提取的特徵點的數量;

scalefactor - 金字塔影象之間的尺度引數,類似於sift中的k;

nlevels – 高斯金字塔的層數;

edgethreshold – 邊緣閾值,這個值主要是根據後面的patchsize來定的,靠近邊緣edgethreshold以內的畫素是不檢測特徵點的。

firstlevel - 看過sift都知道,我們可以指定第一層的索引值,這裡預設為0。

wet_k - 用於產生biref描述子的 點對的個數,一般為2個,也可以設定為3個或4個,那麼這時候描述子之間的距離計算就不能用漢明距離了,而是應該用乙個變種。opencv中,如果設定wet_k = 2,則選用點對就只有2個點,匹配的時候距離引數選擇norm_hamming,如果wet_k設定為3或4,則biref描述子會選擇3個或4個點,那麼後面匹配的時候應該選擇的距離引數為norm_hamming2。

scoretype - 用於對特徵點進行排序的演算法,你可以選擇harris_score,也可以選擇fast_score,但是它也只是比前者快一點點而已。

patchsize – 用於計算biref描述子的特徵點鄰域大小。

orb orb;

orb.detect(img_1, keypoints_1);

orb.detect(img_2, keypoints_2);

OpenCV2 3 1特徵點提取

今天做特徵點匹配實驗,從網上找來了surf特徵點檢測程式,除錯也調通了,但是執行之後就是沒有結果出來,還會出現執行之後程式崩潰的問題,後來試了好多遍,發現是由於lib檔案有問題,雖然在屬性裡已經新增了,但是仍然鏈結不上。解決方法是在程式開始新增lib檔案,如下所示。include opencv2 o...

Opencv特徵提取

最近復現 講第 講關於 的 特徵提取的原理懂了,opencv裡的實現方式,特別是如何構造特徵點提取函式 描述子函式和暴力匹配等方法的函式不熟悉,因此翻到了 opencv程式設計入門 第三版了解了解,對整個流程有了個概念。我發現我的opencv版本不能構建fast的描述子,sift更是沒有了,sift...

opencv 特徵提取以及特徵匹配

用到的庫檔案 include include using namespace std opencv 特徵檢測模組 include include include 提取影象中的特徵 關鍵點 與 關鍵點的描述子,分別用到了opencv庫中的cv featuredetector和cv descriptor...