본문 바로가기

개인공부/python

나 혼자 하는 프로젝트 5탄 - OpenCV - 1. 이미지&동영상 출력

평소에 관심있는 파트는 아니지만, 그래도 나도코딩 유튜버님의 무료강의 편이 있어, 겸사겸사 공부를 시작했다.

코드 작성은 Jupyter notebook을 활용하여 작성하였고, opencv-python 이라는 라이브러리는 따로 설치하여 사용해야 한다. (영상은 4.5.5 버전인데, 22.11.22 기준 4.6.0 버전으로 업데이트 되었다.)

먼저 이미지 출력하는 방법이다.

해당 코드에 사용한 이미지는 pixabay.com 에서 다운로드 하였다.

 

https://pixabay.com/

 

앞서 cv2 라이브러리를 불러왔기 때문에, 따로 import 해줄 필요는 없다.

img 라는 변수에 cv2.imread()를 통해 해당 이미지를 변수에 선언하여 주었다.

cv2.imshow()는 두개의 전달값을 사용하는데 첫번째는 새로운 창에 사용할 제목(title)이고, 두번째는 사용할 img 파일이다.

cv2.waitKey()는 지정된 시간 동안 사용자로부터 키 입력을 대기하는 함수이다.(K는 대문자! 주의!!)

위에서는 0 이라고 작성하였고, 키 입력을 무한정 대기하게 된다. 키가 입력되면 바로 다음 코드로 넘어간다.

입력된 키는 아스키 코드를 통해 숫자형으로 전달되는데, 해당 키 값에 따라 다양한 동작을 지정해 줄 수 있다.

cv2.cestroyAllWindows() 는 실행된 cv2 윈도우를 모두 종료하는 함수이다.

 

cv2_imread()에는 3가지 옵션이 존재한다.

기본값은 cv2.IMREAD_COLOR 이며, 이미지를 불러올때 투명한 영역은 무시하고 불러오게 된다.

cv2.IMREAD_GRAYSCALE은 흑백으로 이미지를 변환하여 보여준다.

cv2.IMREAD_UNCHANGED는 투명 영역까지 포함하여 이미지를 불러온다.

위에 사용한 이미지에서는 딱히 투명 영역이 없어서 COLOR와 UNCHANGED 의 차이는 없다.

 

shape를 이용하면 해당 이미지 파일에 대한 세로, 가로, Channel 정보를 확인할 수 있다.

해당 파일의 경우 rgb 3 컬러로 이루어져, 값이 3으로 출력되어 있는데 투명도가 있는 rgba인 경우 4로 출력될 것이다.

 

동영상의 경우에는 이미지와 조금 다른 방법으로 생각해야 한다.

각 영상에는 프레임이 존재하고, 우리는 이 프레임을 지속적으로 불러와 화면에 송출해야 한다.

이를 위해 반복문을 사용해야 한다.

 

먼저 pexels.com 에서 무료 동영상을 다운받아 준비하자

https://www.pexels.com/ko-kr/

 

영상을 출력해주기 위해서는 while 반복문을 사용해야 한다.

(참고로, 해당 cv2.VideoCapture()를 통해 생성된 객체는 반복가능한 객체가 아니기에 for문을 사용할 수 없다.)

isOpened()함수를 통해 해당 파일이 열려있는 경우 반복문은 계속 실행된다.

여기서 ret는 True와 False값만 가지게 된다. 즉, if not ret: 는 ret가 False경우에 실행된다

ret 가 True 인 경우에는 cv2.imshow()를 통해 'video'라는 새창에 frame을 지속적으로 보여주게 된다.

한가지 재미있는건 바로 아래 작성한 cv2.waitKey()에 의해 영상의 재생속도가 제어된다는 점이다.

숫자가 커질수록 영상은 느려진다.

ord('q')값은 앞서 설명한 아키코드로 변화한 숫자형 데이터를 의미한다.

release()를 통해 해당 자원을 해제하게 되는데, 영상만 가져와서 보여줄 경우에는 크게 필요치 않다.

 

컴퓨터에 설치된 카메라를 통해서도 동영상을 가져와 새로운 창에서 보여줄 수 있다.

이때 cv2.VideoCapture()는 카메라 장치의 ID를 전달값으로 사용하는데, 보통 가정에 설치된 웹캠은 1대 이기에 0을 입력하면 된다.

나머지 부분은 동영상을 가져와 출력하는 것과 동일하다.

해당 코드를 작성하면서 한가지 이해할수 없는 부분은 바로 exit()함수가 올바로 작동하지 않는다는 점이다.

해당 코드를 그대로 복사해서 VS CODE 프로그램에서 실행시키면, while문은 실행되지 않지만, Jupyter notebook에서는 '더 이상 영상이 없습니다.'라는 문구까지 뜨면서, while문이 최종 실행되었다...

그래서 해당 if문이 True 인 경우 while문이 실행되도록 해주었고, False 인 경우 exit()를 통해 if문이 종료되도록 해주었다.

(나중에 노트북으로 해당 코드를 다시 실행해 봐야겠다.)