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 |
댓글