오늘은 영상 속의 특징점(Keypoint)를 검출할 수 있는 Harris Corner에 대해 알아보겠습니다.
1998년도에 발표된 Harris Corner는 1980년도에 발표된 Moravec's Corner의 방법을 보안한 알고리즘으로서,
영상에서 코너의 특징점을 찾는 것입니다. 간략하게 말하자면 아래 그림과 같이 작은 영역을 이동시키며,
이동된 영역과 비교하여 얼마나 변화했는지 찾는 것입니다.
아래 그림과 같이 이동되기 전과 이동된 영역의 변화의 차이인 R이 0보다 작으면 엣지(Edge), 둘다 0에 가까우면
플렛(Flat), 0보다 크면 코너점이 됩니다.
* 위 설명은 수학적 과정에 대한 언급 없이 표면적으로 간단하게 설명한 것입니다. 수학적인 전체의 과정은 추후에
충분히 이해한 뒤 내용을 추가해 작성하도록 하겠습니다.
아래 코드는 Opencv에서 제공하는 라이브러리 속 함수인 cornerHarris()를 사용한 예시입니다.
* 본 코드는 Opencv 3.1.0 Version에서 사용하였습니다.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// Harris Corner thresh
int thresh = 120;
int main()
{
Mat img = imread("D:\\sea.jpg");
Mat gray;
// Image resize
resize(img, img, Size(500, 500), 0, 0, INTER_LANCZOS4);
Mat img_copy = img.clone(); // 원본 이미지 복사
Mat show_img = img.clone(); // 원본 이미지 복사
// Grayscale
cvtColor(img, gray, CV_BGR2GRAY);
Mat harris_c;
Mat harris_norm;
Mat cs_abs;
harris_norm = Mat::zeros(gray.size(), CV_32FC1);
// Harris Corner
// cornerHarris(입력 이미지(Grayscale), 출력 이미지, 인접 픽셀 크기(Blocksize), Sobel ksize, Harris parameter, 픽셀 보간법)
cornerHarris(gray, harris_c, 2, 3, 0.05, BORDER_DEFAULT);
// 정규화(Normalizing)
// normalize(입력 이미지, 출력 이미지, normalize range(low), normalize range(high), 픽셀 보간법)
normalize(harris_c, harris_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
// 미분한 결과에 절대값을 적용하여 8bit의 unsigned int형으로 바꾸어 표현
convertScaleAbs(harris_norm, cs_abs);
// Drawing a circle around corners
for (int j = 0; j < harris_norm.rows; j += 1)
for (int i = 0; i < harris_norm.cols; i += 1)
if ((int)harris_norm.at<float>(j, i) > thresh)
circle(img_copy, Point(i, j), 7, Scalar(255, 0, 255), 0, 4, 0);
imshow("Original Image", show_img);
imshow("convertScaleAbs", cs_abs);
imshow("Harris Corner Detection", img_copy);
waitKey(0);
}
Harris Corner Detection은 영상의 평행이동, 회전변화에는 불변이고, affine 변화, 조명 변화에도 어느정도 강인한
특성을 가지고 있지만 영상의 크기 변화에는 민감함을 보입니다.
< 참고 및 인용 자료 >
1) https://darkpgmr.tistory.com/131
2) http://egloos.zum.com/eyes33/v/6097465
3) https://leechamin.tistory.com/293
'OpenCV' 카테고리의 다른 글
Window 10에서 OpenCV(3.1.0) 설치 및 테스트 (0) | 2020.12.29 |
---|---|
[OpenCV] 선택 영역 이미지 추출 setMouseCallback() (0) | 2020.04.15 |
[Opencv] 동영상 저장 (0) | 2020.04.10 |
[Opencv] 이진화 라벨링 (0) | 2020.04.09 |
[Opencv] 이미지 파일에 텍스트 숨기기 - 스테가노그래피 (0) | 2020.04.03 |