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 |