AVR

RaspberryPI 4 카메라 테스트 : rpicam-apps

작성자 임베디드코리아 작성일25-11-02 00:35 조회54회 댓글0건
Raspberry Pi OS Bookworm은 카메라 캡처 애플리케이션의 이름을 libcamera-*에서 rpicam-*로 변경했습니다.
Bookworm 이전 Raspberry Pi OS 버전은 여전히 ​​libcamera-* 이름을 사용합니다.

1. rpicam-hello
    ▶ rpicam-hello는 연결된 카메라의 비디오 피드가 포함된 미리보기 창을 잠깐 표시합니다.
    ▶ rpicam-hello를 사용하여 미리보기 창을 5초 동안 표시한다
      $ rpicam-hello
    ▶ timeout 옵션을 사용하여 선택적으로 지속 시간(밀리초)을 지정할 수 있습니다.
      $ rpicam-hello --timeout 10000      <--- 10초
    ▶ 0을 지정하면 미리보기가 무기한으로 실행됩니다.
      $ rpicam-hello --timeout 0
        Ctrl+C를 사용하거나 미리보기 창의 닫기 버튼을 사용하여 중지합니다.
    ▶ 미리보기 창을 완전히 숨기려면 nopreview 플래그를 전달합니다.
        $ rpicam-hello -n
    ▶ info-text 옵션은 % 지시어를 사용하여 창 제목 표시줄에 이미지 정보를 표시합니다.
        $ rpicam-hello --info-text "red gain %rg, blue gain %bg"
            현재 빨간색 및 파란색 게인 값을 표시합니다.

2. rpicam-jpeg
    : rpicam-jpeg는 Raspberry Pi 기기에서 이미지를 캡처하는 데 도움이 됩니다.
    ▶  전체 해상도의 JPEG 이미지를 캡처하여 test.jpg라는 파일에 저장하
        $ rpicam-jpeg --output test.jpg
    ▶시간 초과 옵션을 사용하여 미리보기 창의 표시 시간을 변경할 수 있습니다.
        너비와 높이 옵션은 저장된 이미지의 해상도를 변경합니다.
    ▶ 다음 명령은 미리보기 창을 2초 동안 표시한 후 640×480픽셀 해상도의 이미지를 캡처하여 저장합니다.
        $ rpicam-jpeg --output test.jpg --timeout 2000 --width 640 --height 480

3. rpicam-still
    : rpicam-still은 Raspberry Pi 기기에서 rpicam-jpeg 이미지를 캡처하는 데 사용합니다.
    ▶ rpicam-still은 rpicam-jpeg와 달리  raspistill 애플리케이션에서 제공되는 다양한 옵션을 지원합니다.
    ▶ 전체 해상도 JPEG 이미지를 캡처하여 test.jpg라는 파일에 저장하는 명령은 다음과 같이 한다
          $ rpicam-still --output test.jpg

    [1] Encoders
        : 인코딩 옵션을 사용하여 출력 형식을 지정합니다.
        ▶ rpicam-still은 PNG, BMP, RGB 및 YUV 바이너리 픽셀 덤프를 포함한 다양한 형식으로 이미지를 저장할 수 있습니다.
        ▶ 바이너리 덤프를 읽으려면 파일을 읽는 모든 애플리케이션이 픽셀 배열을 이해해야 합니다.
        ▶ output에 전달된 파일 이름은 출력 파일 형식에 영향을 미치지 않습니다.
        ▶ 전체 해상도 PNG 이미지를 캡처하여 test.png라는 파일에 저장하는 명령은 다음과 같이 한다
          $ rpicam-still --encoding png --output test.png
            저장되는 형식은 -e(동등한 --encoding) 옵션 에 따라 달라지며 출력 파일 이름에 따라 자동으로 선택 되지 않습니다 .

    [2] 원시 이미지 캡처(Capture raw images)
          : 원시 이미지(Raw images)는 이미지 신호 프로세서(ISP) 또는 CPU 코어에 의해 처리가 적용되기 전에
            이미지 센서에서 직접 생성된 이미지입니다.
    ▶ 컬러 이미지 센서(Colour image sensors)는 일반적으로 베이어(Bayer) 형식을 사용합니다.
    ▶ 원시 이미지를 캡처하려면 RAW 옵션을 사용합니다.
    ▶ 이미지를 캡처하여 test.jpg라는 파일에 저장하고, 이미지의 원시 버전을 test.dng라는
          파일에 저장하는 명령은 다음과 같이 한다.
          $ rpicam-still --raw --output test.jpg
            • -r옵션( --raw)은 JPEG뿐만 아니라 RAW 이미지도 캡처함을 나타냅니다.
            • 실제로 원시 이미지는 JPEG가 생성된 정확한 이미지입니다.
            • Raw 이미지는 DNG(Adobe Digital Negative) 형식으로 저장되며
                dcraw 또는 RawTherapee 와 같은 많은 표준 응용 프로그램과 호환됩니다 .
            •Raw 이미지는 이름은 동일하지만 확장자가 .dng. 인 파일에 저장되므로 test.dng이 경우입니다.

        ▶ DNG 파일에는 블랙 레벨, 화이트 밸런스 정보, JPEG를 생성하기 위해 ISP에서 사용하는
            색상 매트릭스 등 이미지 캡처와 관련된 메타데이터가 포함되어 있습니다.
        ▶ ExifTool을 사용하여 DNG 메타데이터를 확인할 수 있습니다.

      [3] Capture long exposures(매우 긴 노출)
          : 매우 긴 노출 이미지를 촬영하려면 자동 노출/게인 제어(AEC/AGC) 및 자동 화이트 밸런스(AWB)를
            비활성화해야 합니다.
            -> 알고리즘을 비활성화하지 않으면 이미지가 수렴하는 동안 여러 프레임을 기다려야 합니다.
            -> 알고리즘을 비활성화하려면 게인 및 AWB에 대한 명확한 값을 제공해야 합니다.
          ▶ 장시간 노출은 이미 많은 시간이 소요되므로 즉시 옵션을 사용하여 미리보기 단계를 완전히
              건너뛰는 것이 좋습니다.

            ▶ 다음은 100초 노출 촬영을 수행하는 명령 입니다.
              $ rpicam-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate

      [4] Create a time lapse video(긴 동영상 생성)
          : 타임랩스 비디오를 만들려면 1분에 한 번처럼 일정한 간격으로 정지 이미지를 촬영한
            다음 애플리케이션을 사용하여 사진을 연결하여 비디오로 만듭니다.
        ▶ rpicam-still의 내장 타임랩스 모드를 사용하려면 timelapse 옵션을 사용합니다.
        ▶ timelapse 옵션은 Raspberry Pi가 캡처 간 대기할 시간(밀리초)을 나타내는 값을 입력받습니다.

      ①  타임랩스 사진을 저장할 수 있는 디렉토리를 만듬.
            $ mkdir timelapse

        ② 다음 명령을 실행하여 30초 동안 타임 랩스를 생성하고, 2초마다 사진을 녹화하며,
            출력을 image0000.jpg부터 image0013.jpg까지 저장합니다.
            $ rpicam-still --timeout 30000 --timelapse 2000 -o timelapse/image%04d.jpg

      [5] Stitch images together
          : 타임랩스 사진 시리즈가 있으며, 이 사진들을 하나로 합쳐 하나의 비디오로 만들어 주는 것이
            필요할 것입니다.
          ▶라즈베리파이에서 ffmpeg를 사용하여 이 작업을 수행랗 수 있습니다.
          ① ffmpeg 설치하기
              $ sudo apt install ffmpeg

          ② 다음 명령을  PEG 파일을 mp4 비디오로 변환하려면 timelapse 디렉토리가 포함된
              디렉토리에서실행합니다.
          $ ffmpeg -r 10 -f image2 -pattern_type glob -i 'timelapse/*.jpg' -s 1280x720 -vcodec libx264 timelapse.mp4

4. rpicam-vid
  : rpicam-vid는 Raspberry Pi 기기에서 비디오를 캡처하는 데 도움을 줍니다.
▶ rpicam-vid는 미리보기 창을 표시하고 지정된 출력에 인코딩된 비트스트림을 기록합니다.
▶ 어떤 종류의 컨테이너(예: mp4 파일) 형식으로도 래핑되지 않은 비패키징된 비디오 비트스트림이 생성됩니다.
▶하드웨어 H.264 인코더가 있는 Raspberry Pi 모델에서는 기본적으로 사용됩니다.
▶ 다음 명령은 10초 분량의 비디오를 test.h264라는 파일에 기록합니다.
    $ rpicam-vid -t 10s -o test.h264
▶ ffplay 및 기타 비디오 플레이어를 사용하여 결과 파일을 재생할 수 있습니다.
    $ ffplay test.h264

▶ Raspberry Pi 5에서는 출력 파일에 mp4 파일 확장자를 지정하여 MP4 컨테이너 형식으로 직접 출력할 수 있습니다.
    $ rpicm-vid  -t 10s -o test.mp4
▶ Raspberry Pi 4 이하 기기에서는 다음을 사용하여 MP4 파일을 저장할 수 있습니다.
    $ rpicam-vid -t 10s --codec libav -o test.mp4

[1] Encoders
    : rpicam-vid는 모션 JPEG는 물론 압축되지 않은 YUV420과 포맷되지 않은 YUV420도 지원합니다.
      $ rpicam-vid -t 10000 --codec mjpeg -o test.mjpeg
      $ rpicam-vid -t 10000 --codec yuv420 -o test.data
        • 코덱 옵션은 출력 파일의 확장자가 아닌 출력 형식을 결정합니다.
        • 세그먼트 옵션은 출력 파일을 세그먼트 크기(밀리초 단위) 단위로 분할합니다.
        • 이 옵션은 매우 짧은(1밀리초) 세그먼트를 지정하여 모션 JPEG 스트림을 개별 JPEG 파일로 분할하는 데 유용합니다.
    ▶ 다음 명령은 1밀리초 길이의 세그먼트와 출력 파일 이름에 카운터를 결합하여
      각 세그먼트에 대한 새 파일 이름을 생성합니다.
      $ rpicam-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg

[2] Capture high framerate video(높은 프레임 속도 캡처)
    : 높은 프레임 속도(>60fps)의 비디오에서 프레임 저하를 최소화하려면 다음 구성 조정을 할 수 있음.
        • --level 4.2를 사용하여 H.264 목표 레벨을 4.2로 설정합니다.
        • 소프트웨어 색상 노이즈 제거 처리를 비활성화하려면 denoise 옵션을 cdn_off로 설정합니다.
        • nopreview 옵션을 사용하여 디스플레이 창을 비활성화하면 CPU 사이클을 추가로 확보할 수 있습니다.
        • 비디오 캡처 중에 CPU 클럭이 조절되지 않도록 /boot/firmware/config.txt에 force_turbo=1을 설정합니다.
        • 프레임 속도 목표를 달성하려면 --width 1280 --height 720 또는 그보다 더 낮은 값으로 ISP 출력 해상도를 조정합니다.
        • Raspberry Pi 4에서는 /boot/firmware/config.txt에 gpu_freq=550 이상을 추가하여
          GPU를 오버클럭하여 성능을 향상시킬 수 있습니다.
      ▶ 다음 명령은 1280×720 120fps 비디오를 얻는 방법을 보여줍니다.
    $ rpicam-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n

[3] libav integration with rpicam-vid
  ▶ rpicam-vid는 ffmpeg/libav 코덱 백엔드를 사용하여 오디오 및 비디오 스트림을 인코딩할 수 있습니다.
  ▶ 이러한 스트림을 파일에 저장하거나 네트워크를 통해 스트리밍할 수 있습니다.
  ▶ libav는 하드웨어 H.264 비디오 인코딩을 사용하는 경우 이를 사용합니다.
  ▶ 다음은 libav 백엔드를 활성화하고, libav를 코덱 옵션에 전달합니다.
      $ rpicam-vid --codec libav --libav-format avi --libav-audio --output example.avi

[4] Low latency video with the Pi 5
  ▶ Pi 5는 소프트웨어 비디오 인코더를 사용합니다.
  ▶ 이러한 인코더는 일반적으로 기존 하드웨어 인코더보다 지연 시간이 긴 프레임을 출력하며,
      이는 실시간 스트리밍 애플리케이션에서 문제가 될 수 있습니다.
  ▶이 경우 rpicam-vid 명령에 --low-latency 옵션을 추가합니다.
      ---> 이렇게 하면 특정 인코더 옵션이 변경되어 인코딩된 프레임을 더 빠르게 출력할 수 있습니다.
  ▶ 단점은 코딩 효율성이 (약간) 떨어지고 프로세서의 여러 코어가 (약간) 덜 효율적으로 사용될 수 있다는 것입니다.
  ▶ 인코딩 가능한 최대 프레임 속도가 약간 감소할 수 있지만, 1080p30은 여전히 ​​쉽게 달성할 수 있습니다.

5. rpicam-raw
  : picam-raw는 센서에서 직접 비디오를 원시 베이어 프레임으로 녹화하며, 미리보기 창은 표시되지 않습니다.
    ▶ 2초 분량의 원시 클립을 test.raw라는 파일에 녹화하려면 다음 명령을 실행하세요.
      $ rpicam-raw -t 2000 -o test.raw

    ▶ rpicam-raw는 서식 정보 없이 원시 프레임을 하나씩 바로 출력합니다.
    ▶ 애플리케이션은 사용자가 픽셀 데이터를 해석할 수 있도록 픽셀 형식과 이미지 크기를 터미널 창에 표시합니다.
    ▶ 기본적으로 rpicam-raw는 원시 프레임을 하나의 파일로 출력하며, 매우 큰 파일일 수 있습니다.
    ▶ 다음의 segment 옵션을 사용하여 각 원시 프레임을 별도의 파일로 지정하고,
        %05d 지시어를 사용하여 각 프레임의 파일 이름을 고유하게 지정합니다.
      $ rpicam-raw -t 2000 --segment 1 -o test%05d.raw

    ▶ 빠른 저장 장치를 사용하는 rpicam-raw는 18MB 12메가픽셀 HQ 카메라 프레임을 10fps로 디스크에 쓸 수 있습니다.
    ▶ rpicam-raw는 출력 프레임을 DNG 파일로 포맷하는 기능이 없으며, 사용하려면 rpicam-still을 사용합니다.
    ▶ 다음은 프레임 손실을 방지하려면 프레임 속도 옵션을 10보다 낮은 수준으로 설정합니다.
      $ rpicam-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8

6. rpicam-detect
  : rpicam-detect는 미리보기 창을 표시하고 Coco 데이터셋을 사용하여 약 80개의 객체 클래스를
    식별하도록 훈련된 Google MobileNet v1 SSD(Single Shot Detector) 신경망을 사용하여 콘텐츠를 모니터링합니다.
    ▶ rpicam-detect는 사람, 자동차, 고양이 등 다양한 객체를 인식합니다.
    ▶ rpicam-detect는 대상 객체를 감지할 때마다 전체 해상도 JPEG를 캡처하고, 모니터링 미리보기 모드로 돌아갑니다.
    ▶ 모델 사용에 대한 일반적인 정보는 TensorFlow Lite 객체 감지기 섹션을 참조하시오.
    ▶ 예를 들어, 다음과 같이 외출 중에 고양이를 몰래 감시할 수 있습니다.
      $ rpicam-detect -t 0 -o cat%04d.jpg --lores-width 400 --lores-height 300 --post-process-file object_detect_tf.json --object cat