시작하기 앞서,
Corner가 무엇일까?
코너(모서리)란 이미지 밝기의 급격한 변화인 두 모서리의 접합점으로 해석될 수 있다.
아래이미지를 보면 위의 설명이 이해가 된다.
Harris Corner Detection은 1988년에 개발된 알고리즘이다.
cv2.cornerHarris(input image, block size, ksize, k)
함수는 이렇게생겼고 바로 실습으로 가보자.
# Load image then grayscale
image = cv2.imread('images/chess.JPG')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# The cornerHarris function requires the array datatype to be float32
gray = np.float32(gray)
harris_corners = cv2.cornerHarris(gray, 3, 3, 0.05)
#We use dilation of the corner points to enlarge them\
kernel = np.ones((7,7),np.uint8)
harris_corners = cv2.dilate(harris_corners, kernel, iterations = 2)
# Threshold for an optimal value, it may vary depending on the image.
image[harris_corners > 0.025 * harris_corners.max() ] = [255, 127, 127]
imshow('Harris Corners', image)
original image은 색상변화가 크고 각이 많이져있는 체스판을 선택했다.
아까 보여준 Harris 코너감지 함수를 이용해서 원을 만들어준다.
gray = np.float32(gray)
harris_corners = cv2.cornerHarris(gray, 3, 3, 0.05)
harris_corners를 바로 찍어보자
저 하얀 부분이 코너에 대한 부분을 찾았다는 것같다.
에러가 발생하는데 이유는 찾았다는 정보만 있지 시각적으로 나타낸 코드는 없기 때문이다.
kernel = np.ones((7,7),np.uint8)
harris_corners = cv2.dilate(harris_corners, kernel, iterations = 2)
찾은 저 부분을 확장시키기 위해 cv2.dilate함수를 이용해서 코너를 확장시켰다.
image[harris_corners > 0.025 * harris_corners.max() ] = [255, 127, 127]
이 부분은 이미지에 임계값을 적용한 것으로 코너를 표시할때 사용된다.
임계값을 적용한 이미지를 출력해보자.
imshow('Harris Corners', image)
내가 원하는 모양의 출력값이 나왔다.
좀더 간단하고 좋은 품질을 내주는 함수를 사용해보자.
cv2.goodFeaturesToTrack(input image, maxCorners, qualityLevel, minDistance)
img = cv2.imread('images/chess.JPG')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# We specific the top 50 corners
corners = cv2.goodFeaturesToTrack(gray, 150, 0.0005, 10)
for corner in corners:
x, y = corner[0]
x = int(x)
y = int(y)
cv2.rectangle(img,(x-10,y-10),(x+10,y+10),(0,255,0), 2)
imshow("Corners Found", img)
위의 사용했던 코너찾는 알고리즘과 달리 끝에 추가로 더 찾아지는 부분이 있는데 중간에 몇개씩 인식을 못하는걸 보아하니 이 부분을 실제로 사용할때는 좀더 필터를 하고 사용을 해야한다.