亞像素級角點檢測


理論與現實總是不一致的,實際情況下幾乎所有角點都不是一個准確的像素點,因為圖像的邊緣不是之間有黑到白,而往往存在一個灰度的過度。(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;
}

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM