카테고리 없음

opencv - 2일차

judy9710 2020. 2. 21. 22:50

어제는 파이썬에 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

 

설명 잘 해주시고 실습도 다 따라할 수 있으니 한번 보는 것도 공부하는 데 도움 될 것 같아요! ㅎㅎ