Конвертировать ByteBuffer в OpenCV Mat - PullRequest
0 голосов
/ 29 июня 2018

Я хочу, чтобы преобразовать Bytebuffer в OpenCV Mat - это эффективный способ.

Грязное решение - сначала создать растровое изображение с использованием copyPixelsFromBuffer

Bitmap bmp = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888);
bmp.copyPixelsFromBuffer(frame);

, а затем преобразовать Bitmap в Mat, используя утилиты OpenCV.

Mat mat = new Mat();
Utils.bitmapToMat(bmp, mat);

что медленно

Пожалуйста, помогите мне с элегантным решением

Ответы [ 4 ]

0 голосов
/ 11 июля 2018

Это довольно легко с приведенным ниже решением. Предполагая, что frame является входом ByteBuffer

byte[] data = new byte[frame.capacity()];
((ByteBuffer) frame.duplicate().clear()).get(data);
Mat mat = new Mat(480, 640, CvType.CV_8UC4);
mat.put(0, 0, data);
0 голосов
/ 05 июля 2018

Я не очень знаком с ByteBuffer, но если вы можете получить указатель на буфер (через GetDirectBufferAddress()?), Вы можете использовать этот конструктор Mat Mat(Size size, int type, void* data, size_t step), который не будет копировать.

0 голосов
/ 09 июля 2018

Это может быть полезно.

byte[] bytes = frame.array();      
Mat mat = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED);
0 голосов
/ 29 июня 2018

Отказ от ответственности: это непроверенный код.

Если вы знаете свойства (ширину, высоту, тип и т. Д.) Изображения, вы можете.

byte[] data = byteBuffer.array()
Mat mat = new Mat(width, height, CvType.CV_8UC3);
mat.put(0, 0, data);

Имейте в виду, что OpenCV по умолчанию создает изображения в формате B, G, R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...