When will you grow up?

22. 관심점 검출(Harris corner detector) 본문

02. Study/Computer Vision(openframworks&opencv)

22. 관심점 검출(Harris corner detector)

미카이 2016. 12. 2. 17:03

reference(저작권에 위배되는 내용이 있으면 바로 지우겠습니다.) 

book

->
OpenCV를 활용한 컴퓨터 비전 프로그래밍 - 기본 영상처리부터 고급 컴퓨터 비전까지 아우르는

search

->

http://docs.opencv.org/3.1.0/d4/d7d/tutorial_harris_detector.html



컴퓨터 비전(computer vision)에서는 객체 인식, 영상 정합(image registration), 시각 추적 ,3D 재구성 등 많은 문제를 해결하기 위해 특징점(keypoint or feature point)이라고 부르기도 하는 관심점(point of interest)의 개념을 사용.

영상 내용 분석에 관심점을 사용하기 때문에 영상의 시점, 크기나 방향에 관계없이 동일한 장면이나 객체 위치에서 이상적으로 특징점을 검출 할 수 있다.


-영상에서 코너 검출

코너는 두 에지 사이에 교차하므로 위치를 정확하게 찾아낼 수 있는 2차원적인 특징 때문에 다른 영상에서 반복해서 위치를 정밀하게 찾기가 어려운 점과 대비된다.


해리스 코너(Harris corner)

openCV함수는 -> cv::cornerHarris


cornerHarris(image,      //입력영상

         cornerStrength,  //코너 추출 영상(output)

         3,                   // 이웃 크기

         3,                   // 직경 크기

         0.01)               // 해리스 파라미터



결과 영상 입니다.

                   원본                                                           harris corner



[과정]

- 원본이미지 로딩(src)

- 원본 이미지를 gray로 cvt (src_gray)

- cornerHarris를 이용하여 gray된 이미지 변경(dst)

- dst 를 normalize (dst_norm)

- dst_norm을 convertScaleAbs를 이용하여 절대 값 결과를 8비트로 변환(dst_norm_scaled)

- dst_norm를 순회하면서 thresh보다 높은곳에 circle표시



코드 입니다



Mat src, src_gray;
int thresh = 200;
int max_thresh = 255;
void cornerHarris_demo(int, void*);
//--------------------------------------------------------------
void ofApp::setup() {

	src = imread("freeimage.jpg", 1);
	imshow("원본",src);
	cvtColor(src, src_gray, COLOR_BGR2GRAY);
	
	Mat dst, dst_norm, dst_norm_scaled;
	dst = Mat::zeros(src.size(), CV_32FC1);
	int blockSize = 3;
	int apertureSize = 3;
	double k = 0.04;
	cornerHarris(src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT);
	normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
	convertScaleAbs(dst_norm, dst_norm_scaled);
	for (int j = 0; j < dst_norm.rows; j++)
	{
		for (int i = 0; i < dst_norm.cols; i++)
		{
			if ((int)dst_norm.at(j, i) > thresh)
			{
				circle(dst_norm_scaled, Point(i, j), 5, Scalar(0), 2, 8, 0);
			}
		}
	}
	imshow("harriscorner", dst_norm_scaled);
	waitKey(0);


Comments