Я пытаюсь преобразовать данные изображения буфера в 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); // Возвращаем глубокую копию вернуть клон; }
Мобильная версия