《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测
10.2 Shi-Tomasi角點檢測
10.2.1 Shi-Tomasi角點檢測:goodFeaturesToTrack()函數
1.定義:
??Harris算法改進,若矩陣M行列式的值與M的跡中較小的一個大于最小閾值,則會得到強角點
2.作用:
??確定圖像的強角點,可用來初始化一個基于點的對象跟蹤操作
3.函數原型:
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04)
4.參數說明:
(1)輸入圖像,8位或浮點型32位單通道圖像
(2)檢測到的角點輸出向量
(3)角點最大數量
(4)角點檢測可接受的最小特征值為qualityLevel與圖像中最大特征值的乘積,qualityLevel通常取0.1或0.01
(5)角點之間的最小距離,返回的角點之間距離不小于minDistance個像素
(6)可選參數,表示感興趣區域,默認noArray(),參數非空則指定角點檢測區域
(7)計算導數自相關矩陣時指定的范圍,默認3
(8)指示是否使用Harris角點檢測,默認false
(9)用于設置Hessian自相關矩陣行列式的相對權重的權重系數,默認0.04
10.2.2 綜合示例
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//定義輔助宏
#define WINDOW_NAME "【Shi-Tomasi角點檢測】"
//全局變量
Mat g_srcImage, g_grayImage,g_dstImage;
int g_maxCornerNumber = 33;//角點檢測最大數量
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);
//全局函數
void on_GoodFeaturesToTrack(int, void*);int main()
{cout << "\n\n\t歡迎來到【Shi-Tomasi角點檢測】示例程序\n" << endl;//載入原圖像g_srcImage = imread("1.jpg", 1);cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);imshow(WINDOW_NAME, g_srcImage);//創建滑動條,回調函數初始化createTrackbar("最大角點數", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack);on_GoodFeaturesToTrack(0, 0);waitKey(0);return 0;
}
void on_GoodFeaturesToTrack(int, void*)
{//對變量小于等于1時的處理if (g_maxCornerNumber <= 1) { g_maxCornerNumber = 1; }//Shi-Tomasi算法的參數準備vector<Point2f>corners;double qualityLevel = 0.01;//角點檢測可接受最小特征值double minDistance = 10;//角點之間最小距離int blockSize = 3;//計算導數自相關矩陣時指定的鄰域范圍double k = 0.04;//權重系數Mat g_dstImage = g_srcImage.clone();//進行Shi-Tomasi角點檢測goodFeaturesToTrack(g_grayImage, corners, g_maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);//輸出文字信息cout << "\t>此次檢測到的角點數量為:" << corners.size() << endl;//繪制檢測到的角點int r = 4;for (int i = 0; i < corners.size(); i++){//以隨機的顏色繪制出角點circle(g_dstImage, corners[i], r, Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)), -1, 8, 0);}//顯示窗口imshow(WINDOW_NAME, g_dstImage);
}
運行效果:
總結
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一缕朝阳下一句是什么呢?
- 下一篇: 亏吗,大概什么时候秒,你有会秒吗...