Libcamera-Объяснение слегка меняющегося схема постоянно черных/нулевых пикселейC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Libcamera-Объяснение слегка меняющегося схема постоянно черных/нулевых пикселей

Сообщение Anonymous »

В настоящее время я пишу многопоточную программу в C ++, чтобы подключиться к различным датчикам, читать из них и написать куски данных параллельно. Это программное обеспечение будет работать на Raspberry Pi 5. Одним из этих датчиков является камера Sony IMX219, официально совместимая с Libcamera и Raspberry Pi. Я реализовал это решение в Python, но оно было слишком медленным и интенсивным ресурсом с использованием многопроцессорной работы, поэтому я переключился на C ++. У меня большая часть системы работает, но у меня есть странная проблема, в которой, во -первых, я не могу заставить камеру войти в 8 -битный режим, который я могу в Python, но также в 10 -битном режиме (распакованный до 16), который делает Работа, я получаю относительно последовательный рисунок черных пикселей на изображении. Они иногда слегка меняются, но общее распределение похоже. Я проверил интенсивности пикселей с помощью исторической грамы, и значения 0. Я также отключил AWB и AE без эффекта. В Python, по крайней мере, на сборке, работающей несколько недель назад, эти места не появляются. Я надеюсь найти решение, которое избавится от этих черных пятен. Ниже вы можете найти фрагмент моего кода для того, как я получаю и снимаю данные. < /P>

Код: Выделить всё

static void world_frame_callback(libcamera::Request *request) {
// Determine if we have received invalid image data (e.g. during application     shutdown)
if (request->status() == libcamera::Request::RequestCancelled) {return;}

// Define a variable to hold the arguments passed to the callback function
world_callback_data* data;

// There should be a single buffer per capture
const libcamera::Request::BufferMap &buffers = request->buffers();
auto buffer_pair = *buffers.begin();

// (Unused) Stream *stream = bufferPair.first;
libcamera::FrameBuffer *buffer = buffer_pair.second;

// Capture the metadata of this frame. This lets us know if a frame was successfully captured and also
// the frame sequence number. Gaps in the sequence number indicate dropped frames
const libcamera::FrameMetadata &metadata = buffer->metadata();

// Check if the frame was captured without any sort of error
if(metadata.status != libcamera::FrameMetadata::Status::FrameSuccess) {
std::cout planes().front();
void *memory_map = mmap(nullptr, pixel_data_plane.length, PROT_READ, MAP_SHARED, pixel_data_plane.fd.get(), pixel_data_plane.offset);
if (memory_map == MAP_FAILED) {
std::cout data() + data->buffer_offset, pixel_data, pixel_data_plane.length);

}
Вот фрагмент того, как я инициализирую камеру в отношении режима. Используя picamera в Python, я получаю сообщение о том, что камера может правильно поместиться в SRGGB8, но в C++ я получаю сообщение о том, что она поместила ее в SRGGB16 (хотя я установил для нее значение 8, как показано ниже, и подтвердил, что это так). поддерживаемый режим):

Код: Выделить всё

 // Retrieve the first available camera from the manager to be the world camera
camera = cm->get(cameras[0]->id());

// Acquire the camera
camera->acquire();

// Define the configuration for the camera (this MUST be raw for raw images)
std::unique_ptr config = camera->generateConfiguration( { libcamera::StreamRole::Raw} );

libcamera::StreamConfiguration &streamConfig = config->at(0);

streamConfig.pixelFormat = libcamera::formats::SRGGB8;
streamConfig.size.width = 640;
streamConfig.size.height = 480;

if (config->validate() == libcamera::CameraConfiguration::Invalid) {
std::cerr 

Подробнее здесь: [url]https://stackoverflow.com/questions/79390774/libcamera-explanation-for-slightly-changing-pattern-of-constantly-black-null[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»