프레임은 비디오나 영화, 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 코덱
'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 |
댓글