[OpenCV] VideoCapture 사용법.

2024. 9. 11. 20:54·Programming/DIP
728x90
728x90

다음의 코드는 OpenCV를 사용하여

  • 웹캠(또는 다른 비디오 장치)을 탐색하고,
  • 사용 가능한 비디오 장치 및 API Backend를 확인한 후,
  • 선택된 카메라 장치에서 비디오 스트림을 가져와 화면에 출력하는 프로그램임.

코드는 크게 세 가지 주요 기능으로 구성됨:

  1. 사용 가능한 카메라 장치 탐색
  2. 사용 가능한 API Backend 확인
  3. 비디오 스트림 캡처 및 화면 출력

코드의 주요 부분 설명:

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!')

전체 요약:

  1. 카메라 장치 탐색: find_available_devices()
    • 사용 가능한 카메라 장치를 탐색 수행.
    • 사용 가능한 장치 목록을 반환합니다.
  2. API Backend 확인: check_available_backends()
    • 각 카메라 장치에서 사용할 수 있는 비디오 캡처 API 백엔드를 확인.
  3. 비디오 스트림 처리: main()
    • 선택된 카메라 장치와 backend를 사용하여
    • 비디오 스트림을 캡처하고,
    • 화면에 출력합니다.
  4. 종료 조건:
    • 사용자는 q 또는 esc 키를 눌러 비디오 스트림을 종료 가능함.

같이보면 좋은 자료

2024.09.11 - [Programming/DIP] - [OpenCV] API Backend for VideoCapture

 

[OpenCV] API Backend for VideoCapture

API 백엔드(API Backend)는OpenCV와 같은 라이브러리가비디오 장치나 비디오 파일, 네트워크 스트림 등의 다양한 입력 소스와 상호작용할 때사용하는 하부 시스템 또는 하위 레벨의 API를 의미함.Backend

dsaint31.tistory.com

 

'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
'Programming/DIP' 카테고리의 다른 글
  • [DIP] plt.imshow: matplotlib.pyplot
  • [DIP] cv2.imshow 사용예
  • [OpenCV] API Backend for VideoCapture
  • [DIP] Hu Moment
dsaint31x
dsaint31x
    반응형
    250x250
  • dsaint31x
    Dsaint31's blog
    dsaint31x
  • 전체
    오늘
    어제
    • 분류 전체보기 (740)
      • Private Life (13)
      • Programming (186)
        • DIP (104)
        • ML (26)
      • Computer (119)
        • CE (53)
        • ETC (33)
        • CUDA (3)
        • Blog, Markdown, Latex (4)
        • Linux (9)
      • ... (351)
        • Signals and Systems (103)
        • Math (172)
        • Linear Algebra (33)
        • Physics (42)
        • 인성세미나 (1)
      • 정리필요. (54)
        • 의료기기의 이해 (6)
        • PET, MRI and so on. (1)
        • PET Study 2009 (1)
        • 방사선 장해방호 (4)
        • 방사선 생물학 (3)
        • 방사선 계측 (9)
        • 기타 방사능관련 (3)
        • 고시 (9)
        • 정리 (18)
      • RI (0)
      • 원자력,방사능 관련법 (2)
  • 블로그 메뉴

    • Math
    • Programming
    • SS
    • DIP
  • 링크

    • Convex Optimization For All
  • 공지사항

    • Test
    • PET Study 2009
    • 기타 방사능관련.
  • 인기 글

  • 태그

    opencv
    fourier transform
    인허가제도
    signals_and_systems
    numpy
    Vector
    random
    Programming
    SIGNAL
    Optimization
    function
    Probability
    linear algebra
    signal_and_system
    SS
    Term
    Convolution
    math
    Python
    검사
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
dsaint31x
[OpenCV] VideoCapture 사용법.
상단으로

티스토리툴바