opencv - 2일차
어제는 파이썬에 ovencv 패키지를 설치했다.
오늘은 opencv 를 이용해서 이미지와 영상을 읽고 쓰고 나타내기를 실습해볼 것이다.
How to Read Images in OpenCV
python 환경에서 import opencv 명령으로 패키지를 다시 불러들이고
https://githib.com/opencv 에서 opencv-samples-data 에 들어가면 이미지, 영상 등 학습하는 목적으로 사용할 수 있는 데이터들이 모여있다. https://github.com/opencv/opencv 에서 opencv-master zip 파일을 다운받아서 앞으로 opencv 학습에서 사용하겠다.
import opencv 를 불러들인 에디터를 getting_started_with_images 이름으로 저장하고 이를 저장한 디렉토리와 sample data 중 lena.jpg (이미지, 영상처리 분야에서 단골로 나오는 분이다 ㅋㅋ)
이제 이 이미지를 python 환경에서 불러올 것이다.
import cv2
img = cv2.imread('lena.jpg',0)
print(img)
문장을 수행했다.
결과는 이미지의 픽셀 값들을 읽어오게 된다.
cv2.imread() 의 첫번 째 인자는 이미지의 이름이고, 두번째 인자는 -1, 0 혹은 1인데 각각은 다음과 같은 의미를 가진다.
1 loads a color image
0 loads image in grayscale mode
-1 loads image as such including alpha channel
이때 이미지 이름을 잘못해서 불러온다면 에러가 난다.
How to Show Images in OpenCV
cv2.imshow('image', img) 명령을 수행하면 앞서 우리가 img 로 읽어들인 이미지를 image 로 표시하게 된다.
cv2.waitKey(5000) 명령을 하면, 위의 image 가 5초간 지속된다.
cv2.destroyAllWindows() 명령을 하면 이미지창이 자동으로 꺼지게 된다.
cv2.imread('lena.jpg', ) 에서 0 말고도 -1, 1 값으로 해보면 컬러 이미지가 나오고 알파채널을 이용한 이미지도 나올 것이다.
How to Write Images in OpenCV
cv.imwrite('lena_copy.png', img) 명령을 수행하면 앞서 img 로 읽어들었던 이미지가 같은 디렉토리에 lena_copy.png 로 저장이 되는 것을 확인할 수 있다.
여기까지가 opencv 로 이미지를 읽어들이고 쓰고 나타내는 방법의 기초이다.
How to Read, Show Videos from Camera in OpenCV
동일하게 import cv2를 하고
cap = cv2.VideoCapture(0) 명령을 수행하여 cap 인스턴스를 만든다.
보통 VideoCapture 함수 안에 인덱스는 0으로 작동하지만 작동되지 않으면 -1을 한다.
비디오를 읽어들이는 과정이므로 while 루프를 통해 이미지 프레임을 연속적으로 캡처한다.
while (True):
ret, frame = cap.read() # ret 는 True 혹은 False 값. frame 이 이용가능하면 True 이고 아니면 False.
cv2.imshow('frame', frame) # 불러온 영상을 frame 이라는 이름으로 가져온다.
if cv2.waitKey(1) & 0xFF == ord('q'): # 만약 사용자가 q 키를 치게 되면 영상을 그만 찍게 한다.
break
cap.release() # 비디오를 읽어들이고 나서 release 하는 것이 중요하다.
cv2.destroyAllWindows() # while 문을 빠져나오게 되면 모든 창을 닫는다.
비디오를 캡처해서 ㅋㅋㅋㅋㅋ 얼굴이 나오길래 급하게 손세정제로 가려봤다. 신기신기
cap 인스턴스를 이용해서 다양한 응용을 할 수 있다.
import cv2
cap = cv2.VideoCapture(0)
while (True):
ret, frame = cap.read()
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
밑줄 친 두 줄을 추가한다면
프레임의 width와 height 가 출력된다.
위와 같은 특성들은 https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html 사이트에 잘 정리되어 있다.
How to Write Videos from Camera in OpenCV
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# fourcc 라는 것은 4 글자 코드라는 뜻이며 4바이트로 된 문자열은 데이터 형식을 구분하는 고유 글자가 된다. 주로 avi 파일의 영상 코덱을 구분할 때 사용된다. 'DIVX', 'XVID' 등이 많이 사용되는 확장자이다.
# 우선 'XVID' 확장자로 fourcc 인스턴스를 만들어주고
out = cv2. VideoWriter('output.avi', fourcc, 20.0, (640, 480))
# VideoWriter의 첫번째 인자는 write 할 파일명- 'output.avi'
# 두번째 인자로 fourcc 즉 확장자명을 전달하고
# 세번째 인자는 1초에 이용할 프레임 수, 즉 20개
# 프레임(비디오)의 크기
# out 인스턴스 생성 완료
while (True):
ret, frame = cap.read()
if ret == True:
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
위의 문장을 수행하면 'output.avi'로 비디오 파일이 생성된 것을 볼 수 있다.
read, write, show 함수에 인자로 들어갈 수 있는 옵션이 많은 것 같은데 하나씩 공부해야겠다.
출처: 유튜브 opencv 튜토리얼 강좌
OpenCV Python Tutorial For Beginners 3 - How to Read, Write, Show Images in OpenCV
OpenCV Python Tutorial For Beginners 4 - How to Read, Write, Show Videos from Camera in OpenCV
설명 잘 해주시고 실습도 다 따라할 수 있으니 한번 보는 것도 공부하는 데 도움 될 것 같아요! ㅎㅎ