이미지 스캐너 만들기

예제 이미지 : 

(직접 찍은 사진을 올려서 테스트 진행하는 것을 추천 드립니다. 없는 분들은 다운로드해서 사용 가능)

예제 코드 :

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)_(이미지 변환 응용))

 

OpenCV - 영상(이미지) 다루기(9)_(이미지 변환 응용)

이전 포스팅에서, 이미지 변환(회전)에 대해서 알아보았는데요, 영상처리에서 가장 중요한 부분이기도 하기 때문에 따로 포스팅을 해두었습니다. 이미지 회전에서는 어파인(Affine) 변환과 투시(P

dk-kang.tistory.com

이 문서를 참고하시면 됩니다.

* 마우스 커서 움직이는 좌표는 start_points의 기록됨. 출력된 결과를 나타내줄 좌표는 end_points (미리 선언함)

적절한 변환 함수만 추가하여 이미지를 변환 후, 그 이미지를 출력하면 됩니다.

 

참고 :

원 또는 line 설정(크기, 색깔)을 원하는 형태로 바꾸셔도 무방.

 

응용 :

완성된 이미지를 저장하여 스캐너 프래그램으로 사용 가능.

그레이스케일 처리 하면, 카피본으로 사용 가능.

이진처리를 하면, 문서 스캐너로도 활용 가능.

 

 

반응형

+ Recent posts