基於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...