【问题标题】:How to convert Mat to byte array, store the value and then convert it back again? java opencv [duplicate]如何将 Mat 转换为字节数组,存储值然后再次转换回来? java opencv [重复]
【发布时间】:2017-04-25 13:00:59
【问题描述】:

我的系统有一个 Mat 图像,我希望能够将它存储在我的 sqlite 数据库中。所以我想我需要尝试将它转换为字节数组才能存储它。但是我不确定这是正确的,因为我不确定如何使用我得到的值,如果我要从 db 访问它以便能够将其转换回其原始 Mat 图像。 以下是我目前想出的:

static byte[] matToByte(Mat mat) throws SQLException {
    int length = (int) (mat.total()*mat.elemSize());
    byte buffer[] = new byte[length];
    int converted = mat.get(0, 0, buffer);

    IrisInitialDatabase.addFeatures(converted);

    return buffer;

}

static Mat byteToMat(byte[] value) {
    Mat m = new Mat();
    m.put(0, 0, value);

    return m;
}

谢谢:)

【问题讨论】:

    标签: java opencv iris-recognition


    【解决方案1】:

    以Base64格式保存到数据库中。

    1. 垫到位图

      Bitmap image = Bitmap.createBitmap(rgba.cols(),
              rgba.rows(), Bitmap.Config.RGB_565);
      
      Utils.matToBitmap(rgba, image);
      
      Bitmap bitmap = (Bitmap) image;
      bitmap = Bitmap.createScaledBitmap(bitmap, 600, 450, false);
      
    2. 位图到字节数组

      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();  
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
      byte[] byteArray = byteArrayOutputStream .toByteArray();
      

    ---保存到数据库---

    1. 把垫子拿回来

      m = Highgui.imdecode(new MatOfByte(Base64.decode(base64ImageFromDB,0)),Highgui.IMREAD_UNCHANGED);
      

    【讨论】:

    • 谢谢,我好像没有Bitmap类型,你知道我怎么弄的吗,我的opencv库里好像没有包含它
    • 位图是默认的android库developer.android.com/reference/android/graphics/Bitmap.html只需导入import android.graphics.Bitmap;
    • 我很高兴它有效,请将我的答案标记为正确。 :)
    • 我得到一个存根错误,它说是由第一行引起的,你认为这与我的 mat img 最初的格式/颜色有关吗?
    • 如何获得 Mat 图像?尝试调试它并检查它是否是正确的格式。矩阵应该有列、行等。
    猜你喜欢
    • 2015-01-05
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2020-02-20
    • 2011-12-18
    相关资源
    最近更新 更多