본문 바로가기
Image Processing/OpenCV

[OpenCV] VideoCapture

by AteN 2022. 11. 15.

VideoCapture 클래스 함수 설명

생성자 3가지 VideoCapture 객체 선언 방법을 지원
  • cv2.VideoCapture()
  • cv2.VideoCapture(filename)
  • cv2.VideoCapture(device)
동영상 캡쳐를 위한 동영상 파일 혹은 캡처 장치를 개방
  • cv2.VideoCapture.open(filename)
  • cv2.VideoCapture.open(device)
캡처 장치의 연결 여부 확인
  • cv2.VideoCapture.isOpened()
동영상 파일이나 캡처 장치를 해제 (클래스 소멸자에 의해서 자동으로 호출되므로 명시적으로 수행하지 않아도 된다)
  • cv2.VideoCapture.release()
get, set
  • cv2.VideoCapture.get(propld)
    • propld : 속성 식별자
  • cv2.VideoCapture.set(propld,value)
    • propld : 속성 식별자
    • value : 속성값
캡처 장치나 동영상에서 다음 프레임을 잡는다
  • cv2.VideoCapture.grab()
캡처 장치나 동영상 파일에서 다음 프레임을 잡아 디코드해서 image 행렬로 전달
  • cv2.VideoCapture.read([image])

VideoWriter 클래스 설명

  • cv2.VideoWriter([filename, fourcc, fps, frameSize[, isColor]])
    • filenmae : 출력 동영상 파일의 이름
    • fourcc : 프레임 압축에 사용되는 코덱의 4-문자
    • fps : 초당 프레임수
    • frameSize : 프레임의 크기 (가로 x 세로
    • isColor : True면 컬러 프레임으로 인코딩, False면 명암도 프레임으로 인코딩
  • cv2.VideoWriter.open([filename, fourcc, fps, frameSize[, isColor]])
캡처 장치의 연결 여부 확인
  • cv2.VideoWriter.isOpened()
image 프레임을 파일로 저장
  • cv2.VideoWriter.write(image)
영상을 동영상 파일의 프레임으로 저장하기 위해 동영상 파일을 개방
  • cv2.VideoWriter.open()

카메라 주요 속성 식별자

속성 상수설명
cv2.CAP_PROP_POS_MSEC 동영상 파일의 현재 위치인 밀리초 (millisecond)
cv2.CAP_PROP_POS_FRAMES 캡처되는 프레임의 번호
cv2.CAP_PROP_POS_AVI_RATIO 동영상 파일의 상대적 위치 (0 -시작, 1 -끝)
cv2.CAP_PROP_FRAME_WIDTH 프레임의 너비
cv2.CAP_PROP_FRAME_HEIGHT 프레임의 높이
cv2.CAP_PROP_FPS 초당 프레임 수
cv2.CAP_PROP_FOURCC 코덱의 4문자
cv2.CAP_PROP_FRAME_COUNT 동영상 파알의 총 프레임 수
cv2.CAP_PROP_FORMAT cv2.VideoCapture.retieve()이 반환하는 행렬 포맷
cv2.CAP_PROP_BRIGHTNESS 카메라에서 영상의 밝기
cv2.CAP_PROP_CONTRAST 카메라에서 영상의 대비
cv2.CAP_PROP_SATURATION 카메라에서 영상의 포화도
cv2.CAP_PROP_HUE 카메라에서 영사의 색상
cv2.CAP_PROP_GAIN 카메라에서 영상의 Gain
cv2.CAP_PROP_EXPOSURE 카메라에서 노출
cv2.CAP_PROP_AUTOFOCUS 자동초점 조절

주요 코덱 문자

속성 상수설명
cv2.VideoWrite_fourcc(*"DIV4") Divx MPEG-4
cv2.VideoWrite_fourcc(*"DIV5") Div5
cv2.VideoWrite_fourcc(*"DIVX") DivX
cv2.VideoWrite_fourcc(*"DI50") DivX MPEG-4
cv2.VideoWrite_fourcc(*"FMP4") FFMpeg
cv2.VideoWrite_fourcc(*"TYUV") IYUV
cv2.VideoWrite_fourcc(*"MJPG") Motion JPED codec
cv2.VideoWrite_fourcc(*"MP42") MPEG4 v2
cv2.VideoWrite_fourcc(*"MPEG") MPEG codecs
cv2.VideoWrite_fourcc(*"XVID) XVID codecs
cv2.VideoWrite_fourcc(*"X264") H.264/AVC codecs
  • => cv2.Videowriter_fourcc('D','I','V','4')

카메라에서 프레임 읽기

import cv2
 
def put_string(frame, text, pt, value, color=(120, 200, 90)): # 문자열 출력 함수 - 그림자 효과
    text += str(value)
    shade = (pt[0] + 2, pt[1] + 2)
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(frame, text, shade, font, 0.7, (0, 0, 0), 2)  # 그림자 효과
    cv2.putText(frame, text, pt, font, 0.7, (120, 200, 90), 2)  # 글자 적기

put_string() 함수는 text 문자와 value 숫자를 pt 좌표에 글자로 적는다 
같은 문자열을 본래 위치와 2화소 이동된 위치에서 각각 그리기 해서 그림자 효과를 준다 

 
capture = cv2.VideoCapture(0)  # 0번 카메라 연결
if capture.isOpened() == False:
    raise Exception("카메라 연결 안됨")
 
# 카메라 속성 획득 및 출력
print("너비 %d" % capture.get(cv2.CAP_PROP_FRAME_WIDTH)) # 너비 640
print("높이 %d" % capture.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 높이 480
print("노출 %d" % capture.get(cv2.CAP_PROP_EXPOSURE)) # 노출 -6
print("밝기 %d" % capture.get(cv2.CAP_PROP_BRIGHTNESS)) #
while True:  # 무한 반복
    ret, frame = capture.read()  # 카메라 영상 받기
    if not ret: break
    if cv2.waitKey(30) >= 0: break

    exposure = capture.get(cv2.CAP_PROP_EXPOSURE)
    put_string(frame, "EXPOS: ", (10, 40), exposure)
    title = "View Frame from Camera"
    cv2.imshow(title, frame)  # 윈도우에 영상 띄우기
capture.release()

 

카메라에서  cv2.VideoCapture.read()  메서드로 카메라에서 프레임을 받아오며,  튜플로 반환되는데 ret와 frame로 나누어 반환받는다 
ret이 true이면 frmae에 정상적으로 영상 프레임을 가져온 것이다 

 

카메라 속성 설정

import cv2
 
def put_string(frame, text, pt, value=None, color=(120, 200, 90)) :
    text = str(text) + str(value)
    shade = (pt[0] + 2, pt[1] + 2)
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(frame, text, shade, font, 0.7, (0, 0, 0), 2) # 그림자 효과
    cv2.putText(frame, text, pt   , font, 0.7, color, 2) # 작성 문자
    
def zoom_bar(value):
    global capture
    capture.set(cv2.CAP_PROP_ZOOM, value) # 줌 설정 

def focus_bar(value):
    global capture
    capture.set(cv2.CAP_PROP_FOCUS, value)
 
capture = cv2.VideoCapture(0)
if capture.isOpened() is None: raise Exception("카메라 연결 안됨")
 
capture.set(cv2.CAP_PROP_FRAME_WIDTH, 400)      # 카메라 프레임 너비
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 300)     # 카메라 프레임 높이
capture.set(cv2.CAP_PROP_AUTOFOCUS, 0)          # 오토포커싱 중지
capture.set(cv2.CAP_PROP_BRIGHTNESS, 100)       # 프레임 밝기 초기화

title = "Change Camera Properties"              # 윈도우 이름 지정
cv2.namedWindow(title)                          # 윈도우 생성 - 반드시 생성 해야함
cv2.createTrackbar("zoom" , title, 0, 10, zoom_bar)
cv2.createTrackbar("focus", title, 0, 40, focus_bar)

while True:
    ret, frame = capture.read()                 # 카메라 영상 받기
    if not ret: break
    if cv2.waitKey(30) >= 0: break

    zoom = int(capture.get(cv2.CAP_PROP_ZOOM))
    focus = int(capture.get(cv2.CAP_PROP_FOCUS))
    put_string(frame, "zoom : " , (10, 240), zoom)   # 줌 값 표시
    put_string(frame, "focus : ", (10, 270), focus)    # 초점 값 표시 
    cv2.imshow(title, frame)

capture.release() # 비디오 캡처 메모리 해체

카메라 프레임 동영상 파일로 저장

import cv2
 
capture = cv2.VideoCapture(0)                       # 0번 카메라 연결
if capture.isOpened() == False: raise Exception("카메라 연결 안됨")
 
fps = 29.97                                         # 초당 프레임 수
delay = round(1000/ fps)                            # 프레임 간 지연 시간
size  = (640, 360)                                  # 동영상 파일 해상도
fourcc = cv2.VideoWriter_fourcc(*'DX50')            # 압축 코덱 설정
 
# 카메라 속성 콘솔창에 출력
print("프레임 해상도:", size )
print("압축코덱 숫자:", fourcc)
print("delay: %2d ms" % delay)
print("fps: %.2f" % fps)
프레임 해상도: (640, 360)
압축코덱 숫자: 808802372
delay: 33 ms
fps: 29.97
 
capture.set(cv2.CAP_PROP_ZOOM, 1)                   # 카메라 속성 지정
capture.set(cv2.CAP_PROP_FOCUS, 0)
capture.set(cv2.CAP_PROP_FRAME_WIDTH , size[0])     	# 해상도 설정
capture.set(cv2.CAP_PROP_FRAME_HEIGHT, size[1])
 
# 동영상 파일 개방 및 코덱, 해상도 설정
writer = cv2.VideoWriter("img/video_file.avi", fourcc, fps, size)
if writer.isOpened() == False: raise Exception("동영상 파일 개방 안됨")
 
while True:
    ret, frame = capture.read()             # 카메라 영상 받기
    if not ret: break
    if cv2.waitKey(delay) >= 0: break

    writer.write(frame)                 # 프레임을 동영상으로 저장
    cv2.imshow("View Frame from Camera", frame)

writer.release()
capture.release()

동영상 파일 읽기

프레임 번호에 따른 영상 처리 예

 

1 ~ 99 아무런 영상처리를 적용하지 않음
100 ~ 199 프레임별 화소의 파란색 성분에 100을 더해서 영상을 더 푸르게 만듦
200 ~ 299 프레임별 화소의 녹색 성분에 100을 더해서 영상을 더 녹색으로 만듦
300 ~ 399 프레임별 화소의 빨간색 성분에 100을 더해서 영상을 더 빨갛게 만듦
import cv2
 
def put_string(frame, text, pt, value=None, color=(120, 200, 90)) :
    text = str(text) + str(value)
    shade = (pt[0] + 2, pt[1] + 2)
    font = cv2.FONT_HERSHEY_SIMPLEX
    cv2.putText(frame, text, shade, font, 0.7, (0, 0, 0), 2) # 그림자 효과
    cv2.putText(frame, text, pt   , font, 0.7, color, 2) # 작성 문자
    
 
capture = cv2.VideoCapture("img/video_file.avi")		# 동영상 파일 개방
if not capture.isOpened(): raise Exception("동영상 파일 개방 안됨")	
 
frame_rate = capture.get(cv2.CAP_PROP_FPS)           		# 초당 프레임 수
delay = int(1000 / frame_rate)                         		# 지연 시간
frame_cnt = 0                                       		# 현재 프레임 번호
 
while True:
	ret, frame = capture.read()
	if not ret or cv2.waitKey(delay) >= 0: break    		# 프레임 간 지연 시간 지정
	blue, green, red = cv2.split(frame)             		# 컬러 영상 채널 분리
	frame_cnt += 1

	if 100 <= frame_cnt < 200: cv2.add(blue, 100, blue)  	# blue 채널 밝기 증가
	elif 200 <= frame_cnt < 300: cv2.add(green, 100, green) # green 채널 밝기 증가
	elif 300 <= frame_cnt < 400: cv2.add(red  , 100, red)   # red 채널 밝기 증가

	frame = cv2.merge( [blue, green, red] )                 # 단일채널 영상 합성
	put_string(frame, "frame_cnt : ", (20, 320), frame_cnt)
	cv2.imshow("Read Video File", frame)
capture.release()

'Image Processing > OpenCV' 카테고리의 다른 글

[OpenCV] 01. 화소 처리  (0) 2022.11.22
[OpenCV] 산출 연산 함수  (0) 2022.11.21
[OpenCV] 기본 배열 연산 (Operations On Arrays)  (0) 2022.11.19
[OpenCV] I/O 처리  (0) 2022.11.10
[OpenCV] 사용자 인터페이스  (0) 2022.11.09

댓글