Camera Frame과 Frame Rate
학습 목표
해상도와 촬영 간격을 정하려면 저장량·관측 범위·Frame Rate의 교환 관계를 알아야 합니다.
실행 조건
입력: 생성 영상과 Timestamp. 실제 촬영 예제는 Raspberry Pi OS의 Picamera2를 사용합니다. OS에 없는 경우 터미널에서 sudo apt install python3-picamera2.
영상 크기와 메모리
시작 조건
제공 NumPy 코드가 만드는 120×160×3 uint8 RGB 영상을 사용합니다.
진행 방법
- 크기·채널·자료형·nbytes를 기록하세요.
- [::2,::2]로 축소한 영상과 원본을 나란히 표시하세요.
- 공간 크기 비와 저장 배열 byte 수의 비를 비교하세요.
남길 결과
- 원본·축소 영상과 통계 표.
import numpy as np
import matplotlib.pyplot as plt
x,y=np.meshgrid(np.linspace(0,255,160),np.linspace(0,255,120))
frame=np.stack([x,y,255-x],axis=-1).astype(np.uint8)
small=frame[::2,::2]
print(frame.shape,frame.nbytes,small.shape,small.nbytes)
# TODO: 비교 그림과 비율을 기록하세요.
결과 기록·자가 점검
영상:
shape:
dtype:
배열 byte 수:
원본 대비 비:
확인할 점
- 배열 byte 수를 JPEG 파일 용량이라고 부르지 않았는가?
- 두 축을 절반으로 줄였을 때 픽셀 수가 어떻게 달라지는지 확인했는가?
Timestamp에서 Frame Rate 계산
시작 조건
획득 s를 사용합니다.
진행 방법
np.diff(timestamp)로 다섯 Frame 간격을 구하세요. 관측 FPS는 이 다섯 간격의 평균을 구한 뒤 그 역수로 계산하세요.- 각 간격을 비교기준 s와 나란히 적고, 가장 긴 간격의 시작·끝 시각을 표시하세요. 구간 번호를 x축, Frame 간격 [s]를 y축으로 그리세요.
- 요청값으로 가정한 30 FPS, 계산한 관측 FPS, 시간 기록에 들어 있는 Frame 수를 서로 다른 항목으로 적으세요.
남길 결과
- 5구간 표와 간격 그래프.
timestamp=np.array([0,.033,.067,.100,.150,.183])
intervals=np.diff(timestamp)
print('observed FPS',1/intervals.mean())
# TODO: 간격별 표와 그래프를 작성하세요.
결과 기록·자가 점검
구간:
Δt [s]:
구간별 1/Δt [Hz]:
지연 관찰:
확인할 점
- 전체 Frame 수를 마지막 timestamp로 단순히 나눈 값과 구간 기반 값을 구분했는가?
- timestamp 단위를 확인했는가?
관심 영역과 설정 선택
시작 조건
원본 frame의 row=20:80, col=40:120을 ROI로 선택하고 전체 축소 영상과 비교합니다.
진행 방법
- ROI 좌표·크기와 전체 축소 크기를 기록하세요.
- 둘이 보존하는 시야와 세부 정보의 차이를 설명하세요.
- 실제 Camera Frame과 Frame Rate가 있으면 같은 원리로 촬영한 한 장을 추가하고 backend·해상도를 기록하세요.
남길 결과
- ROI·축소 그림과 설정 선택 이유 3문장.
roi=frame[20:80,40:120]
# TODO: ROI·전체 축소·원본을 같은 패널에서 비교하세요.
결과 기록·자가 점검
방법:
영역·해상도:
보존한 시야:
남은 세부 정보:
확인할 점
- NumPy row·column과 영상 x·y를 구분했는가?
- 실물 촬영을 추가한 경우에만 장치 결과라고 명시했는가?