2-6. 카메라와 동영상 처리하기2
cv2.VideoWriter
OpenCV에서 크기와 데이터 타입이 동일한 일련의 프레임을 동영상 파일로 저장할 수 있게 하는 클래스
Fourcc(FOUR Character Code, 4-문자 코드): 동영상 파일의 코덱, 압축 방식, 색상, 픽셀 포맥 등을 정의하는 정수 값 (디테일한 내용은 여기 참고!) 아래 표는 자주 쓰이는 코덱들이다. 코덱들의 경우 사용을 위해 설치가 필요하다. (글쓴이는 다음의 팟플레이어 설치하면서 오픈 코덱도 같이 설치했던 기억이 있다.)
* '' 앞에 *이 달릴 경우 안에 있는 문자열을 풀어서 쓰는 것과 동일하다. (ex. *'DIVX' = 'D','I','V','X')
| cv2.VideoWritre_fourcc(*'DIVX') | DIVX MPEG-4 코덱 |
| cv2.VideoWritre_fourcc(*'XVID') | XVID MPEG-4 코덱 |
| cv2.VideoWritre_fourcc(*'FMP4') | FFMPEG MPEG-4 코덱 |
| cv2.VideoWritre_fourcc(*'X264') | H.264/AVC 코덱 |
| cv2.VideoWritre_fourcc(*'MJPG') | MOTION-JPEG 코덱 |
아래 표는 cv2.VideoCapture 클래스처럼 강의에서 소개된 함수들을 정리해 두었다.
* 그레이스케일 영상을 저장할 경우 컬러 포맷으로 변환 후 저장해주어야 한다.
* 영상을 저장 할 경우, 소리는 포함되지 않는다.
| 함수 | 인자 | 설명 |
| cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor) -> cv2.VideoWriter 객체 | image: 비디오 파일 이름 fourcc: fourcc (위 표 참고) fps: 초당 프레임 수 (프레임간 시간 간격으로도 이해 가능) frameSize: (w,h) 튜플로 이루어진 프레임 크기 isColor: True가 컬러 영상 (default), 아니면 False |
저장을 할 동영상 파일 열기 |
| cv2.VideoWriter.open(filename, fourcc, fps, frameSize, isColor) -> Boolean | ||
| cv2.VideoWriter.isOpened() -> Boolean | 비디오 파일 준비 확인 | |
| cv2.VideoWriter.write(image) -> None | image: numpy.ndarray 형식의 저장할 프레임 (영상) | 프레임 저장 |
2-7. 키보드 이벤트 처리하기
키보드 입력 처리 함수
기본키의 경우 cv2.waitKey(delay) 함수를, Windows 체제 기준 방향키, 함수키와 같은 특수키의 경우 cv2.waitKeyEx() 함수를 사용한다. (자세한 사용법은 OpenCV document를 참고하면 된다.)
이 때, delay 변수는 ms 단위이며 0이 들어가게 되면 무한히 기다리게 된다.
OpenCV Window 창을 하나라도 켜져 있을 때 동작한다는 점을 유의하자.
특정키 입력 확인의 경우 cv2.waitKey() == ord('character') 형식을 사용하며 아니면 ASCII code의 숫자와 비교하면 된다.
아래는 강의 예제로 특정키 키보드 입력에 따라 읽어온 이미지를 반전 시키거나 아니면 프로그램을 종료시키는 코드 예제의 코딩 순서이다.
# import OpenCV
# 프로젝트 폴더에 위치한 영상 하나를 그레이 스케일로 읽어오기
# 영상을 창으로 띄우기
# infinite Loop
# 키보드 입력 받아 변수에 저장하기
# 특정 키 입력을 받았을 경우
# ~을 사용하여 영상 반전하기
# 반전된 영상 창으로 띄우기
# 특정 키 입력을 받았을 경우
# Loop 탈출
# 모든 창 끄기
글쓴이는 예제에 추가하여 Canny를 알려주셨으니 c나 C를 받으면 Canny 함수를 사용한 edge를 딴 영상을 만들고 o나 O를 누르면 기존 영상으로 돌아오는 코드로 수정해서 테스트해보았다. (상당히 재밌다)
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
2-8. 마우스 이벤트 처리하기
마우스 이벤트 함수
cv2.setMouseCallback(windowName, onMouse, param) 으로 OpenCV로 열어둔 창에서 일어난 마우스 이벤트를 내가 정의한 콜백 함수로 처리할 수 있게 등록한다. 여기서 windowName은 마우스 이벤트 처리를 수행할 창 이름이고, onMouse가 마우스 이벤트 처리를 위한 콜백 함수로써 함수 형식 + param 으로 데이터를 전달 받는다. 리턴 값은 없다.
*이 함수의 경우 windowName이 꼭 필요하기 때문에 OpenCV 창을 꼭 띄워두고 사용해야 한다. (numpy.ndarray 형식 영상으로 imshow를 사용하거나, cv2.nameWindow(windowName)을 사용해서 창을 띄우자)
콜백 함수 onMouse(event, x, y, flags, param)로 이루어져 있으며, event와 flag는 각각 마우스 이벤트 종류와 발생 시 상태로 아래 그림을 참고하면 된다 (강의 자료에서 제공해 주셨다.). x와 y는 마우스 이벤트가 발생한 좌표 값. param은 cv2.setMouseCallback에서 전달 받은 데이터이다.
*flag 확인의 경우 == 연산보다 & 연산으로 확인하는 것이 유용한데 == 연산자를 사용하게 되면 키보드 입력값도 같이 받는 경우 판단을 못하게 된다. (비트 단위로 flag가 떴는지 확인이 필요하다.)


아래는 강의 예제로 마우스 입력을 사용하여 그리기를 할 수 있는 코드 예제의 코딩 순서이다. 추가적으로 이벤트 발생 시 마우스의 좌표를 print 함수로 출력해 터미널에서 모니터링 할 수 있다.
# import OpenCV
#define variables to store old x, y value
# on_mouse function definition
# make old x, y value variables as global
# check if event is Left Button Pressed
# if it is, store current x and y as old x and y
# else if event is mouse moving
# if flag & Left Button is pressed and hold
# draw line from old x, y to x,y with line type AA for smoothness
# show on window
# store x, y to old y and y
# make empty image using ones function
# show empty image on window
# set Mouse Call back function with defined on_mouse function
# wait for any keyboard input to finish
인증 타임
카메라와 동영상 처리의 경우 강의 자료에 예제 코드를 제공해 주셨지만 PC에 카메라가 설치되어 있지 않아서 테스트 해 볼 수 없었다. ㅜ 키보드 입력 처리의 경우 앞선 수업들에서 해봤기 때문에 복습하는 느낌이였는데 마우스 이벤트 처리 부분은 완전 처음 배우는 내용이라 신기했다. PC 쓸 때 아무 생각 없이 마우스를 사용하고는 했는데 뒤에서 이렇게 많은 처리가 이루어지고 있을거라 생각하니 머리가 좀 띠용해지는 부분이 있었다.
원래 계획했던 수강 플랜보다 너무 많이 밀려버려서 오늘은 최대한 많이 수강해보자 하였다. 다음 며칠간은 이렇게 몰아 들어야 할거 같은데 언제 블로그로 정리하나 좀 슬퍼진다 ㅠㅠ.



#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online
패스트캠퍼스(FastCampus) 강의 둘러보러 가기
↓ ↓ ↓
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'남돈내배 > 2022_FastCampus_환급이벤트' 카테고리의 다른 글
| 패스트캠퍼스 챌린지 14일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.06 |
|---|---|
| 패스트캠퍼스 챌린지 13일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.05 |
| 패스트캠퍼스 챌린지 11일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.03 |
| 패스트캠퍼스 챌린지 10일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.02 |
| 패스트캠퍼스 챌린지 09일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.01 |