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