OpenCV圖像特征提取之Shi-Tomasi角點(diǎn)檢測(cè)算法詳解
一.Shi-Tomasi 角點(diǎn)檢測(cè)算法
Harris角點(diǎn)檢測(cè)基本數(shù)學(xué)公式如下:

泰勒公式進(jìn)行展開后,近似為:

對(duì)于局部微小的移動(dòng)量[u,v],可以近似得到下面的表達(dá):

其中M為2*2的矩陣,可由圖像的導(dǎo)數(shù)求得:

矩陣M,將其對(duì)角化之后 ,特征值λ1, λ2 分別代表了X 和Y 方向的灰度變化率.

E(u,v)的橢圓形式如下:

Harris角點(diǎn)檢測(cè)算法的角點(diǎn)響應(yīng)函數(shù)為:

Harris角點(diǎn)檢測(cè)算法就是對(duì)角點(diǎn)響應(yīng)函數(shù)R進(jìn)行閾值處理:R > threshold,即提取R的局部極大值。shi-Tomasi 算法是基于Harris 算法進(jìn)行的改進(jìn),Harris算法最基礎(chǔ)的數(shù)學(xué)定義是將矩陣 M 的行列式值與矩陣 M 的跡相減,再將差值與預(yù)先給定的閾值進(jìn)行比較。若兩個(gè)特征值中較小的一個(gè)大于最小閾值,則會(huì)得到強(qiáng)角點(diǎn),這就是Shi-Tomasi角點(diǎn)檢測(cè)算法。
Shi-Tomasi角點(diǎn)檢測(cè)算法的角點(diǎn)響應(yīng)函數(shù)為:

Shi-tomasi角點(diǎn)檢測(cè) 和Harris 算法一樣,如果該分?jǐn)?shù)大于設(shè)定的閾值,我們就認(rèn)為它是一個(gè)角點(diǎn)??梢钥闯鰜碇挥挟?dāng) λ1 和 λ 2 都大于最小值時(shí),才被認(rèn)為是角點(diǎn),即下圖中的紫色區(qū)域。

二.Shi-Tomasi角點(diǎn)檢測(cè)API函數(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 );
參數(shù)說明:
第一個(gè)參數(shù)image:輸入圖像,8位或浮點(diǎn)32比特,單通道圖像;
第二個(gè)參數(shù)corners:輸出參數(shù),檢測(cè)到的角點(diǎn);表示返回角點(diǎn)的數(shù)目,如果檢測(cè)出來角點(diǎn)數(shù)目大于最大數(shù)目則返回響應(yīng)值最強(qiáng)前規(guī)定數(shù)目;
第三個(gè)參數(shù)corner_count:輸出參數(shù),檢測(cè)到的角點(diǎn)數(shù)目;
第四個(gè)參數(shù)quality_level:最大最小特征值的乘法因子。定義可接受圖像角點(diǎn)的最小質(zhì)量因子;
第五個(gè)參數(shù)min_distance:限制因子。得到的角點(diǎn)的最小距離;使用 Euclidian 距離;
第六個(gè)參數(shù)mask:ROI感興趣區(qū)域。函數(shù)在ROI中計(jì)算角點(diǎn);如果 mask 為 NULL,則選擇整個(gè)圖像;
第七個(gè)參數(shù)block_size: 是計(jì)算導(dǎo)數(shù)的自相關(guān)矩陣時(shí)指定點(diǎn)的領(lǐng)域,采用小窗口計(jì)算的結(jié)果比單點(diǎn) (也就是block_size為1)計(jì)算的結(jié)果要好;
第八個(gè)參數(shù)useHarrisDetector:當(dāng)use_harris的值為非0,則函數(shù)使用Harris的角點(diǎn)定義;若為 0,則使用Shi-Tomasi的定義;
第九個(gè)參數(shù)K:用于設(shè)置Hessian自相關(guān)矩陣即對(duì)Hessian行列式的相對(duì)權(quán)重的權(quán)重系數(shù);
代碼實(shí)現(xiàn)
#include"stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
#define WIN_NAME "Shi-Tomasi角點(diǎn)檢測(cè)"
Mat srcImage, grayImage;
int maxCornerNumber = 33;
int maxTrackbarNumber = 500;
RNG rng(12345);
void on_GoodFeatureToTrack(int, void *)
{
if (maxCornerNumber <= 1)
{
maxCornerNumber = 1;
}
//Shi-Tomasi參數(shù)準(zhǔn)備
vector<Point2f> corners;
double qualityLevel = 0.01; //角點(diǎn)檢測(cè)可以接受的最小特征值
double minDistance = 10; //角點(diǎn)間的最小像素距離設(shè)置
int blockSize = 3; //計(jì)算導(dǎo)數(shù)自相關(guān)矩陣時(shí)指定的領(lǐng)域范圍
double k = 0.04; //權(quán)重系數(shù)
Mat copy = srcImage.clone(); //復(fù)制原圖到一個(gè)臨時(shí)變量中,作為感興趣區(qū)域
//Shi-Tomasi Test
goodFeaturesToTrack(grayImage, corners, maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);
//輸出文字信息
cout << ">此次檢測(cè)到的角點(diǎn)數(shù)量為: " << corners.size() << endl;
//繪制檢測(cè)到的角點(diǎn)
for (unsigned int i = 0; i < corners.size(); i++)
{
circle(copy, corners[i], 5, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0);
}
imshow(WIN_NAME, copy);
}
int main(int argc, char** argv)
{
srcImage = imread("F:/photo/lj.jpg");
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
namedWindow(WIN_NAME, WINDOW_AUTOSIZE);
createTrackbar("最大角點(diǎn)數(shù):", WIN_NAME, &maxCornerNumber, maxTrackbarNumber, on_GoodFeatureToTrack);
//imshow(WIN_NAME, srcImage);
on_GoodFeatureToTrack(0, 0);
waitKey(0);
return 0;
}圖像處理效果

到此這篇關(guān)于OpenCV圖像特征提取之Shi-Tomasi角點(diǎn)檢測(cè)算法詳解的文章就介紹到這了,更多相關(guān)OpenCV角點(diǎn)檢測(cè)算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ OpenCV實(shí)戰(zhàn)之手勢(shì)識(shí)別
這篇文章主要介紹了如何利用C++?OpenCV實(shí)現(xiàn)手勢(shì)識(shí)別,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下2022-04-04
教你使用Matlab制作圖形驗(yàn)證碼生成器(app designer)
這篇文章主要和大家分享如何利用Matlab制作一款圖形驗(yàn)證碼生成器,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的小伙伴可以跟隨小編動(dòng)手試一試2022-02-02
基于C語(yǔ)言構(gòu)建一個(gè)獨(dú)立棧協(xié)程和共享?xiàng)f(xié)程的任務(wù)調(diào)度系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于C語(yǔ)言構(gòu)建一個(gè)獨(dú)立棧協(xié)程和共享?xiàng)f(xié)程的任務(wù)調(diào)度系統(tǒng),文中的示例代碼講解詳細(xì),需要的可以參考下2024-02-02
與ASCII碼相關(guān)的C語(yǔ)言字符串操作函數(shù)
這篇文章主要介紹了與ASCII碼相關(guān)的C語(yǔ)言字符串操作函數(shù),分別是將字符轉(zhuǎn)換為ASCII碼的toascii()函數(shù)和根據(jù)ASCII碼進(jìn)行字符串比較的strcoll()函數(shù),需要的朋友可以參考下2015-08-08
C語(yǔ)言字符串左旋的兩種實(shí)現(xiàn)方法
匯編語(yǔ)言中有一種移位指令叫做循環(huán)左移(ROL),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言字符串左旋的兩種實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02
C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)代碼
這篇文章主要介紹了C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)之鏈表實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10

