1. 程式人生 > 實用技巧 >亞畫素級角點檢測

亞畫素級角點檢測

理論與現實總是不一致的,實際情況下幾乎所有角點都不是一個準確的畫素點,因為影象的邊緣不是之間有黑到白,而往往存在一個灰度的過度。(100,5)實際上

(100.234,5.789),而我們在跟蹤、三維重建,相機校正等應用上又都需要精確的畫素位置。有以下幾種解決方法

1.插值法

通過周圍四個點的變化情況,尋找擬合出哪一個焦點的精確位置,根據周圍四個點的resp而不是真正的畫素值

2.基於影象矩計算

3.曲線擬合的方式

高斯曲面(x,y,r),多項式,橢圓曲面

通過周圍點的畫素擬合出曲面,找到曲面的頂點,就是亞畫素定位

Demo

#include"pch.h"
#include<iostream>
#include
<opencv2/opencv.hpp> #include<math.h> using namespace std; using namespace cv; const char* output_title = "Sub-pixel CornerDetection Reslut"; double harris_mins_rsp; double harris_max_rsp; int qualityLevel = 30; int max_corners = 30; int max_count = 50; Mat src, gray_src; Mat harris_dst, harriRspImg;
//Shi-Tomasi Mat ShiTomasiRspImg; double ShiTomasi_max_rsp; double ShiTomasi_min_rsp; int SM_QualityLevel = 30; void SubPixel_Demo(int,void*); int main(int argc, char** argv) { src = imread("1.jpg"); imshow("input img", src); int blocksize = 3; int ksize = 3; double k = 0.04; harriRspImg
= Mat::zeros(src.size(), CV_32FC1); harris_dst = Mat::zeros(src.size(), CV_32FC(6)); namedWindow(output_title, CV_WINDOW_AUTOSIZE); cvtColor(src, gray_src, COLOR_BGR2GRAY); createTrackbar("Min Value:", output_title, &max_corners, max_count, SubPixel_Demo); SubPixel_Demo(0, 0); waitKey(); return 0; } void SubPixel_Demo(int, void*) { if (max_corners <5) qualityLevel = 5; vector<Point2f> corners; double qualityLevel = 0.05; double minDistance = 10; int blockSize = 3; double K = 0.04; goodFeaturesToTrack(gray_src, corners, max_corners, qualityLevel, minDistance, Mat(), blockSize, false, K); cout << "number of corners: " << corners.size() << endl; Mat resultImg = src.clone(); for (size_t i = 0; i < corners.size(); ++i) { circle(resultImg, corners[i], 2, Scalar(0, 0, 255), 2, 8, 0); } imshow(output_title, resultImg); Size winSize = Size(5, 5); Size zerozone = Size(-1, -1); TermCriteria tc = TermCriteria(TermCriteria::EPS + TermCriteria::MAX_ITER, 40, 0.001); cornerSubPix(gray_src, corners, winSize, zerozone, tc); for (size_t i=0; i < corners.size(); ++i) { cout << (i + 1) << ".Point[x,y]=" << corners[i].x <<" ," << corners[i].y << endl; } return; }