import cv2
img = cv2.imread('img.jpg')
flip_horizontal = cv2.flip(img, 1) # flipCode > 0 : 좌우 대칭 Horizontal
cv2.imshow('img', img)
cv2.imshow('flip_horizontal', flip_horizontal)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img = cv2.imread('img.jpg')
flip_vertical = cv2.flip(img, 0) # flipCode == 0 : 상하 대칭 Vertical
cv2.imshow('img', img)
cv2.imshow('flip_vertical', flip_vertical)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img = cv2.imread('img.jpg')
flip_both = cv2.flip(img, -1) # flipCode < 0 : 상하좌우 대칭
cv2.imshow('img', img)
cv2.imshow('flip_both', flip_both)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img = cv2.imread('img.jpg')
rotate_90 = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 시계 방향으로 90도 회전
cv2.imshow('img', img)
cv2.imshow('rotate_90', rotate_90)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img = cv2.imread('img.jpg')
rotate_180 = cv2.rotate(img, cv2.ROTATE_180) # 180도 회전
cv2.imshow('img', img)
cv2.imshow('rotate_180', rotate_180)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img = cv2.imread('img.jpg')
rotate_270 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) # 시계 반대 방향으로 90도 회전
cv2.imshow('img', img)
cv2.imshow('rotate_270', rotate_270)
cv2.waitKey(0)
cv2.destroyAllWindows()
처음부터 이미지를 흑백으로 불러오는 것이 아닌 불러온 이미지를 흑백으로 변경시킨다.
import cv2
img = cv2.imread('img.jpg')
dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('img', img)
cv2.imshow('gray', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
커널 사이즈 변화에 따른 흐림
import cv2
img = cv2.imread('img.jpg')
kernel_3 = cv2.GaussianBlur(img, (3, 3), 0)
kernel_5 = cv2.GaussianBlur(img, (5, 5), 0)
kernel_7 = cv2.GaussianBlur(img, (7, 7), 0)
cv2.imshow('img', img)
cv2.imshow('kernel_3', kernel_3)
cv2.imshow('kernel_5', kernel_5)
cv2.imshow('kernel_7', kernel_7)
cv2.waitKey(0)
cv2.destroyAllWindows()
커널 사이즈는 보통 양수에 홀수로 지정한다. 주로 (3, 3), (5, 5), (7, 7)을 사용한다.
표준 편차에 따른 흐림
import cv2
img = cv2.imread('img.jpg')
sigma_1 = cv2.GaussianBlur(img, (0, 0), 1) # sigmaX - 가우시안 커널의 x 방향의 표준 편차
sigma_2= cv2.GaussianBlur(img, (0, 0), 2)
sigma_3= cv2.GaussianBlur(img, (0, 0), 3)
cv2.imshow('img', img)
cv2.imshow('sigma_1', sigma_1)
cv2.imshow('sigma_2', sigma_2)
cv2.imshow('sigma_3', sigma_3)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
img = cv2.imread('newspaper.jpg')
width, height = 640, 240 # 가로크기 640, 세로 크기 240으로 결과물 출력
src = np.array([[511, 352], [1008, 345], [1122, 584], [455, 594]], dtype=np.float32) # Input 4개 지점
dst = np.array([[0, 0], [width, 0], [width, height], [0, height]], dtype=np.float32) # Output 4개 지점
# 좌상, 우상, 우하, 좌하 (시계 방향으로 4 지점 정의)
matrix = cv2.getPerspectiveTransform(src, dst) # Matrix 얻어옴
result = cv2.warpPerspective(img, matrix, (width, height)) # matrix 대로 변환을 함
cv2.imshow('img', img)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
원본 이미지의 일부의 4개 지점을 지정하고 이렇게 지정된 사다리꼴을 직사각형으로 변형시키는 것이다.
import cv2
import numpy as np
img = cv2.imread('poker.jpg')
width, height = 530, 710
src = np.array([[702, 143], [1133, 414], [726, 1007], [276, 700]], dtype=np.float32) # Input 4개 지점
dst = np.array([[0, 0], [width, 0], [width, height], [0, height]], dtype=np.float32) # Output 4개 지점
# 좌상, 우상, 우하, 좌하 (시계 방향으로 4 지점 정의)
matrix = cv2.getPerspectiveTransform(src, dst) # Matrix 얻어옴
result = cv2.warpPerspective(img, matrix, (width, height)) # matrix 대로 변환을 함
cv2.imshow('img', img)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
사다리꼴 이미지 펼치기와 똑같다. 그저 좌표만 변경해준 것이다.
마우스 이벤트 등록
마우스 이벤트를 등록하기 위해서는 바로 imshow를 하는 것이 아니라, 윈도우를 먼저 정의해줘야 한다.
import cv2
def mouse_handler(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN: # 마우스 왼쪽 버튼 Down
print(x, y)
elif event == cv2.EVENT_LBUTTONUP: # 마우스 왼쪽 버튼 Up
print(x, y)
img = cv2.imread('poker.jpg')
cv2.namedWindow('img') # img란 이름의 윈도우를 먼저 만들어 두는 것, 여기에 마우스 이벤트를 처리하기 위한 핸들러 적용
cv2.setMouseCallback('img', mouse_handler)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
그 외의 이벤트
import cv2
def mouse_handler(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN: # 마우스 왼쪽 버튼 Down
print(x, y)
elif event == cv2.EVENT_LBUTTONUP: # 마우스 왼쪽 버튼 Up
print(x, y)
elif event == cv2.EVENT_LBUTTONDBLCLK: # 마우스 왼쪽 버튼 더블 클릭
print('DBLCLICK')
elif event == cv2.EVENT_MOUSEMOVE: # 마우스 움직임
print('Move')
elif event == cv2.EVENT_RBUTTONDOWN: # 오른쪽 버튼 Down
print('right down')
img = cv2.imread('poker.jpg')
cv2.namedWindow('img') # img란 이름의 윈도우를 먼저 만들어 두는 것, 여기에 마우스 이벤트를 처리하기 위한 핸들러 적용
cv2.setMouseCallback('img', mouse_handler)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
더블 클릭과 다운 이벤트가 같이 있는 경우에 더블 클릭을 하게 되면 Down - Up - DBLCLK - UP으로 진행된다.
프로젝트
import cv2
import numpy as np
point_list = []
src_img = cv2.imread('poker.jpg')
COLOR = (255, 0, 255)
def mouse_handler(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
point_list.append((x, y))
for point in point_list:
cv2.circle(src_img, point, 15, COLOR, cv2.FILLED)
if len(point_list) == 4:
show_result() # 결과 출력
cv2.imshow('img', src_img)
def show_result():
width, height = 530, 710
src = np.float32(point_list)
dst = np.array([[0, 0], [width, 0], [width, height], [0, height]], dtype=np.float32) # Output 4개 지점
# 좌상, 우상, 우하, 좌하 (시계 방향으로 4 지점 정의)
matrix = cv2.getPerspectiveTransform(src, dst) # Matrix 얻어옴
result = cv2.warpPerspective(src_img, matrix, (width, height)) # matrix 대로 변환을 함
cv2.imshow('result', result)
cv2.namedWindow('img')
cv2.setMouseCallback('img', mouse_handler)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
개선
실시간으로 직선이 마우스를 따라다니면서 영역을 표현해준다.
import cv2
import numpy as np
point_list = []
src_img = cv2.imread('poker.jpg')
COLOR = (255, 0, 255)
THICKNESS = 3
drawing = False # 선을 그릴지 여부
def mouse_handler(event, x, y, flags, param):
global drawing
dst_img = src_img.copy()
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True # 선을 그리기 시작
point_list.append((x, y))
if drawing:
prev_point = None # 직선의 시작점
for point in point_list:
cv2.circle(dst_img, point, 15, COLOR, cv2.FILLED)
if prev_point:
cv2.line(dst_img, prev_point, point, COLOR, THICKNESS, cv2.LINE_AA)
prev_point = point
next_point = (x, y)
if len(point_list) == 4:
show_result() # 결과 출력
next_point = point_list[0] # 첫 번째 클릭한 지점
cv2.line(dst_img, prev_point, next_point, COLOR, THICKNESS, cv2.LINE_AA)
cv2.imshow('img', dst_img)
def show_result():
width, height = 530, 710
src = np.float32(point_list)
dst = np.array([[0, 0], [width, 0], [width, height], [0, height]], dtype=np.float32) # Output 4개 지점
# 좌상, 우상, 우하, 좌하 (시계 방향으로 4 지점 정의)
matrix = cv2.getPerspectiveTransform(src, dst) # Matrix 얻어옴
result = cv2.warpPerspective(src_img, matrix, (width, height)) # matrix 대로 변환을 함
cv2.imshow('result', result)
cv2.namedWindow('img')
cv2.setMouseCallback('img', mouse_handler)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()