網站首頁 編程語言 正文
一.Shi-Tomasi 角點檢測算法
Harris角點檢測基本數學公式如下:??
泰勒公式進行展開后,近似為:
對于局部微小的移動量[u,v],可以近似得到下面的表達:
其中M為2*2的矩陣,可由圖像的導數求得:
矩陣M,將其對角化之后 ,特征值λ1, λ2 分別代表了X 和Y 方向的灰度變化率.
E(u,v)的橢圓形式如下:
Harris角點檢測算法的角點響應函數為:
Harris角點檢測算法就是對角點響應函數R進行閾值處理:R > threshold,即提取R的局部極大值。shi-Tomasi 算法是基于Harris 算法進行的改進,Harris算法最基礎的數學定義是將矩陣 M 的行列式值與矩陣 M 的跡相減,再將差值與預先給定的閾值進行比較。若兩個特征值中較小的一個大于最小閾值,則會得到強角點,這就是Shi-Tomasi角點檢測算法。
Shi-Tomasi角點檢測算法的角點響應函數為:
Shi-tomasi角點檢測 和Harris 算法一樣,如果該分數大于設定的閾值,我們就認為它是一個角點。可以看出來只有當 λ1 和 λ 2 都大于最小值時,才被認為是角點,即下圖中的紫色區域。
二.Shi-Tomasi角點檢測API函數接口
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 );
參數說明:
第一個參數image:輸入圖像,8位或浮點32比特,單通道圖像;
第二個參數corners:輸出參數,檢測到的角點;表示返回角點的數目,如果檢測出來角點數目大于最大數目則返回響應值最強前規定數目;
第三個參數corner_count:輸出參數,檢測到的角點數目;
第四個參數quality_level:最大最小特征值的乘法因子。定義可接受圖像角點的最小質量因子;
第五個參數min_distance:限制因子。得到的角點的最小距離;使用 Euclidian 距離;
第六個參數mask:ROI感興趣區域。函數在ROI中計算角點;如果 mask 為 NULL,則選擇整個圖像;
第七個參數block_size: 是計算導數的自相關矩陣時指定點的領域,采用小窗口計算的結果比單點 (也就是block_size為1)計算的結果要好;
第八個參數useHarrisDetector:當use_harris的值為非0,則函數使用Harris的角點定義;若為 0,則使用Shi-Tomasi的定義;
第九個參數K:用于設置Hessian自相關矩陣即對Hessian行列式的相對權重的權重系數;
代碼實現
#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角點檢測"
Mat srcImage, grayImage;
int maxCornerNumber = 33;
int maxTrackbarNumber = 500;
RNG rng(12345);
void on_GoodFeatureToTrack(int, void *)
{
if (maxCornerNumber <= 1)
{
maxCornerNumber = 1;
}
//Shi-Tomasi參數準備
vector<Point2f> corners;
double qualityLevel = 0.01; //角點檢測可以接受的最小特征值
double minDistance = 10; //角點間的最小像素距離設置
int blockSize = 3; //計算導數自相關矩陣時指定的領域范圍
double k = 0.04; //權重系數
Mat copy = srcImage.clone(); //復制原圖到一個臨時變量中,作為感興趣區域
//Shi-Tomasi Test
goodFeaturesToTrack(grayImage, corners, maxCornerNumber, qualityLevel, minDistance, Mat(), blockSize, false, k);
//輸出文字信息
cout << ">此次檢測到的角點數量為: " << corners.size() << endl;
//繪制檢測到的角點
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("最大角點數:", WIN_NAME, &maxCornerNumber, maxTrackbarNumber, on_GoodFeatureToTrack);
//imshow(WIN_NAME, srcImage);
on_GoodFeatureToTrack(0, 0);
waitKey(0);
return 0;
}
圖像處理效果
原文鏈接:https://blog.csdn.net/weixin_44651073/article/details/126475441
相關推薦
- 2022-04-10 微信小程序canvas drawImage 圖片展示的方法
- 2023-11-12 jetson nano報錯Cannot allocate memory的問題——解決辦法
- 2022-03-27 Unity實現物體跟隨鼠標移動_C#教程
- 2023-03-21 Flutter?web?bridge?通信總結分析詳解_Android
- 2022-08-01 MongoDB基礎之集合操作_MongoDB
- 2024-04-03 clickhouse報Ports are not available
- 2022-07-10 使用Docker安裝RabbitMQ
- 2022-08-17 C++詳解如何通過模板實現元素的反序_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支