OpenCV

perspective Correction(클릭해서 이미지 추출)

728x90

 

import cv2
import numpy as np
from utils import get_four_points

img_src = cv2.imread('data/images/book1.jpg')

#사이즈가 있고 첫 좌표(0,0)이 있다면 점만 찍어줘도
#이미지의 크기를 다 알 수 있다.
dst_size = (400,300,3)

img_dst = np.zeros(dst_size, np.uint8)

cv2.imshow('DST', img_dst)

#원본이미지로 부터 마우스 클릭으로 4개의 점을 가져온다.
cv2.imshow('Image', img_src)
points_src = get_four_points(img_src)

#새로 만들 이미지에서는 위의 원본 이미지 4개 점과 맵핑할 점을 잡아줘야 함.
points_dst = np.array([0,0, 
                    dst_size[1],0, 
                    dst_size[1],dst_size[0], 
                    0,dst_size[0] ], dtype=float )
#4개의 좌표값

#행렬로 만들어줌(4,2)
points_dst = points_dst.reshape(4,2)

#h, 행렬값을 구하기 위함.
h, status = cv2.findHomography(points_src,points_dst)

#이미지를 변형시킨다.
img_dst = cv2.warpPerspective(img_src, h, (dst_size[1],dst_size[0]))

#이미지 표출
cv2.imshow('DST', img_dst)

# cv2.imwrite('data/images/my1_thumbnail.jpg', result)

cv2.waitKey(0)
cv2.destroyALLWindow()

util 함수

import cv2
import numpy as np

def mouse_handler(event, x, y, flags, data):
    if event == cv2.EVENT_FLAG_LBUTTON:
        cv2.circle(data['im'], (x,y),3,(0,0,255),5,16)
        cv2.imshow('Image',data['im'])
        if len(data['points'])<4:
            data['points'].append([x,y])
# 점 찍은 좌표를 입력받을것이다.

def get_four_points(im):
    data={}
    data['im'] = im.copy()
    data['points']=[]

    cv2.imshow('Image', im)
    cv2.setMouseCallback("Image", mouse_handler,data)
    #좌표를 받고싶을때 사용.
    cv2.waitKey(0)

    # 유저가 마우스로 찍은 점을 float로 바꿔야 함.
    points = np.array(data['points'], dtype=float)
    return points

728x90

'OpenCV' 카테고리의 다른 글

hueHistogram  (0) 2021.04.20
virtual Bilbord(빌보드 전광판 사진 바꾸기)  (0) 2021.04.20
homography_book  (0) 2021.04.20
rotate / warpAffine/ getAffine 이미지 돌리기  (0) 2021.04.20
opening, closing  (0) 2021.04.20