Corner 검출

OpenCV가 제공하는 Corner 검출 알고리즘

  • Harris Corner : 전통적인 Corner detect 알고리즘. 1980년대 Harris가 고안하였으며 코너에 대한 이론을 정립.
  • Good Feature : Harris Corner 보완버전. 추적하기 좋은 특징 (코너)를 검출하는 알고리즘.
  • FAST : 주변픽셀 대비 밝기 변화를 판단하여 코너 검출.

Src

Harris Corner

  • Sobel 연산을 수행하여 그레디언트 값을 작성.
  • 코너 응답 함수 R을 반환하여 R(x,y)가 충분히 크면 코너로 구분.
  • 반환값은 Float로 실수형으로 나오는데, 해당 값을 필터링하여 사용해야함.
    
    auto blocksize = 5; // 코너 응답함수 계산에 고려할 이웃픽셀의 크기 (Norm : 2~5)
    auto ksize = 3; // 소벨 연산 커널 크기. (Norm : 3)
    auto k = 0.05; // 해리스 코너 검출 상수 (0.04~0.06)
    auto threshold = 0.000001; // 결과 임계치
    double dMin{}, dMax{};
    cv::Mat matSrc = cv::imread("src.bmp");
    cv::Mat matCorner;
    cv::cornerHarris(matSrc, matCorner, blocksize, ksize, k, cv::BorderTypes::BORDER_DEFAULT);
    cv::threshold(matCorner, matCorner, threshold, 255, cv::ThresholdTypes::THRESH_BINARY);
    cv::minMaxIdx(matCorner, &dMin, &dMax);
    
  

Harris Result

GoodFeatures To Track

  • Harris Corner의 업그레이드 버전.
  • 비최대 억제 수행으로 지역 최대 값을 반환.
  • 코너 품질 함수를 정의하여 가장 값이 큰 순서대로 정렬하여 반환.
    
    auto maxCorners = 0; // 최대 코너 개수. 0보다 작거나 같으면 무제한.
    auto qualityLevel = 0.01; // 코너점 결정을 위한 값. (Norm : 0.01~0.1)
    auto minDistance = 5; 코너점  최소 거리.
    cv::Mat matSrc = cv::imread("src.bmp");
    std::vector<cv::Point2f> pnts;
    cv::goodFeaturesToTrack(matSrc, pnts, maxCorners, qualityLevel, minDistance);
    
  

GoodFeatures Result

FAST (Features from Accelerated Segment Test)

  • 주변 16개 픽셀값 크기를 분석하여 기준 픽셀보다 충분히 어둡거나 밝은 픽셀이 연속으로 나타나면 코너로 인식.
  • Harris, GoodFeature보다 빠르게 동작.
        
    auto threshold = 10; // 중심 픽셀, 주변 픽셀간의 차이 임계값. 기본값 10. (Norm : 30~60)
    auto nonmaxSuppression = true; // 비최대 억제 수행 여부. 기본값 True.
    cv::Mat matSrc = cv::imread("src.bmp");
    std::vector<cv::KeyPoint> pnts;
    cv::FAST(matSrc, pnts, threshold, nonmaxSuppression, cv::FastFeatureDetector::DetectorType::TYPE_9_16);
    
  

FAST Result

참고 : https://deep-learning-study.tistory.com/251