Скопируйте AHardwareBuffer в cv::Mat opencvC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Скопируйте AHardwareBuffer в cv::Mat opencv

Сообщение Anonymous »


Я пытаюсь преобразовать данные изображения буфера в cv::Mat opencv, но безуспешно. Это код, над которым я работаю, и когда я отлаживаю содержимое памяти переменной cv::Mat, я получаю сообщение «ошибка чтения памяти»


Изображение


cv::Mat* ConvertAHardwareBufferToMat(AHardwareBuffer* hardwareBuffer) { AHardwareBuffer_Desc bufferDesc; AHardwareBuffer_describe(hardwareBuffer, &bufferDesc); void* буфер = nullptr; int lockResult = AHardwareBuffer_lock (hardwareBuffer, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, -1, nullptr, &buffer); если (lockResult != 0) { __android_log_print(ANDROID_LOG_ERROR, «FrameProcessor», «Не удалось заблокировать аппаратный буфер, ошибка: %d», lockResult); } // Создаём cv::Mat и копируем данные cv::Mat* mat = новое cv::Mat(bufferDesc.height, bufferDesc.width, CV_8UC4, буфер); AHardwareBuffer_unlock (hardwareBuffer, nullptr); возвратный коврик; } РЕДАКТИРОВАТЬ 1

Я немного изменил код для интеграции предложенного решения, но приложение вылетает в строке клонирования, не выдавая никаких исключений, я получил шаг 1.1:
cv::Mat ConvertAHardwareBufferToMat(AHardwareBuffer* hardwareBuffer) { AHardwareBuffer_Desc bufferDesc; AHardwareBuffer_describe(hardwareBuffer, &bufferDesc); void* буфер = nullptr; int lockResult = AHardwareBuffer_lock (hardwareBuffer, AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN, -1, nullptr, &buffer); если (lockResult != 0) { __android_log_print(ANDROID_LOG_ERROR, «FrameProcessor», «Не удалось заблокировать аппаратный буфер, ошибка: %d», lockResult); вернуть резюме::Mat(); } // Создаем cv::Mat, указывающий на буфер cv::Mat mat(bufferDesc.height, bufferDesc.width, CV_8UC4, буфер); резюме::Mat клон; пытаться { // Клонируем коврик, чтобы сделать глубокую копию __android_log_print(ANDROID_LOG_INFO, «FrameProcessor», «Шаг 1.1»); клон = mat.clone(); __android_log_print(ANDROID_LOG_INFO, «FrameProcessor», «Шаг 1.2»); } catch (const cv::Exception& e) { __android_log_print(ANDROID_LOG_ERROR, "FrameProcessor", "cv::Exception во время клонирования: %s", e.what()); вернуть резюме::Mat(); } // Разблокируем аппаратный буфер, когда закончим копирование данных AHardwareBuffer_unlock (hardwareBuffer, nullptr); // Возвращаем глубокую копию вернуть клон; }
Ответить

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

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

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

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

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