2016-03-03 1 views
0

Mon image est représentée par org.bytedeco.javacpp.Mat. Et je veux simplement le convertir en tableau Java de float/int. La raison derrière la conversion est que je veux utiliser le tableau Java dans une autre bibliothèque (Nd4j) à des fins de permutation d'image. J'ai essayé ci-dessous approches, mais ils ne fonctionnent pas.Conversion d'org.bytedeco.javacpp.Mat en Java int/float array

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

Comment cela ne fonctionne-t-il pas exactement? Quelles sont les erreurs/problèmes que vous rencontrez? – Castaglia

+0

int [] resizedImageArray1 = MatToFloatArray1 (resizedImage); int [] resizedImageArray2 = MatToFloatArray2 (resizedImage); resizedImageArray1 est de taille nulle. Et dans le deuxième appel, j'obtiens UnsupportedOperationException comme le tableau qui soutient ce tampon est vide aussi bien. –

Répondre

1

La façon la plus efficace est probablement quelque chose comme ce qui suit:

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

Ceci est dans le cas de int, mais nous pouvons aussi faire la même chose pour float:

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