如何从openCV android中的Byte 获取Mat对象?

我正在使用Android中的OpenCV库。 我有一个实现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); } } 

因为我想在image processing中进一步使用图像数据,而不是保存和重新加载图像。

从Byte数组获取Mat对象的最有效方法是什么? 我已经尝试了这些方法:

  1. 不知道形象发生了什么。

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

  2. 转换为位图,然后使用bitmapToMat()在这种情况下,红色变成蓝色。

我也没有任何问题来保存图像供将来使用,但是这导致了我的例外,因为当我使用以前存储的图像时,文件还没有被生成。

Solutions Collecting From Web of "如何从openCV android中的Byte 获取Mat对象?"

您必须指定图像/垫子和通道深度的宽度和高度。

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

确保你使用正确的垫子types。 也许你的数据不是3字节的RGB格式,你应该使用另一种types,例如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。