이미지 스캐너 만들기
예제 이미지 :
(직접 찍은 사진을 올려서 테스트 진행하는 것을 추천 드립니다. 없는 분들은 다운로드해서 사용 가능)
예제 코드 :
import numpy as np
import cv2
def draw_borderline(img, corners):
copy_image = img.copy()
for pt in corners:
cv2.circle(copy_image, tuple(pt), 20, (0, 255, 255), -1, 1)
cv2.line(copy_image, tuple(corners[0]), tuple(corners[1]), (0, 255, 255), 4, 5)
cv2.line(copy_image, tuple(corners[1]), tuple(corners[2]), (0, 255, 255), 4, 5)
cv2.line(copy_image, tuple(corners[2]), tuple(corners[3]), (0, 255, 255), 4, 5)
cv2.line(copy_image, tuple(corners[3]), tuple(corners[0]), (0, 255, 255), 4, 5)
return copy_image
def onMouse(event, x, y, flags, param):
global points
if event == cv2.EVENT_LBUTTONDOWN:
for i in range(4):
if cv2.norm(start_points[i] - (x, y)) < 20:
drag_points[i] = True
points = (x, y)
break
if event == cv2.EVENT_LBUTTONUP:
for i in range(4):
drag_points[i] = False
if event == cv2.EVENT_MOUSEMOVE:
for i in range(4):
if drag_points[i]:
dx = x - points[0]
dy = y - points[1]
start_points[i] += (dx, dy)
cpy = draw_borderline(image, start_points)
cv2.imshow('image', cpy)
points = (x, y)
break
# 불러올 이미지 지정
image = cv2.imread('choco.jpg')
# 이미지 세로와 너비 추출
h, w = image.shape[:2]
result_w = 210 * 3
result_h = 297 * 3
# 모서리 점들의 좌표, 드래그 상태 여부
start_points = np.array([[50, 50], [50, h-50], [w-50, h-50], [w-50, 50]], np.float32)
end_points = np.array([[0, 0], [0, result_h-1], [result_w-1, result_h-1], [result_w-1, 0]], np.float32)
# 현재 드래그 하는 포인트를 기억하는 함수, 눌러지게 되면 True로 변경됨, 놓으면 다시 False
drag_points = [False, False, False, False]
# 모서리점, 사각형 그리기
borderline = draw_borderline(image, start_points)
# cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.imshow('image', borderline)
cv2.setMouseCallback('image', onMouse)
while True:
key = cv2.waitKey()
실습내용 :
1. 예제 코드 해석 : 함수 이해 (draw_borderline , onMouse)
2. 파일 이미지가 너무 크면, 창 크기를 조절할 수 있는 함수 사용할 것. (주석 처리)
3. enter 키를 누르면, 결과가 출력되고, esc 키를 누르면 종료되게끔 작동을 한다.
4. 결과 : 변환 함수를 사용하여 결과 이미지를 출력한다.
힌트 :
(OpenCV - 영상(이미지) 다루기(9)_(이미지 변환 응용))
이 문서를 참고하시면 됩니다.
* 마우스 커서 움직이는 좌표는 start_points의 기록됨. 출력된 결과를 나타내줄 좌표는 end_points (미리 선언함)
적절한 변환 함수만 추가하여 이미지를 변환 후, 그 이미지를 출력하면 됩니다.
참고 :
원 또는 line 설정(크기, 색깔)을 원하는 형태로 바꾸셔도 무방.
응용 :
완성된 이미지를 저장하여 스캐너 프래그램으로 사용 가능.
그레이스케일 처리 하면, 카피본으로 사용 가능.
이진처리를 하면, 문서 스캐너로도 활용 가능.
반응형
'AI > OpenCV-실습' 카테고리의 다른 글
OpenCV - 실습 (0) | 2020.09.03 |
---|---|
OpenCV - 영상(이미지) 다루기(9)_(이미지 변환 응용) (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(8)_(이미지 변환) (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(7)_(트랙바 사용) (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(6)_(마우스 함수) (1) | 2020.09.02 |