Intereting Posts
Протокол DIAL для запуска приложения для Android Переключение между фрагментами с помощью функции OnNavigationItemSelected в новом шаблоне активности навигационного ящика (Android Studio 1.4) Как я могу избежать выполнения onTextChanged в EditText Android Установка google-приложений на genymotion Android: получить элемент списка из кнопки, нажатой в пользовательском listview Делайте снимок с помощью рисунка / краски на лице, используя видение api КоординаторLayout layout_anchor не работает Можно ли загружать элементы ListPreference из адаптера? Не удалось открыть файл на стороне клиента, попробовав сервер. Ошибка в Android. Элементы панели задач Android остаются при появлении фрагмента Как отключить коррекцию заклинаний программно в android Как вернуть результат посредством нескольких действий Android: как обнаружить клик на пользовательском элементе SearchView Может ли код вызываться, когда мое приложение для Android будет удалено? Стиль Android 4.4 полупрозрачного статуса и стиля навигации на Android 5.0

Как получить объект Mat из байта в openCV android?

Я работаю с библиотекой OpenCV на Android. У меня есть класс, который реализует PictureCallBack .

Метод переопределения onPictureTaken() приведен ниже,

  @Override public void onPictureTaken(byte[] data, Camera camera) { Log.i(TAG, "Saving a bitmap to file"); // The camera preview was automatically stopped. Start it again. mCamera.startPreview(); mCamera.setPreviewCallback(this); // Write the image in a file (in jpeg format) try { FileOutputStream fos = new FileOutputStream(mPictureFileName); fos.write(data); fos.close(); } catch (java.io.IOException e) { Log.e("PictureDemo", "Exception in photoCallback", e); } } 

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

Каков наиболее эффективный способ получения объекта Mat из массива Byte? Я уже пробовал эти подходы:

  1. Не знаю, что случилось с изображением.

    Mat m=new Mat(); m.put(0,0,data);

  2. Преобразуя в bitmapToMat() используйте bitmapToMat() В этом случае красный цвет станет синим.

У меня также нет проблем с сохранением изображения для будущего использования, но это приводит к исключению, потому что файл еще не был создан, когда я использую ранее сохраненное изображение.

Solutions Collecting From Web of "Как получить объект Mat из байта в openCV android?"

Вы должны указать ширину и высоту изображения / Мать и глубину каналов.

 Mat mat = new Mat(width, height, CvType.CV_8UC3); mat.put(0, 0, data); 

Убедитесь, что вы используете правильный тип Mat. Возможно, ваши данные не в формате CvType.CV_8UC1 RGB, и вы должны использовать другой тип, например CvType.CV_8UC1 .
Удачи!

Самый лучший и простой способ:

 byte[] bytes = FileUtils.readFileToByteArray(new File("aaa.jpg")); Mat mat = Imgcodecs.imdecode(new MatOfByte(bytes), Imgcodecs.CV_LOAD_IMAGE_UNCHANGED); 

Opencv имеет аккуратный способ записи Mats в файлы – он может генерировать разные форматы на основе предоставленного расширения файла. Вот минимальный пример:

  public void writeImageToFile(Mat image, String filename) { File root = Environment.getExternalStorageDirectory(); File file = new File(root, filename); Highgui.imwrite(file.getAbsolutePath(), image); if (DEBUG) Log.d(TAG, "writing: " + file.getAbsolutePath() + " (" + image.width() + ", " + image.height() + ")"); } 

Если красный и синий обмениваются местами, это звучит так, как будто ваши байтовые данные из onPictureTaken () находятся в формате BGRA. Вы можете поменять его на RGBA, используя:

 Imgproc.cvtColor(bgrImg, rgbImg, Imgproc.COLOR_BGR2RGB); 

Формат на самом деле специфичен для устройства – на одном устройстве у меня это получилось как YUV.