Opencv特徵提取與目標檢測03

2021-10-02 04:33:52 字數 4139 閱讀 9788

基於harris角點檢測理論與****omasi檢點檢測理論,我們可以通過獲取矩陣m的兩個特徵值以及qualitylevel的值,動態設計計算閾值t的公式,來選擇我們需要的有效角點。

第乙個api

基於harris角點檢測理論的,輸出的影象dst必須定義為cv_32fc1等型別,且:矩陣的每個特徵值由下式求得。

doulbe λ1 = dst.at(row,col)[0];

doulbe λ2 = dst.at(row,col)[1];

r=λ1× λ2 -k×(λ1+λ2)^2

計算出的每乙個角度響應r儲存為result的畫素值。(float型)

然後在result上尋找最大最小響應,設計出選擇的閾值t。

我的一部分**如下

//在result上尋找最大最小響應r

minmaxloc(result, &min_harris_rsp, &max_harris_rsp, 0, 0, mat());

//根據lambda1,lambda2計算閾值t

float t = min_harris_rsp + (((double)qualitylevel) / max_count)*(max_harris_rsp -min_harris_rsp);

第二個api基於shi-tomasi角點檢測理論的,輸出的影象corner已經儲存了所有的角度響應值r,等同於上面的result,然後在result上尋找最大最小響應,設計出選擇的閾值t。我的一部分**如下

//找出最大最小的響應r

minmaxloc(****omasi_corner, &min_****omasi_rsp, &max_****omasi_rsp, 0, 0, mat());

//根據響應r計算閾值t

float t = min_****omasi_rsp + (((double)sm_qualitylevel) / max_count)*(max_****omasi_rsp - min_****omasi_rsp);

// opencv 檔案.cpp :

#include "pch.h"

#include#include#include using namespace cv;

using namespace std;

mat harris_rsp;

mat result;//儲存響應的r

int blocksize = 3;//矩陣m的大小

double k = 0.04;//響應係數

int ksize = 3;//視窗

int qualitylevel = 30;

int max_count = 100;

double min_harris_rsp;

double max_harris_rsp;

double min_****omasi_rsp;

double max_****omasi_rsp;

int sm_qualitylevel=30;

void corner****_tomasi_demo(int, void*);

void cornerharris_demo(int, void*);

mat gray;

mat src1;

mat ****omasi_corner;

char output_win = "corner_harris_demo";

char output_****omasi_win = "corner_****omasi_demo";

int main()

namedwindow(output_win, window_autosize);

namedwindow(output_****omasi_win, window_autosize);

imshow("src1", src1);

cvtcolor(src1, gray, color_bgr2gray);

//定義 自定義角點harris檢測器的輸出

harris_rsp = mat::zeros(src1.size(), cv_32fc(6));//注意是cv_32fc(6);

//獲取lambda1,2,計算角點響應

cornereigenvalsandvecs(gray, harris_rsp, blocksize, ksize, 4);

result = mat::zeros(src1.size(), cv_32fc1);//注意這裡必須是32位浮點型

for (int row = 0; row < harris_rsp.rows; row++)

} //在result上尋找最大最小響應

minmaxloc(result, &min_harris_rsp, &max_harris_rsp, 0, 0, mat());

//printf("%d,%d\n", min_harris_rsp, max_harris_rsp);

//自定義角點檢測****omasi器;區別就是****omasi得到的輸出****omasi_corner直接包含了響應r,不用再自己獲取lambda1,2;

cornermineigenval(gray, ****omasi_corner,blocksize, ksize, 4);

minmaxloc(****omasi_corner, &min_****omasi_rsp, &max_****omasi_rsp, 0, 0, mat());

//建立滑動條事件

createtrackbar("qualitylevel:", output_win, &qualitylevel, max_count, cornerharris_demo);

createtrackbar("****omasi_qualitylevel:", output_****omasi_win, &sm_qualitylevel, max_count, corner****_tomasi_demo);

cornerharris_demo(0, 0);

corner****_tomasi_demo(0, 0);

waitkey(0);

return 0;

}//harris

void cornerharris_demo(int, void*)

mat resultimage = src1.clone();

//根據lambda1,lambda2計算閾值t

float t = min_harris_rsp + (((double)qualitylevel) / max_count)*(max_harris_rsp - min_harris_rsp);

printf("%.6f\n", t);左右

for (int row = 0; row < src1.rows; row++)

//else printf("error\n");

} }imshow(output_win, resultimage);

}//****omasi

void corner****_tomasi_demo(int, void*)

mat resultimage = src1.clone();

//根據響應r計算閾值t

float t = min_****omasi_rsp + (((double)sm_qualitylevel) / max_count)*(max_****omasi_rsp - min_****omasi_rsp);

printf("%.5f\n", t);左右

右邊是****omasi檢測器,左邊是harris檢測器,可能不太適合展示這兩個函式的效果,角點檢測不是很正?

Opencv特徵提取與目標檢測04

無論是harris角點檢測,shi tomasi角點檢測都無法對畫素點精準定位,進而無法滿足一些高精度影象角點處理,追蹤的問題。如跟蹤。相機矯正,三維重建,幾何測量等。正如圖所描述的。因此,亞畫素級別角點檢測應運而生。亞畫素 面陣攝像機的成像面以畫素為最小單位。例如某cmos攝像晶元,其畫素間距為5...

Opencv特徵提取

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

opencv 特徵提取以及特徵匹配

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