opencv學習筆記(002)——Shi-Tomasi角點檢測
阿新 • • 發佈:2018-12-21
opencv學習筆記(002)——Shi-Tomasi角點檢測
參考資料
學習過程
- 在看他人的學習筆記的時候,感覺自己還是有些不足的地方,又重新去修改了上一篇筆記。
- 這次看這個角點檢測的時候,明顯輕鬆很多了,畢竟也是有點底子了,爽。
學習筆記
- Shi-Tomasi角點檢測是Harris的改良版,是以Harris中的矩陣M為基礎,優化了對特徵值的處理,得到了更好的效果。
- Shi-Tomasi角點檢測函式:
goodFeaturesToTrack(image, maxCorners, qualityLevel,
minDistance, corners=None, mask= None, blockSize=None,
useHarrisDetector=None, k=None)
mage:輸入影象,一般是灰度影象。
maxCorners: 想要檢測到的角點數目。
qualtyLevel: 角點的質量水平,0-1之間。它代表了角點的最低質量,
實際用於過濾角點的最小特徵值是qualtyLevel與影象中最大特徵值的乘積,
所以 qualtyLevel的值不應超過1(常用的值為0.1或0.01)。
低於這個值的所有角點都會被忽略。
minDistance: 兩個角點之間的最短歐式距離。
mask: 是一幅畫素值為布林型別的畫素,用於指定輸入影象中蠶吐角點計算的畫素點。
blockSize:計算導數的自相關矩陣時指定點的領域,預設為3 ,
採用小視窗計算的結果比單點(也就是blockSize為1)計算的效果要好。
useHarrisDetector: 預設值為0,若非0,則函式使用Harris的角點定義
K: 當useHarrisDetector非0,則K為用於設定hessian自相關矩陣即對hessian行列式的相對權值的權值係數。
- opencv學習demo(建議自己敲一遍)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int num_corners = 25;//獲取的角點個數
int max_corners = 200;
const char* output_title = "Shi-Tornasi Detector";
Mat src, gray_src;
void ShiTornasi_Demo(int,void*);
RNG rng(12345);//隨機數,為了產生畫在圖上的顏色樣式。
int main(int *argc, char** argv) {
src = imread("C:\\Users\\Administrator\\Pictures\\4.jpg", 1);
if (src.empty()) {
printf("圖片載入失敗\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
cvtColor(src, gray_src, CV_BGR2GRAY);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
createTrackbar("Num Corners", output_title, &num_corners, max_corners, ShiTornasi_Demo);
ShiTornasi_Demo(0, 0);
waitKey(0);
return 0;
}
void ShiTornasi_Demo(int, void*) {
if (num_corners < 5) {
num_corners = 5;
}
vector<Point2f> corners;
double qualityLevel = 0.01;
double minDistance = 10;
int blockSize = 3;
bool useHarris = false;
double k = 0.04;
Mat resultImg = src.clone();
goodFeaturesToTrack(gray_src, corners, num_corners, qualityLevel, minDistance, Mat(), blockSize, useHarris, k);
//printf("角點個數:%d", corners.size());
//size_t 可以看做int 步長
for (size_t t = 0; t < corners.size(); t++) {
//circle(resultImg, corners[t], 2, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), 2, 8, 0);
circle(resultImg, corners[t], 2, Scalar(0, 0, 255), 2, 8, 0);
}
imshow(output_title, resultImg);
}
3.實現效果圖: