4.17. 센서 조정 항목¶
pixformat() 와 framesize() 외에도, CSI 클래스는 거의 모든 애플리케이션이 조만간 사용하게 되는 몇 가지 센서별 제어 기능을 제공합니다 – 장착 방향, 노출, 게인, 화이트 밸런스, 그리고 몇 가지 디버깅 보조 기능입니다. 각 항목은 앞에서 다룬 센서 개념에 직접 대응하며, API는 단지 드라이버가 내부적으로 수행하는 레지스터 쓰기에 대한 Python 핸들을 제공할 뿐입니다.
아래의 모든 메서드는 기반 센서에 작용합니다. 이들은 모두 센서의 I2C 제어 버스 를 통해 레지스터 쓰기를 전달하므로, 비용은 마이크로초 단위이며 새 설정은 다음 노출 – 일반적으로 다음 snapshot() – 에서 적용됩니다.
4.17.1. 방향¶
카메라는 자신이 어느 방향으로 장착되었는지 알지 못합니다. 센서에 적용되는 두 개의 뒤집기 플래그가 픽셀이 칩을 벗어나기 전에 영상을 올바른 방향으로 돌려놓습니다:
csi0.hmirror(True)
csi0.vflip(True)
hmirror() 는 좌우를 뒤집고 vflip() 은 상하를 뒤집습니다. 두 가지를 함께 사용하면 실제로 발생하는 경우들을 처리할 수 있습니다: 거꾸로 장착된 보드(두 플래그 모두 True), 전면 반사 거울 뒤에 있는 보드(hmirror 만), 또는 아래에서 반사된 장면을 바라보는 경우(vflip 만)입니다.
뒤집기는 센서의 판독 로직에서 일어나므로 CPU 비용도 메모리 오버헤드도 없으며, 프레임은 이미 올바른 방향으로 프레임 버퍼에 도착합니다.
4.17.2. 노출¶
노출은 적분 시간 – 행이 판독되기 전에 각 픽셀의 광다이오드가 전하를 모으는 시간으로, 마이크로초 단위입니다. 드라이버는 센서의 자동 노출 루프가 실행된 상태로 시작하므로, 카메라는 평균 픽셀 값을 목표치 근처로 유지하려고 합니다. 루프를 비활성화하면 노출이 애플리케이션이 선택한 값으로 고정됩니다:
csi0.auto_exposure(False, exposure_us=8000)
고정 노출은 장면의 밝기가 안정적이고 애플리케이션이 예측 가능한 모션 블러나 임계값 처리를 위한 프레임 간 일관된 밝기를 필요로 할 때 올바른 선택입니다. 현재 노출을 다시 읽어오는 것 – 루프가 설정했든 애플리케이션이 설정했든 – 은 별도의 호출입니다:
us = csi0.exposure_us()
auto_exposure() 를 True 로 호출하고 노출 값을 주지 않으면 제어권이 다시 루프로 넘어갑니다.
4.17.3. 게인¶
게인은 픽셀 전압이 ADC에 도달하기 전에 적용되는 증폭으로, 데시벨 단위입니다. 노출과 마찬가지로 드라이버는 자동 게인 루프가 켜진 상태로 시작합니다. 두 가지 패턴이 자주 등장합니다. 상한을 제한하면 루프가 조명에 적응하면서도 어두운 장면에서 무한정 노이즈를 증폭하는 것을 막을 수 있습니다:
csi0.auto_gain(True, gain_db_ceiling=16)
고정 게인을 고정하는 것은 애플리케이션이 노출도 함께 고정할 때 올바른 선택입니다 – 게인 안정성은 색상 추적처럼 프레임 간 픽셀 값을 비교하는 애플리케이션에 중요합니다:
csi0.auto_gain(False, gain_db=0)
현재 게인은 gain_db() 를 통해 다시 읽을 수 있습니다. 애플리케이션이 자동 게인을 비활성화할 때마다 자동 화이트 밸런스와 자동 노출도 함께 비활성화해야 합니다 – 그렇지 않으면 여전히 작동 중인 제어 루프들이 고정된 게인을 무력화하는 방식으로 이미지를 변경하게 됩니다.
4.17.4. 화이트 밸런스¶
화이트 밸런스는 흰색 물체가 어떤 색의 조명 아래에서도 흰색으로 보이도록 ISP가 디베이어 단계에서 나오는 적색, 녹색, 청색 채널에 적용하는 채널별 게인입니다. 자동 화이트 밸런스 루프는 ISP가 매 프레임마다 수집하는 영역별 통계 로부터 이 세 가지 게인을 계산하여 다음 프레임에 적용합니다.
대부분의 애플리케이션은 루프가 실행되도록 둡니다. 색상 추적이 흔한 예외입니다 – 이 게인은 루프가 색이 있는 물체를 쫓기 위해 조정하는 값이기도 하므로, 애플리케이션이 빨간색 블롭을 찾으려 하면 루프가 슬그머니 적색 채널을 어둡게 만들어 블롭이 더 이상 매칭되지 않게 됩니다. 루프를 잠그면 이 문제가 해결됩니다:
csi0.auto_whitebal(False)
보드와 세션 전반에 걸쳐 동일한 게인으로 재현 가능한 색상 보정을 하려면 데시벨 단위의 명시적인 (r, g, b) 튜플을 전달하세요:
csi0.auto_whitebal(False, rgb_gain_db=(0.0, 0.0, 0.0))
현재 게인은 rgb_gain_db() 를 통해 튜플로 다시 읽을 수 있습니다.
4.17.5. 프레임 레이트 제한¶
센서는 기본적으로 고유 프레임 레이트로 동작합니다 – 대부분의 부품에서 초당 30~60 프레임이며, 프레임 크기가 충분히 작을 경우 고속 센서에서는 훨씬 높아집니다. 레이트를 제한하면 애플리케이션이 다운스트림 처리가 따라갈 수 있는 수준으로 카메라를 조절할 수 있습니다:
csi0.framerate(15)
하드웨어 레이트 제어를 지원하는 센서에서는 이 호출이 프레임당 노출 예산도 늘려주어 저조도 환경에 도움이 될 수 있습니다. 그 외의 센서에서는 드라이버가 단순히 프레임 버퍼 수준에서 추가 프레임을 건너뜁니다.
4.17.6. 테스트 패턴¶
컬러 바 테스트 패턴은 대부분의 센서에 내장되어 있으며, 이미징 문제와 출력 문제를 구분하는 데 유용합니다. 이를 켜면 광다이오드 배열을 우회하여 동일한 픽셀 데이터 경로로 고정된 패턴을 전송합니다:
csi0.colorbar(True)
테스트 패턴은 정상으로 보이지만 라이브 이미지가 그렇지 않다면, 결함은 광학계나 센서의 아날로그 프런트엔드에 있습니다. 테스트 패턴마저 손상되었다면, 문제는 픽셀 데이터 버스 어딘가에 있거나 pixformat() / framesize() 구성에 있습니다. False 를 전달하면 라이브 이미지로 돌아갑니다.
특정 센서 패밀리에 고유한 제어 기능을 노출하는 센서별 ioctl() 명령을 포함한 전체 API는 csi.CSI 를 참조하세요.