2016-03-03 193 views
0

我的图像表示为org.bytedeco.javacpp.Mat。我只是想将它转换为float/int的Java数组。转换背后的原因是我想在其他库(Nd4j)中使用Java阵列进行图像置换。我尝试了下面的方法,但它们不起作用。将org.bytedeco.javacpp.Mat转换为Java int/float数组

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; 

} 
+2

它究竟如何不起作用?你遇到什么错误/问题? – Castaglia

+0

int [] resizedImageArray1 = MatToFloatArray1(resizedImage); int [] resizedImageArray2 = MatToFloatArray2(resizedImage); resizedImageArray1出来是零大小。而在第二次调用中,我得到UnsupportedOperationException,因为支持这个缓冲区的数组也是空的。 –

回答

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);