【问题标题】:Converting org.bytedeco.javacpp.Mat to Java int/float array将 org.bytedeco.javacpp.Mat 转换为 Java int/float 数组
【发布时间】:2016-03-03 03:52:10
【问题描述】:

我的图像表示为 org.bytedeco.javacpp.Mat。我只是想将它转换为浮点/整数的 Java 数组。转换背后的原因是我想将其他库(Nd4j)中的 Java 数组用于图像置换目的。我尝试了以下方法,但它们不起作用。

private static int[] MatToFloatArray1(Mat mat) {
        org.bytedeco.javacpp.BytePointer matData = mat.data();
        byte[] d = new byte[matData.capacity()];
        return toIntArray(d);
    }


private static int[] MatToFloatArray2(Mat mat) {
    org.bytedeco.javacpp.BytePointer matData = mat.data();
    IntBuffer intBuffer = matData.asBuffer().asIntBuffer();
    return intBuffer.array();

}
    private static int[] toIntArray(byte[] d) {
        IntBuffer intBuf =
                ByteBuffer.wrap(d)
                        .order(ByteOrder.BIG_ENDIAN)
                        .asIntBuffer();
        int[] array = new int[intBuf.remaining()];
        return array;

}

【问题讨论】:

  • 它到底是怎么不起作用的?您遇到什么错误/问题?
  • int[] resizedImageArray1 = MatToFloatArray1(resizedImage); int[] resizedImageArray2 = MatToFloatArray2(resizedImage); resizedImageArray1 的大小为零。在第二次调用中,我得到 UnsupportedOperationException 因为支持这个缓冲区的数组也是空的。

标签: java javacpp deeplearning4j nd4j dl4j


【解决方案1】:

最有效的方法大概是这样的:

Mat intMat = new Mat();
mat.convertTo(intMat, CV_32S);
IntBuffer intBuffer = intMat.createBuffer();
int[] intArray = new int[intBuffer.capacity()];
intBuffer.get(intArray);

这是int的情况,但我们也可以为float做同样的事情:

Mat floatMat = new Mat();
mat.convertTo(floatMat, CV_32F);
FloatBuffer floatBuffer = floatMat.createBuffer();
float[] floatArray = new float[floatBuffer.capacity()];
floatBuffer.get(floatArray);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多