이전에 skew correction을 진행하여 사진의 기울어짐을 수정했었다. 그러나 houghlines를 통해 직선검출이 제대로 되지 않는 경우가 존재하여 이에대한 대안이 필요하다. 구글링을 통해 cam scanner에서 자주 쓰이는 기법으로 객체의 윤곽선을 검출하여 윤곽선 내의 이미지만 매핑하여 보여주는 방식을 알게되었다.
오늘은 이를 적용해서 skew correction의 대안으로 적합한지 알아보고자 한다.
Open cv에는 이미지의 기하학적 변형을 할 수 있는 다양한 함수들이 존재한다. cv2.findContours는 객체의 윤곽선 좌표를 검출한다. cv2.drawContours를 통해 검출된 좌표에 그림을 그릴 수 있다.
contours, hierarchy = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
이후 가장 큰 윤곽선만을 가지고 윤곽선을 그리기 위해 해당 방법을 사용했다.
contours = sorted(contours, key=cv2.contourArea, reverse=True)
contour = contours[0]
drawContours를 통해 윤곽선 정보를 그림에 나타내 보았다.
cv2.drawContours(img, contours, -1, (0,255,0), 4)
이후 윤곽선 내의 이미지만을 매핑하여 따로 이미지를 검출하였다.
def mapp(h):
h = h.reshape((4,2))
hnew = np.zeros((4,2), dtype=np.float32)
add = h.sum(1)
hnew[0] = h[np.argmin(add)]
hnew[2] = h[np.argmax(add)]
diff = np.diff(h, axis=1)
hnew[1] = h[np.argmin(diff)]
hnew[3] = h[np.argmax(diff)]
return hnew
아래그림과 같이 원치않은 윤곽선이 대표로 뽑히는 가능성이 존재하여 향후에는 알고리즘을 조금 수정하여 프로젝트에 적용해 보기로 한다.
[참고자료]