《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测
10.2 Shi-Tomasi角點(diǎn)檢測(cè)
10.2.1 Shi-Tomasi角點(diǎn)檢測(cè):goodFeaturesToTrack()函數(shù)
1.定義:
??Harris算法改進(jìn),若矩陣M行列式的值與M的跡中較小的一個(gè)大于最小閾值,則會(huì)得到強(qiáng)角點(diǎn)
2.作用:
??確定圖像的強(qiáng)角點(diǎn),可用來(lái)初始化一個(gè)基于點(diǎn)的對(duì)象跟蹤操作
3.函數(shù)原型:
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.參數(shù)說(shuō)明:
(1)輸入圖像,8位或浮點(diǎn)型32位單通道圖像
(2)檢測(cè)到的角點(diǎn)輸出向量
(3)角點(diǎn)最大數(shù)量
(4)角點(diǎn)檢測(cè)可接受的最小特征值為qualityLevel與圖像中最大特征值的乘積,qualityLevel通常取0.1或0.01
(5)角點(diǎn)之間的最小距離,返回的角點(diǎn)之間距離不小于minDistance個(gè)像素
(6)可選參數(shù),表示感興趣區(qū)域,默認(rèn)noArray(),參數(shù)非空則指定角點(diǎn)檢測(cè)區(qū)域
(7)計(jì)算導(dǎo)數(shù)自相關(guān)矩陣時(shí)指定的范圍,默認(rèn)3
(8)指示是否使用Harris角點(diǎn)檢測(cè),默認(rèn)false
(9)用于設(shè)置Hessian自相關(guān)矩陣行列式的相對(duì)權(quán)重的權(quán)重系數(shù),默認(rèn)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角點(diǎn)檢測(cè)】"
//全局變量
Mat g_srcImage, g_grayImage,g_dstImage;
int g_maxCornerNumber = 33;//角點(diǎn)檢測(cè)最大數(shù)量
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);
//全局函數(shù)
void on_GoodFeaturesToTrack(int, void*);int main()
{cout << "\n\n\t歡迎來(lái)到【Shi-Tomasi角點(diǎn)檢測(cè)】示例程序\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);//創(chuàng)建滑動(dòng)條,回調(diào)函數(shù)初始化createTrackbar("最大角點(diǎn)數(shù)", WINDOW_NAME, &g_maxCornerNumber, g_maxTrackbarNumber, on_GoodFeaturesToTrack);on_GoodFeaturesToTrack(0, 0);waitKey(0);return 0;
}
void on_GoodFeaturesToTrack(int, void*)
{//對(duì)變量小于等于1時(shí)的處理if (g_maxCornerNumber <= 1) { g_maxCornerNumber = 1; }//Shi-Tomasi算法的參數(shù)準(zhǔn)備vector<Point2f>corners;double qualityLevel = 0.01;//角點(diǎn)檢測(cè)可接受最小特征值double minDistance = 10;//角點(diǎn)之間最小距離int blockSize = 3;//計(jì)算導(dǎo)數(shù)自相關(guān)矩陣時(shí)指定的鄰域范圍double k = 0.04;//權(quán)重系數(shù)Mat g_dstImage = g_srcImage.clone();//進(jìn)行Shi-Tomasi角點(diǎn)檢測(cè)goodFeaturesToTrack(g_grayImage, corners, g_maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);//輸出文字信息cout << "\t>此次檢測(cè)到的角點(diǎn)數(shù)量為:" << corners.size() << endl;//繪制檢測(cè)到的角點(diǎn)int r = 4;for (int i = 0; i < corners.size(); i++){//以隨機(jī)的顏色繪制出角點(diǎn)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);
}
運(yùn)行效果:
總結(jié)
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记10 角点检测(二)Shi-Tomasi角点检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一缕朝阳下一句是什么呢?
- 下一篇: 亏吗,大概什么时候秒,你有会秒吗...