《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测
10.3 亞像素級角點檢測
10.3.1 亞像素級角點檢測原理
1.原理:
??假設起始角點在實際亞像素角點附近,檢測所有q-p向量,下面兩種情況點p梯度與q-p向量的點積均為0:(1)點p附近圖像均勻,即點p處梯度為0(2)邊緣的梯度與沿邊緣方向的q-p向量正交(向量與其正交向量點積為0),如下圖:
??????????
??則可以在p點周圍找到很多組梯度以及相關向量q-p,令其點積為0,求解方程組,解即為角點q的亞像素級精度位置。
2.作用:
??將角點位置精確到亞像素級精度(精確的浮點類型位置),可用于幾何測量、攝像機標定、跟蹤并重建攝像機的軌跡。
10.3.2 尋找亞像素級角點:cornerSubPix()函數
1.作用:
??尋找亞像素級角點
2.函數原型:
void cornerSubPix(InputArray image, InputOutputArray corners, Size winSize, Size zeroZone, TermCriteria criteria)
3.參數說明:
(1)輸入圖像
(2)輸入角點的初始坐標和精確的輸出坐標
(3)搜索窗口一半,若 winSize=Size(5,5),表示使用(5*2+1)*(5*2+1)=11*11大小窗口
(4)死區一半,死區為不對搜索區的中央位置做求和運算的區域,用來避免自相關矩陣出現的某些可能的奇異性,值(-1,-1)表示沒有死區
(5)求角點的迭代過程的終止條件。即角點位置的確定,迭代數大于或精確達到某設定值,此參數為最大迭代數或精確度或它們的組合
10.3.3 綜合示例
/*程序說明:在Shi-Tomasi角點檢測示例程序基礎上,在on_GoodFeaturesToTrack()回調函數中加上亞像素角點檢測代碼,完成亞像素級角點檢測
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
//定義輔助宏
#define WINDOW_NAME "【亞像素級角點檢測】"
//全局變量
Mat g_srcImage, g_grayImage, g_dstImage;
int g_maxCornerNumber = 30;
int g_maxTrackbarNumber = 500;
RNG g_rng(12345);
//全局函數
void on_GoodFeaturesToTrack(int, void*);
void ShowHelpText();int main()
{cout << "\n\n\t歡迎來到【亞像素角點檢測】示例程序\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; }//【1】Shi-Tomasi算法參數設置vector<Point2f>corners;double qualityLevel = 0.01;double minDistance = 10;int blockSize = 3;double k = 0.04;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);//【2】亞像素角點檢測參數設置Size winSize = Size(5, 5);Size zeroZone = Size(-1, -1);TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001);//計算出亞像素角點位置cornerSubPix(g_grayImage, corners, winSize, zeroZone, criteria);//輸出角點信息for (int i = 0; i < corners.size(); i++){cout << "\t>>精確角點坐標[" << i << "](" << corners[i].x << "," << corners[i].y << ")" << endl;}
}
運行效果:
總結
以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《秋思》第四句是什么
- 下一篇: 自动挡多少钱啊?