日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测

發(fā)布時(shí)間:2023/11/27 生活经验 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《OpenCV3编程入门》学习笔记10 角点检测(三)亚像素级角点检测 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。