파이썬의 모듈 opencv를 사용하여 이미지와 동영상을 출력해본다.
opencv를 사용하면 이미지를 다루는 일이 얼마나 쉬워지는지를 단적으로 보여준다.
다른 모듈에 비해서는 설치가 조금 어려우니까 아래의 포스팅을 참고한다.
컴퓨터 비전 | 파이썬 이미지 처리 | opencv 설치 및 테스트 | 윈도우10 (tistory.com)
우선 이미지를 출력하는 것을 보자.
아래의 소스코드로
import cv2
im_origin = cv2.imread('cv/girl01.jpg', cv2.IMREAD_COLOR)
cv2.namedWindow('Image',cv2.WINDOW_AUTOSIZE)
cv2.imshow('Image', im_origin)
cv2.moveWindow('Image', 700,300)
cv2.waitKey(0)
im_gray = cv2.cvtColor(im_origin, cv2.COLOR_BGR2GRAY)
cv2.imshow('Image Gray', im_gray)
cv2.imwrite('cv/girl_gray.png',im_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
아래와 같은 창을 출력할 수 있다. 함수의 기능을 보면 어렵지 않다.
cv2 모듈을 사용하여 파일을 읽어 오고 imshow 함수를 사용하여 화면에 출력하는 일을 한다.
imwrite 로 png 형식의 파일을 저장할 수도 있다.
다음은 동영상 출력이다.
놀랍게도 영상을 출력하는데 단 몇줄의 코드로 충분하다.
1. 영상을 파일로 부터 캡쳐한다.
클래스 type은 VideoCapture 다. 영상 하나를 인스턴스로 받아 온다고 보면 된다.
그런 다음에 파일을 읽기시작한다. isOpened 는 파일이 열려있는지를 확인한다. read 메소드는 파일의 상태인 run 과 <class 'numpy.ndarray'> 객체를 리턴하는데 넘파이의 배열이 동영상의 한장 한장인 이미지 파일이다.
동영상을 재생하는데 필요한 메소드도 이미지를 보여주는 메소드와 같다. 차이점은 동영상은 1초에 여러번 그림을 바꿔서 화면에 출력하는 것이고 이미지는 바뀌지 않을 뿐이다.
cv2.waitKey 의 매개변수가 얼마나 화면이 자주 갱신되는지를 결정한다. 숫자가 클수록 영상이 느려진다.
import cv2
capture = cv2.VideoCapture('cv/Pexels02.mp4')
while capture.isOpened():
run, frame = capture.read()
if not run:
print("[프레임 수신 불가] - 종료합니다")
break
img = cv2.cvtColor(frame, cv2.IMREAD_COLOR)
cv2.imshow('video', frame)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()
이제 파이썬으로 영상을 재생할 수 있게 되었다! 넘파이 객체를 분석한다면 이미지를 가지고 여러가지를 해볼 수 있을 것이다.