К содержимому
  1. Главная
  2. Блог
  3. Драйвер камер OBISP в пространстве пользователя и SDK

Драйвер камер OBISP в пространстве пользователя и SDK

28 марта 2023 · По материалам Arducam

Введение

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

Подготовка

Включение камеры в настройках Raspberry Pi, шаг 1
Включение камеры в настройках Raspberry Pi, шаг 2
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
Клонирование репозитория MIPI_Camera
cd MIPI_Camera/RPI/
Переход в каталог MIPI_Camera/RPI
make install
Установка библиотеки командой `make install`
chmod +x enable_i2c_vc.sh
./enable_i2c_vc.sh
Включение I2C скриптом `enable_i2c_vc.sh`

Затем нажмите Y/y, чтобы сразу перезагрузить систему.

Сборка примеров

cd MIPI_Camera/RPI/
make clean && make
Сборка примеров командой `make`

Как пользоваться готовыми демо-программами (на примере IMX298)

arducamstill

Универсальная программа: с её помощью можно выводить предпросмотр, получать изображения в разных форматах и точно настраивать качество изображения.

  • Справка:
pi@raspberrypi:~/MIPI_Camera/RPI $ ./arducamstill -?
Справка программы `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
  • Точная настройка экспозиции, фокуса и усиления с клавиатуры:
Настройка экспозиции, фокуса и усиления с клавиатуры в `arducamstill`
  • Подобрав удачные значения, задайте их через 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
Окно программы `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)

  • Подключение оборудования
Подключение камер OV9281 к стереоплате HAT

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

pi@raspberrypi:~/MIPI_Camera/RPI $ ./list_format
Вывод `list_format` для стереоплаты HAT

Из вывода видно, что для стереоплаты 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

Ещё по теме

Запросить цену

Укажите количество — пришлём коммерческое предложение.