본문 바로가기
OpenCV/OpenCV-basic

opencv-VideoCapture, VideoWriter

by kiimy 2021. 12. 11.
728x90
프레임은 비디오나 영화, TV등이 영상 매체를 전달할 때 화면에 뿌려주는 한장 한장의 그림을 말합니다.
이러한 한장 한장의 그림들이 초당 얼마간의 속도로 빠르게 바뀌면서 움직이는 하나의 동영상을 만들어
내게 됩니다. 영화에서 쓰이는 필름을 떠 올려보십시요.
그 필름에서 보이는 하나 하나의 그림이 바로 프레임을 뜻합니다.
이것은 인간의 시각이 한 장의 그림을 본 후 뇌에 전달하기 까지의 과정에서 또 다른 한 장의 그림을
보여줌으로써 실제로는 한 장,한 장 의 그림을 본 것임에도 움직인다고 느끼게 만드는 일종의
눈 속임이라고 볼 수 있습니다.
# camera
cap = cv.VideoCapture(0)

# in 예외처리
if not cap.isOpened():
    print('Camera open failed')
    sys.exit()

# camera frame size = 640, 480 
# 비디오 프레임 크기, 전체 프레임수, FPS 등 출력(get() = float / (int, round) 변환)
print('Frame width', int(cap.get(cv.CAP_PROP_FRAME_WIDTH))) 
print('Frame height', int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))) 
print('Frame count:', int(cap.get(cv.CAP_PROP_FRAME_COUNT)))

'''
# 비디오 프레임 크기 수정
cap.set(cv.CAP_PROP_FRAME_WIDTH, 320) # 보통 width 320
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 240) # 보통 height 240
'''
w = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))

# 보통 30 (카메라마다 다름)
fps = cap.get(cv.CAP_PROP_FPS)
print('FPS:', fps)

# 비디오 영상 저장
# Windows는 DIVX
fourcc = cv.VideoWriter_fourcc(*'DIVX') # == 'D', 'I', 'V', 'X'
delay = round(1000 / fps) # 한 프레임과 그 다음 프레임 간격

out = cv.VideoWriter('output.avi', fourcc, fps, (w,h))

# out 예외처리
if not out.isOpened():
    print('file open failed')
    cap.release()
    # 필요한 상황에 데이터를 요청하고 다른 곳에서 이 카메라 디바이스에 정보를 요청할 수도 있으니
    # 이제부터 우리가 선언한 변수에게 데이터를 그만 요청하라는 뜻
    sys.exit()

while True:
    ret, frame = cap.read()

    if not ret:
        break

    frame = cv.flip(frame, 1) # 반전
    inversed = ~frame # 색 반전
    # canny의 경우는 grayscale이라 저장이 안됨
    # ==> edge_color = cv.cvtColor(edge, cv.COLOR_GRAY2BGR)
    # ==> out.write(edge_color)
    edge = cv.Canny(frame, 50, 150) # 윤곽선

    cv.imshow('frame', frame)
    cv.imshow('inversed', inversed)
    cv.imshow('canny', edge)

    # key = cv.waitKey() 변수로 지정하는 것이 용이
    if cv.waitKey(delay) == ord('q'):
        break

 

# while문에서 두 개의 if 구문 사용시

# keycode = cv2.waitKey() 변수 지정해서 사용

while True:

  if cv2.waitKey() == ord('i') or cv2.waitKey() == ord('I'):
  	img = ~img
  	cv2.imshow('image', img)
  elif cv2.waitKey() == 27:
 	 break
## --> i를 두번 눌러야 바뀜

# 변수를 지정해주고 돌려여해(code 변경)
## -> i를 한번 누르면 바로 이미지 변경됨
keycode = cv2.waitKey()

  ## i, I 클릭시 이미지 반전
  if keycode == ord('i') or keycode == ord('I'):
  	img = ~img
  	cv2.imshow('image', img)
  elif keycode == 27:
	break

카메라와 동영상 처리하기1

# 카메라, 영상 열기
cv2.VideoCapture(index(filename), apiPreference=None) -> retval
cv2.VideoCapture.open(index(filename), apiPreference=None) -> retval
'''
index: camera_id + domain_offset_id
	   비디오 파일 이름, 정지 영상 시퀀스, 비디오 스트림 URL 등
	   시스템 기본 카메라를 기본 방법으로 열려면 index에 0을 전달
apiPreference: 선호하는 카메라 처리 방법을 지정
retval: cv2.VideoCapture 객체

# open
retval: 성공하면 True, 실패하면 False
'''

# 비디오 캡쳐가 준비되었는지 확인
cv2.VideoCapture.isOpened() -> retval
'''
retval: 성공하면 True, 실패하면 False
'''

# 프레임 받아오기(*두 가지를 불러옴*)
cv2.VideoCapture.read(image=None) -> retval, image
'''
retval: 성공하면 True, 실패하면 False.
image: 현재 프레임 (numpy.ndarray)
'''
# 카메라, 비디오 장치 속성 값 참조
cv2.VideoCapture.get(propId) -> retval
'''
get() = float / (int, round) 변환
'''
CAP_PROP_FRAME_WIDTH 프레임 가로 크기
CAP_PROP_FRAME_HEIGHT 프레임 세로 크기
CAP_PROP_FPS 초당 프레임 수
CAP_PROP_FRAME_COUNT 비디오 파일의 총 프레임 수
CAP_PROP_POS_MSEC 밀리초 단위로 현재 위치
CAP_PROP_POS_FRAMES 현재 프레임 번호
CAP_PROP_EXPOSURE 노출

카메라와 동영상 처리하기2 (저장하기)

#저장을 위한 동영상 파일 열기
cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=None) -> retval
'''
fourcc: fourcc (e.g. cv2.VideoWriter_fourcc(*'DIVX'))
isColor: 컬러 영상이면 True, 그렇지않으면 False
retval: cv2.VideoWriter 객체
'''
# 보통 30 (카메라마다 다름)
fps = cap.get(cv.CAP_PROP_FPS)
print('FPS:', fps)

# 비디오 영상 저장
# Windows는 DIVX
fourcc = cv.VideoWriter_fourcc(*'DIVX') # == 'D', 'I', 'V', 'X'
delay = round(1000 / fps) # 한 프레임과 그 다음 프레임 간격

out = cv.VideoWriter('output.avi', fourcc, fps, (w,h))

while True:
	....
    ....
    out.write(frame)

Fourcc (4-문자 코드, four character code)

  • 동영상 파일의 코덱, 압축 방식, 색상, 픽셀 포맷 등을 정의하는 정수 값

cv2.VideoWriter_fourcc(*'DIVX') DIVX MPEG-4 코덱

cv2.VideoWriter_fourcc(*'XVID') XVID MPEG-4 코덱

cv2.VideoWriter_fourcc(*'FMP4') FFMPEG MPEG-4 코덱

cv2.VideoWriter_fourcc(*'X264') H.264/AVC 코덱

cv2.VideoWriter_fourcc(*'MJPG') Motion-JPEG 코덱

728x90

'OpenCV > OpenCV-basic' 카테고리의 다른 글

이미지 연산, 배열 정합(addWeighted)  (0) 2021.12.12
모폴로지 연산(Morphology)  (0) 2021.12.12
opencv-HSV, YCrCb(특정 색 추출)  (0) 2021.12.11
opencv-findContours  (0) 2021.12.11
opencv-basic  (0) 2021.12.11

댓글