1. 程式人生 > >opencv學習筆記(002)——Shi-Tomasi角點檢測

opencv學習筆記(002)——Shi-Tomasi角點檢測

opencv學習筆記(002)——Shi-Tomasi角點檢測

參考資料

學習過程

  1. 在看他人的學習筆記的時候,感覺自己還是有些不足的地方,又重新去修改了上一篇筆記。
  2. 這次看這個角點檢測的時候,明顯輕鬆很多了,畢竟也是有點底子了,爽。

學習筆記

  1. Shi-Tomasi角點檢測是Harris的改良版,是以Harris中的矩陣M為基礎,優化了對特徵值的處理,得到了更好的效果。
  2. 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.10.01)。 低於這個值的所有角點都會被忽略。 minDistance: 兩個角點之間的最短歐式距離。 mask: 是一幅畫素值為布林型別的畫素,用於指定輸入影象中蠶吐角點計算的畫素點。 blockSize:計算導數的自相關矩陣時指定點的領域,預設為3
, 採用小視窗計算的結果比單點(也就是blockSize為1)計算的效果要好。 useHarrisDetector: 預設值為0,若非0,則函式使用Harris的角點定義 K: 當useHarrisDetector非0,則K為用於設定hessian自相關矩陣即對hessian行列式的相對權值的權值係數。
  1. 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.實現效果圖: 在這裡插入圖片描述