Перейти до основного вмісту

Вхідний вузол камери.

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 вибрати камеру за замовчуванням.
width1920Зазначена ширина кадру в пікселях. Має підтримуватися камерою та накладкою.
height1080Запитана висота фрейму в пікселях.
framerate_num30Чисельник частоти кадрів.
framerate_den1Знаменник частоти кадрів. 0 нормалізується до 1.
format"NV12"Запитано video/x-raw формат. NV12 є рекомендованим шляхом попередньої обробки для моделі.
buffer_name"camera"Логічна назва буфера, що використовується в подальших метаданих і для іменування моделей.
insert_queuetrueПісля узгодження з алокатором і перевірки можливості використання механізму «нульового копіювання» вставте невелику чергу для потокового джерела даних.
leaky_queuetrueЗробіть чергу пропускною у нижній частині, щоб динамічні графіки надавали перевагу останнім кадрам, а не застарілим даним.
queue_depth2Максимальна кількість буферів у черзі, коли insert_queue має значення true.
allow_cpu_fallbackfalseЯкщо 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_missinglibcamerasrc або 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.