java - 如何从 openCV android 中的 Byte[] 获取 Mat 对象?

标签 java android opencv image-processing bitmap

我在 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);
    }
}

因为我希望在图像处理中进一步使用图像数据,而不是保存和重新加载图像。

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

  1. 不知道图像发生了什么。

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

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

我在保存图像以供将来使用时也没有任何问题,但这导致我出现异常,因为当我使用以前存储的图像时,文件尚未生成。

最佳答案

您必须指定图像/Mat 的宽度和高度以及 channel 深度。

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

确保您使用的垫子类型正确。也许您的数据不是 3 字节 RGB 格式,您应该使用其他类型,例如CvType.CV_8UC1.
祝你好运!

关于java - 如何从 openCV android 中的 Byte[] 获取 Mat 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21113190/

相关文章:

android - 垂直翻转 Android Canvas

java - sql server Smalldatetime 的 JDBC 编码

javascript - androidx.appcompat.widget.LinearLayoutCompat 无法转换为 android.widget.LinearLayout

JavaFX 删除工具栏和窗口顶部之间的分隔

android - MediaCodec - 将 EOS 缓冲区发送到音频解码器时出现奇怪的错误

opencv - SVM的链接器错误OpenCV

python - 如何将 OpenCV 图像与颜色进行比较

c++ - 在 OpenCV 中使用网络摄像头捕获 2 个非连续帧

java - Spring Security 数据库授权

java - 我需要打印一个等于该单词中字符数的单词