Вхідни й вузол камери.
CameraInput — це вихідний вузол для MIPI-камер, доступ до яких здійснюється через libcamera та GStreamer libcamerasrc. Використовуйте його на початку графа, що належить джерелу, коли кадри повинні надходити зі стеку камер DevKit, а не з run.push(...).
Інструкції щодо виконання завдання див. у розділі Використовуйте камеру MIPI..
Необхідні умови.
Перш ніж використовувати CameraInput, активуйте камеру за межами Neat:
- прикріпіть камеру, коли Modalix DevKit вимкнено.
- оберіть відповідне накладення
.dtbo, яке відповідає материнській платі, виробнику камери, сенсору та порту. - перевірте, чи відображається камера в списку libcamera;
- підтвердьте, чи може
libcamerasrcздійснювати потокову передачу у вказаному вами форматіformat,width,height,framerate.
camera_name – це назва камери libcamera. Залиште це значення порожнім для використання камери за замовчуванням або скопіюйте назву з cam -l, якщо на платі встановлено більше однієї камери.
Швидкий старт.
#include <neat.h>
namespace neat = simaai::neat;
neat::CameraInputOptions opt;
opt.width = 1920;
opt.height = 1080;
opt.framerate_num = 30;
opt.framerate_den = 1;
opt.format = "NV12";
opt.buffer_name = "camera0";
opt.allow_cpu_fallback = true;
neat::Graph graph;
graph.add(neat::nodes::CameraInput(opt));
graph.add(neat::nodes::Output("frames"));
neat::Run run = graph.build();
std::optional<neat::Sample> frame = run.pull(/*timeout_ms=*/5000);
Оскільки CameraInput є власником джерела, створіть граф, не додаючи загальнодоступний вузол Input, якщо ваш застосунок насправді не має іншого вхідного вузла, що надходить від іншого застосунку.
Інтерфейс API.
namespace simaai::neat {
struct CameraInputOptions;
class CameraInput;
}
namespace simaai::neat::nodes {
std::shared_ptr<simaai::neat::Node> CameraInput(
simaai::neat::CameraInputOptions opt = {});
std::shared_ptr<simaai::neat::Node> CameraInputWithCaptureBuffers(
simaai::neat::CameraInputOptions opt,
std::uint32_t capture_buffer_count);
}
Python:
opt = pyneat.CameraInputOptions()
node = pyneat.nodes.camera_input(opt, capture_buffer_count=32)
Параметри
| Поле | Значення за замовчуванням | Опис |
|---|---|---|
camera_name | не встановлено | Необов’язкова назва камери libcamera, зазвичай копіюється з cam -l. Залиште порожнім, щоб дозволити libcamera вибрати камеру за замовчуванням. |
width | 1920 | Зазначена ширина кадру в пікселях. Має підтримуватися камерою та накладкою. |
height | 1080 | Запитана висота фрейму в пікселях. |
framerate_num | 30 | Чисельник частоти кадрів. |
framerate_den | 1 | Знаменник частоти кадрів. 0 нормалізується до 1. |
format | "NV12" | Запитано video/x-raw формат. NV12 є рекомендованим шляхом попередньої обробки для моделі. |
buffer_name | "camera" | Логічна назва буфера, що використовується в подальших метаданих і для іменування моделей. |
insert_queue | true | Після узгодження з алокатором і перевірки можливості використання механізму «нульового копіювання» вставте невелику чергу для потокового джерела даних. |
leaky_queue | true | Зробіть чергу пропускною у нижній частині, щоб динамічні графіки надавали перевагу останнім кадрам, а не застарілим даним. |
queue_depth | 2 | Максимальна кількість буферів у черзі, коли insert_queue має значення true. |
allow_cpu_fallback | false | Якщо false, вимагайте підтримку функції «нульового копіювання» для камери/пристрою. Встановіть значення true лише для активації приватної адаптивної інтеграції Neat із пам’яттю SiMaAI. |
capture_buffer_count є аргументом для CameraInputWithCaptureBuffers, а не полем CameraInputOptions. За замовчуванням його значення становить 0, що зберігає значення за замовчуванням для конвеєра камери. Конвеєр камери перевіряє це обмеження; постачальник Neat підтримує максимум 128.
Вхідні та вихідні параметри контракту.
| Пункт контракту | Поведінка |
|---|---|
| Вхідна роль: | Вхідний вузол. Граф отримує кадри з камери; додаток не передає дані до цього вузла. |
| Тип вихідного медіафайлу: | video/x-raw. |
| Формат виводу: | Зазвичай, запитуваний формат format – це NV12. |
| Контракт пам’яті | Віддає перевагу механізму обміну даними без копіювання між пристроєм і SiMaAI. У разі активації механізму резервного копіювання, буфери ОС/libcamera адаптуються для використання в пам’яті SiMaAI для подальших етапів обробки CVU/MLA. |
| Обмеження можливостей, що гарантуються | Статична підказка, що базується на запрошених параметрах. Узгодження обмежень можливостей під час роботи все ще залежить від програмного забезпечення камери. |
Нульове копіювання та резервне копіювання.
allow_cpu_fallback = false є значенням за замовчуванням і вимагає суворого використання камери/пристрою без копіювання даних. Збірка завершиться помилкою, якщо встановлений libcamerasrc не надає загальну властивість external-buffer-mode, і бібліотека пам’яті не може експортувати виділену пам’ять камери як DMA-буфери.
Neat завжди розміщує свій приватний міст камери безпосередньо після фільтра caps і перед живою чергою. Міст пропонує стандартний пул через GStreamer's downstream GST_QUERY_ALLOCATION. Пул отримує розміри площин і крок з валідованих caps, виділяє їх з одного упакованого виділення SiMaAI та експортує один DMA-буфер на площину. libcamerasrc імпортує ці DMA-буфери в чергу захоплення ISP. Міст перевіряє результат і розпаковує те саме упаковане виділення без копіювання в суворому режимі.
Передайте capture_buffer_count до фабрики камери на основі власника в потоці даних. Тимчасовий кодувальник або глибокий асинхронний ML-граф може потребувати 32 буфери; граф CV з низькою затримкою може використовувати менше і відкидати застарілі кадри. Це налаштування контролює лише цикл ISP-вихід/застосунок. Воно не збільшує приватне кільце передачі RAW CSI-to-ISP в ядрі, і воно не залежить від політики відкидання GStreamer queue_depth.
Явно встановіть allow_cpu_fallback = true, щоб дозволити вже наявному мосту виконувати копіювання, коли стек камери не може виконати запропонований розподільник. Міст передає буфери SiMaAI/EV74, коли вони надаються вищезазначеним потоком. В іншому випадку він копіює кадр камери в пул SiMaAI і приєднує метадані, які очікують наступні етапи. Цей приватний пул копій збільшується за потреби, а не обмежується queue_depth, що дозволяє потоку даних, який може втрачати дані, відкидати застарілі кадри, не змушуючи міст спочатку зупинятися.
Назва fallback означає, що міст може приймати буфери OS/libcamera. Це не означає, що слід перемістити зміну розміру, перетворення кольору або нормалізацію на ЦП. Залиште ці операції в попередній обробці CVU, керованій моделлю, коли це підтримується.
Не додавайте самостійно вузол OsToSima для CameraInput. Адаптація належить до шляху джерела камери.
Найпоширеніші типи графів.
Витягуйте кадри безпосередньо з камери:
CameraInput -> Output
Проведіть камерою по моделі:
CameraInput -> model.graph({include_input=false, include_output=true})
Для конвеєрів моделей налаштуйте попередню обробку за допомогою Model::Options::preprocess або pyneat.ModelOptions.preprocess, щоб такі операції, як зміна розміру, перетворення кольорів, нормалізація, квантування та теселяція, виконувалися в межах керованого моделлю шляху обробки комп’ютерного зору (CVU).
Можливі сценарії відмови.
| Помилка | Ймовірна причина |
|---|---|
build.plugin_missing | libcamerasrc або neatcamerabridge відсутні в наборі плагінів середовища виконання. |
misconfig.media_caps / not-negotiated | Камера не підтримує запрошений формат, роздільну здатність або частоту кадрів. |
| Сувора нульова копія помилок | allow_cpu_fallback має значення «false», і джерело камери не надає властивості SiMaAI для нульової копії. |
| Час очікування вичерпано. | Камера не передала кадри, на графі виникла затримка, або потік даних від камери зупинився. |
| Зелені, фіолетові або надмірно кольорові рамки. | Формат або модель рамки неправильно обробляє перетворення кольорів, або колірне відтінення вже присутнє у вихідних даних камери ISP/libcamera. Спочатку перевірте NV12 знімок поза Neat. |