728x90
다음의 코드는 OpenCV를 사용하여
- 웹캠(또는 다른 비디오 장치)을 탐색하고,
- 사용 가능한 비디오 장치 및 API Backend를 확인한 후,
- 선택된 카메라 장치에서 비디오 스트림을 가져와 화면에 출력하는 프로그램임.
코드는 크게 세 가지 주요 기능으로 구성됨:
- 사용 가능한 카메라 장치 탐색
- 사용 가능한 API Backend 확인
- 비디오 스트림 캡처 및 화면 출력
코드의 주요 부분 설명:
1. 모듈 임포트:
import cv2
import sys, os
import contextlib
cv2
: OpenCV 라이브러리로, 비디오 캡처 및 처리 기능을 제공.sys
: 시스템 기능을 사용하기 위한 모듈로, 프로그램 종료 시 사용.os
: os 와 관련된 추가 기능을 사용할 수 있도록 임포트.
2. find_available_devices(max_devices=3)
:
- 이 함수는 시스템에 연결된 카메라 장치(웹캠 등)를 탐색.
cv2.VideoCapture(device_id)
를 통해 최대 3개의 장치(max_devices=3
)를 시도- 각 장치가 열리는지(
isOpened
) 확인한 후, 사용 가능한 장치를 list로 반환. - 로그 레벨을 일시적으로 낮추어 경고 메시지를 억제한 후, 로그 레벨을 복구.
def find_available_devices(max_devices=3):
available_devices = []
# cv2.utils.logging.setLogLevel(cv2.utils.logging.LOG_LEVEL_SILENT)
cv2.setLogLevel(0)
for device_id in range(max_devices):
cap = cv2.VideoCapture(device_id)
print('----------------')
if cap.isOpened(): # 장치가 열렸다면, 사용 가능
available_devices.append(device_id)
cap.release() # 장치를 닫아줍니다.
# cv2.utils.logging.setLogLevel(cv2.utils.logging.LOG_LEVEL_ERROR)
cv2.setLogLevel(3)
return available_devices
3. check_available_backends(cam_id)
:
- 이 함수는 선택된 카메라에서 사용 가능한 API Backend(V4L2, DirectShow, FFmpeg 등)를 확인.
- 카메라 장치(
cam_id
)를 다양한 백엔드(CAP_V4L2
,CAP_DSHOW
, 등)를 사용하여 열 수 있는지 확인 - 가능한 Backends을 리스트에 추가하여 반환.
def check_available_backends(cam_id):
"""
사용 가능한 API 백엔드를 확인하는 함수
parameters:
- None
return value:
- available_backends: list
"""
backends = {
"CAP_V4L2": cv2.CAP_V4L2,
"CAP_DSHOW": cv2.CAP_DSHOW,
"CAP_MSMF": cv2.CAP_MSMF,
"CAP_AVFOUNDATION": cv2.CAP_AVFOUNDATION,
"CAP_FFMPEG": cv2.CAP_FFMPEG
}
available_backends = []
for name, api in backends.items():
cap = cv2.VideoCapture(cam_id, api) # 0번 카메라로 시도
if cap.isOpened():
available_backends.append(name)
cap.release()
return available_backends
4. get_vc_prop(vc)
:
- 카메라 장치의 기본 속성인 밝기, 대비, 채도, 색조 값을 출력하는 함수.
- 이 함수는 카메라 속성을 확인하기 위한 목적으로 사용됨.
def get_vc_prop(vc):
"""
중요하지 않은 video camera관련 정보 출력 메서드
parameters:
- vc: VideoCapture Object
return value:
- None
"""
b = vc.get(cv2.CAP_PROP_BRIGHTNESS) # brightness
c = vc.get(cv2.CAP_PROP_CONTRAST) # contrast
s = vc.get(cv2.CAP_PROP_SATURATION) # saturation
h = vc.get(cv2.CAP_PROP_HUE) # hue
print(f'{b = } ; {c = } ; {s = } ; {h = }')
5. main(cam_id, api_backend)
:
- 이 함수는 주된 비디오 캡처 및 화면 출력 기능을 수행.
- 선택된 카메라 장치(
cam_id
)와 백엔드(api_backend
)를 사용하여 카메라에서 비디오 스트림을 획득. - 카메라의 프레임 해상도, FPS, 코덱 정보 등을 출력한 후,
- 무한 루프를 통해 카메라로부터 프레임을 지속적으로 읽어와 화면에 출력.
q
또는esc
키를 눌러 프로그램을 종료할 수 있음.
def main(cam_id,api_backend):
cv2.namedWindow('Video from Webcam',
# cv2.WINDOW_GUI_NORMAL,
cv2.WINDOW_GUI_EXPANDED,
)
vc = cv2.VideoCapture(cam_id) #, cv2.CAP_DSHOW)
if not vc.isOpened():
sys.exit(f'ERROR: Can\'t connect camera: {cam_id}')
frame_w = int(vc.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_h = int(vc.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = vc.get(cv2.CAP_PROP_FPS)
fourcc = int(vc.get(cv2.CAP_PROP_FOURCC)) # codec info. 4character
fourcc_str = "".join([chr((fourcc >> 8 * i) & 0xFF) for i in range(4)])
print(f"Camera resolution: {frame_w}x{frame_h}")
print(f"FPS: {fps}")
print(f"Codec: {fourcc_str}")
get_vc_prop(vc)
while True:
is_ok, frame = vc.read()
if not is_ok:
print('Can\'t acquire video frame!')
break
cv2.imshow('Video from Webcam', frame)
key = cv2.waitKey(10)
if key & 0xff == ord('q'):
break
elif key & 0xff == 27: #esc
break
cv2.destroyAllWindows()
vc.release()
6. if __name__ == "__main__":
:
- 프로그램의 메인 실행 block.
- 먼저 사용 가능한 카메라 장치를 탐색한 후,
- 해당 장치에서 사용할 수 있는 비디오 캡처 API 백엔드를 확인.
- 만약 사용 가능한 카메라와 API 백엔드가 있다면, 선택된 카메라 장치와 백엔드를 사용하여 비디오 스트림을 출력함.
if __name__ == "__main__":
available_devices = find_available_devices()
print("Available devices:", available_devices)
if len(available_devices) >0 :
# 확인된 사용 가능한 백엔드 출력
available_apis = check_available_backends(available_devices[0])
print("Available Video Capture APIs:", available_apis)
if len(available_apis) > 0:
main(available_devices[0],
available_apis[0],
)
else:
print('There is not an available api backend!')
else:
print('There is not an available camera!')
전체 요약:
- 카메라 장치 탐색:
find_available_devices()
- 사용 가능한 카메라 장치를 탐색 수행.
- 사용 가능한 장치 목록을 반환합니다.
- API Backend 확인:
check_available_backends()
- 각 카메라 장치에서 사용할 수 있는 비디오 캡처 API 백엔드를 확인.
- 비디오 스트림 처리:
main()
- 선택된 카메라 장치와 backend를 사용하여
- 비디오 스트림을 캡처하고,
- 화면에 출력합니다.
- 종료 조건:
- 사용자는
q
또는esc
키를 눌러 비디오 스트림을 종료 가능함.
- 사용자는
같이보면 좋은 자료
2024.09.11 - [Programming/DIP] - [OpenCV] API Backend for VideoCapture
반응형
'Programming > DIP' 카테고리의 다른 글
[DIP] plt.imshow: matplotlib.pyplot (1) | 2024.09.16 |
---|---|
[DIP] cv2.imshow 사용예 (2) | 2024.09.16 |
[OpenCV] API Backend for VideoCapture (0) | 2024.09.11 |
[DIP] Hu Moment (2) | 2024.09.10 |
[DIP] Tangential Distortion (접선왜곡) (0) | 2024.09.10 |