Драйвер камер OBISP в пространстве пользователя и SDK
Введение
Arducam разработала простой и готовый к работе драйвер камер MIPI в пространстве пользователя (userland): его не нужно пересобирать при каждом обновлении ядра. Драйвер не соответствует стандарту V4L2, зато Arducam предоставляет богатый набор вызовов API и примеры кода на C/C++ и Python, а также для OpenCV и GStreamer. Для Raspberry Pi Compute Module поддерживается и стереокамера.
Подготовка


sudo apt-get update && sudo apt-get install libzbar-dev libopencv-dev
sudo apt-get install python-opencv
Скачивание и установка библиотеки SDK
git clone https://github.com/ArduCAM/MIPI_Camera.git

cd MIPI_Camera/RPI/

make install

chmod +x enable_i2c_vc.sh
./enable_i2c_vc.sh

Затем нажмите Y/y, чтобы сразу перезагрузить систему.
Сборка примеров
cd MIPI_Camera/RPI/
make clean && make

Как пользоваться готовыми демо-программами (на примере IMX298)
arducamstill
Универсальная программа: с её помощью можно выводить предпросмотр, получать изображения в разных форматах и точно настраивать качество изображения.
- Справка:
pi@raspberrypi:~/MIPI_Camera/RPI $ ./arducamstill -?

- Предпросмотр в режиме 1 с автоматическим балансом белого (awb) и автоэкспозицией (ae):
pi@raspberrypi:~/MIPI_Camera/RPI $ ./arducamstill -t 0 -m 1 -awb 1 -ae 1
В выводе программы видны текущий режим, частота кадров и другие параметры:
Current mode: 1, width: 1280, height: 960, pixelformat: pBAA, desc: (null)
[Framerate]: 02 pfs, [Exposure]: 2680, [Focus]: 0190,[Rgain]: 0140, [Bgain]: 0070
- Предпросмотр 5 секунд, затем снимок в формате JPG:
pi@raspberrypi:~/MIPI_Camera/RPI $ ./arducamstill -t 5000 -m 1 -e jpg -o test.jpg
Съёмка в более высоком разрешении
Чтобы изменить разрешение (например, на 8112 × 3040), используйте fmt = camera.set_resolution(8112 x 3040) в MIPI_Camera/RPI/python. Объём данных при этом растёт, поэтому нужно больше памяти: установите gpu_mem=400 в /boot/config.txt и добавьте параметр cma=400M в /boot/cmdline.txt.
- Описание параметров:
-t, --timeout : Time (in ms) before takes picture and shuts down (if not specified, loop)
-q, --quality : Set jpeg quality <0 to 100>
-m, --mode : Set sensor mode
-awb, --autowhitebalance : Enable or disable awb
-ae, --autoexposure : Enable or disable ae
-rgain, --awbrgain : Set R channel gian vaue <0 to 65535>
-bgain, --awbbgain : Set B channel gian vaue <0 to 65535>
-o, --capture : usd to get one frame
-e, --encoding : Encoding to use for output file (jpg, bmp, gif, png,raw)
-?, --help : This help information
- Точная настройка экспозиции, фокуса и усиления с клавиатуры:

- Подобрав удачные значения, задайте их через API
arducam_set_control. Подробное описание API — в заголовочном файле:
https://github.com/ArduCAM/MIPI_Camera/blob/master/RPI/arducam_mipicamera.h
opencvGui
Чтобы результат настройки было видно наглядно, Arducam выпустила программу с графическим интерфейсом (GUI):
pi@raspberrypi:~/MIPI_Camera/RPI $ ./opencvGui

- Кнопки панели инструментов:
-Quit : close the application
-AWB : enable and disable auto white balance function
-AE : enable and disable auto exposure function
-Reset : reset all parameters
-Snapshot : get one frame image
-exposure step 1 : fine-tuning exposure time
-focus step 1 : fine-tuning focus value
-awb rgain compensation : fine-tuning awb rgain compensation
-awb bgain compensation : fine-tuning awb bgain compensation
Для выхода из программы нажмите Ctrl + C.
list_format
Эта демо-программа показывает все разрешения, которые поддерживает ваш сенсор:
pi@raspberrypi:~/MIPI_Camera/RPI $ ./list_format
Как пользоваться стереоплатой HAT Arducam (на примере OV9281)
- Подключение оборудования

Запустите ./list_format, чтобы узнать, какие режимы используются для стереоплаты HAT:
pi@raspberrypi:~/MIPI_Camera/RPI $ ./list_format

Из вывода видно, что для стереоплаты HAT используются режимы 7–11. Для примера выберем режим 7:
pi@raspberrypi:~/MIPI_Camera/RPI $ ./arducamstill -t 0 -m 7
Дополнительные настройки
Откройте файл /boot/config.txt и найдите строку gpu_mem=xxx. Укажите подходящий объём gpu_mem: для плат камер на 13 Мп рекомендуется gpu_mem=160, для плат на 16 Мп и выше — gpu_mem=180.
Запуск примеров
Пример предпросмотра
$ ./preview
Пример preview.c показывает, как выводить предпросмотр в разных разрешениях и с разными параметрами управления камерой.
Пример съёмки
$ ./capture
Пример capture.c снимает изображения JPEG в разных разрешениях.
$ ./capture_raw
Пример capture_raw.c снимает изображения RAW без интерполяции в разных разрешениях — это особенно полезно для монохромных сенсоров.
$ ./raw_callback
Пример raw_callback.c — вариант примера capture_raw с функцией обратного вызова (callback).
Пример записи видео
$ ./video
Пример video.c записывает видео в формате H.264.
Пример запроса параметров управления камерой
$ ./list_format
Пример list_format.c выводит поддерживаемые камерой разрешения и функции управления.
Пример чтения и записи регистров сенсора
$ ./read_write_sensor_reg
Пример read_write_sensor_reg.c показывает, как напрямую читать и записывать регистры сенсора. Возможно, пример придётся изменить под правильные адреса регистров вашего сенсора.
Пример с OpenCV
$ ./capture2opencv
Пример capture2opencv.cpp преобразует данные YUV в формат OpenCV Mat и выводит изображение как есть.
Пример с GStreamer
Пример video2stdout.c выводит видеопоток H.264 в stdout, а GStreamer передаёт этот поток на ПК.
Пример 1. Команда на стороне Raspberry Pi:
$ ./video2stdout | nc -l -p 5000
Команда на стороне ПК (x.x.x.x — IP-адрес вашей Raspberry Pi):
$ gst-launch-1.0 -v tcpclientsrc host=x.x.x.x port=5000 ! decodebin ! autovideosink
Пример 2. Команда на стороне Raspberry Pi (x.x.x.x — IP-адрес вашей Raspberry Pi):
$ ./video2stdout | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=x.x.x.x port=5000
Команда на стороне ПК (x.x.x.x — IP-адрес вашей Raspberry Pi):
$ gst-launch-1.0 -v tcpclientsrc host=x.x.x.x port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! autovideosink sync=false
Пример распознавания QR-кодов
$ ./qrcode_detection <exposure_value>
Пример qrcode_detection.cpp показывает, как распознавать QR-коды средствами OpenCV с помощью камеры с глобальным затвором, например OV7251 или OV9281. Для запуска установите зависимости:
sudo apt-get update && sudo apt-get install libzbar-dev libopencv-dev
Демо с двумя камерами
$ ./preview-dualcam
$ ./capture-dualcam
Пример preview-dualcam.c показывает, как одновременно открыть оба разъёма камер на Raspberry Pi Compute Module для предпросмотра. Пример capture-dualcam.c показывает, как снимать с каждого разъёма камеры на Compute Module, переключаясь между ними.
Структуру camera_interface нужно заполнить в соответствии с подключением вашего оборудования.
Например, разъём камеры 0 использует sda_pin 28, scl_pin 29, led_pin 30, shutdown_pin 31, а разъём камеры 1 — sda_pin 0, scl_pin 1, led_pin 2, shutdown_pin 3.
Подробнее о подключении камер к Compute Module — в документации Raspberry Pi.
Утилиты
Как воспроизвести файл H264
Соберите hello_video.bin:
$ cd /opt/vc/src/hello_pi && ./rebuild.sh
Воспроизведите файл H264:
$ /opt/vc/src/hello_pi/hello_video/hello_video.bin test.h264

