亞像素級角點檢測 Shi Tomasi & cornerSubPix

和調用Shi Tomasi檢測相同,只不過在檢測出角點以後對其進行cornerSubPix處理,cornerSubPix函數中有一個迭代類,TermCriteria還比較陌生。還有zeroZone參數,一般默認是Size(-1,-1)。

運行截圖:
這裏寫圖片描述

官方給的例子如下:


#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
Mat src, src_gray;
int maxCorners = 10;
int maxTrackbar = 500;
RNG rng(12345);
const char* source_window = "Image";
void goodFeaturesToTrack_Demo(int, void*);
int main(int, char** argv)
{
    src = imread("test.jpg", IMREAD_COLOR);
    cvtColor(src, src_gray, COLOR_BGR2GRAY);
    namedWindow(source_window, WINDOW_AUTOSIZE);
    createTrackbar("Max  corners:", source_window, &maxCorners, maxTrackbar, goodFeaturesToTrack_Demo);
    imshow(source_window, src);
    goodFeaturesToTrack_Demo(0, 0);
    waitKey(0);
    return(0);
}
void goodFeaturesToTrack_Demo(int, void*)
{
    if (maxCorners < 1) { maxCorners = 1; }
    vector<Point2f> corners;
    double qualityLevel = 0.01;
    double minDistance = 10;
    int blockSize = 3;
    bool useHarrisDetector = false;
    double k = 0.04;
    Mat copy;
    copy = src.clone();
    goodFeaturesToTrack(src_gray,
        corners,
        maxCorners,
        qualityLevel,
        minDistance,
        Mat(),
        blockSize,
        useHarrisDetector,
        k);
    cout << "** Number of corners detected: " << corners.size() << endl;
    Size winSize = Size(5, 5);
    Size zeroZone = Size(-1, -1);
    TermCriteria criteria = TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 40, 0.001);
    cornerSubPix(src_gray, corners, winSize, zeroZone, criteria);
    for (size_t i = 0; i < corners.size(); i++)
    {
        circle(copy, corners[i], 4, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1, 8, 0);
    }
    namedWindow(source_window, WINDOW_AUTOSIZE);
    imshow(source_window, copy);
    for (size_t i = 0; i < corners.size(); i++)
    {
        cout << " -- Refined Corner [" << i << "]  (" << corners[i].x << "," << corners[i].y << ")" << endl;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章