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