Вхідний вузол камери.
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, DMA-BUF камери передається далі, а будь-який кадр, що потребував би копіювання, спричиняє помилку. Встановіть значення true лише для того, щоб дозволити приватному мосту Neat копіювати такі кадри в CMA DMA-BUF. |
capture_buffer_count є аргументом для CameraInputWithCaptureBuffers, а не полем CameraInputOptions. За замовчуванням його значення становить 0, що зберігає значення за замовчуванням для конвеєра камери. Конвеєр камери перевіряє це обмеження; постачальник Neat підтримує максимум 128.
Вхідні та вихідні параметри контракту.
| Пункт контракту | Поведінка |
|---|---|
| Вхідна роль: | Вхідний вузол. Граф отримує кадри з камери; додаток не передає дані до цього вузла. |
| Тип вихідного медіафайлу: | video/x-raw. |
| Формат виводу: | Зазвичай, запитуваний формат format – це NV12. |
| Контракт пам’яті | Власний DMA-BUF камери передається далі без копіювання. Якщо резервний механізм увімкнено, кадр, який не є одним DMA-BUF, копіюється в CMA DMA-BUF для подальших етапів обробки CVU/MLA. |
| Обмеження можливостей, що гарантуються | Статична підказка, що базується на запрошених параметрах. Узгодження обмежень можливостей під час роботи все ще залежить від програмного забезпечення камери. |
Нульове копіювання та резервне копіювання.
allow_cpu_fallback = false є значенням за замовчуванням і вимагає суворого нульового копіювання: камера записує кожен кадр у власний DMA-BUF, і кожен наступний етап читає ту саму пам’ять. Neat ніколи не володіє пам’яттю камери, тому жодна властивість libcamerasrc не потрібна. Будь-який фізично неперервний DMA-BUF є допустимим входом EV74; перевірка допуску EV74 у Neat приймає його, якщо він походить із купи CMA або з неперервного розподільника буферів захоплення камери (videobuf2_dma_contig).
Neat завжди розміщує свій приватний міст камери безпосередньо після фільтра caps і перед живою чергою. Міст просить джерело додавати GstVideoMeta через GST_QUERY_ALLOCATION, а потім передає кожен кадр, площини якого розташовані впритул одна за одною в одному DMA-BUF, як єдину пам’ять, утримуючи буфер камери, доки всі споживачі його не звільнять. У суворому режимі кадр, який неможливо передати таким чином, спричиняє збій конвеєра; якщо резервний механізм увімкнено, його натомість копіюють у CMA DMA-BUF.
Передайте capture_buffer_count до фабрики камери на основі власника в потоці даних. Тимчасовий кодувальник або глибокий асинхронний ML-граф може потребувати 32 буфери; граф CV з низькою затримкою може використовувати менше і відкидати застарілі кадри. Це налаштування контролює лише цикл ISP-вихід/застосунок. Воно не збільшує приватне кільце передачі RAW CSI-to-ISP в ядрі, і воно не залежить від політики відкидання GStreamer queue_depth. На Platform 3.0 libcamerasrc не має властивості buffer-count, тому там залишайте capture_buffer_count зі значенням 0.
Оскільки міст передає власні буфери камери, кожен кадр, який наступний етап ще утримує, вилучає один буфер із кільця захоплення libcamera (8 буферів для 1080p NV12 з IMX477 на Platform 3.0). Граф, що утримує стільки кадрів, зупиняє захоплення замість відкидання кадрів, тому своєчасно звільняйте отримані кадри.
Явно встановіть allow_cpu_fallback = true, щоб дозволити вже наявному мосту виконувати копіювання, коли кадр не є одним DMA-BUF із площинами, розташованими впритул одна за одною. Кадри, які є таким DMA-BUF, міст і далі передає. В іншому випадку він копіює кадр камери в CMA DMA-BUF із приватного пулу і приєднує метадані, які очікують наступні етапи. Цей пул збільшується за потреби до 128 буферів, а не обмежується 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 | Камера не підтримує запрошений формат, роздільну здатність або частоту кадрів. |
misconfig.media_caps / gstreamer.camera_configuration_unsupported | Узгодження libcamerasrc не вдалося, бо камера не надає запитаної роздільної здатності або формату пікселів. Захоплюйте кадри підтримуваного розміру; у графах із моделлю доручіть зміну розміру попередній обробці моделі, а в інших графах використовуйте VideoScale, а потім CapsRaw. |
| Сувора нульова копія помилок | allow_cpu_fallback має значення «false», і камера надала кадр, який не є одним DMA-BUF із площинами, розташованими впритул одна за одною. |
| Час очікування вичерпано. | Камера не передала кадри, на графі виникла затримка, або потік даних від камери зупинився. |
| Зелені, фіолетові або надмірно кольорові рамки. | Формат або модель рамки неправильно обробляє перетворення кольорів, або колірне відтінення вже присутнє у вихідних даних камери ISP/libcamera. Спочатку перевірте NV12 знімок поза Neat. |