2016-10-22 5 views
0

Il semble que ce soit trop de fois "déjà répondu" sujet, mais néanmoins je n'ai pas réussi à trouver une solution réalisable. J'ai besoin de sérialiser IplImages et Mats avec JavaCV. Je ne peux pas utiliser le système de fichiers, je dois m'en tenir à JavaCV 1.2/JavaCPP 1.2.4/OpenCV 3.1 (note: je ne peux pas utiliser le propre wrapping Java de l'OpenCV - je dois travailler avec JavaCV). J'ai trouvé un certain nombre de recommandations sur Stackoverflow, mais toutes les deux: 1) utilisent une méthode obsolète, ou 2) utilisent des méthodes qui n'existent plus. Je suis conscient que IplImages et Mats sont facilement interchangeables, donc une solution pour l'un serait facilement applicable pour l'autre. La solution idéale serait un moyen de convertir IplImage/Mat en tableau byte et retour. J'espere que vous pouvez m'aider.IplImage/Mat à byte array et retour avec JavaCV 1.2

Répondre

0

J'ai une solution pour le JavaCV le plus récent. En fait, plusieurs. J'avais des problèmes avec certaines images, donc ma deuxième tentative de conversion en un tableau d'octets a produit un résultat plus cohérent. Les solutions ici sont à Scala.

Pour convertir en tableau d'octets avec les données d'image, vous devez obtenir les octets.

Mat m = new Mat(iplImage); 
ByteBuffer buffer = this.image.asByteBuffer(); 
Mat m = new Mat(this.image); 
int sz = (m.total() * m.channels()); 
byte[] barr = new byte[sz](); 
m.data().get(barr); 

Convertir en java.nio.ByteBuffer, utilisez la taille totale de votre image (I converti en un tapis), et obtenir les données. J'oublie si m.total * m.channels renvoie un double, un long, un int ou un float. J'utilisais .toInt dans Scala.

Une autre option consiste à utiliser une image tamponnée. Certaines de mes images sortaient un peu bizarrement avec JavaCV.

BufferedImage im = new Java2DFrameConverter().convert(new OpenCVFrameConverter.ToIplImage().convert(this.image)) 
BytearrayOutputstream baos = new ByteArrayOutputStream(); 
byte[] barr = null; 
try{ 
    ImageIO.write(im,"jpg",baos); 
    baos.flush(); 
    barr = baos.toByteArray(); 
}finally{ 
    baos.close(); 
} 
//This could be try with resources but the original was in Scala. 

Pour convertir un tableau d'octets en un IplImage, j'utilise en fait une image tamponnée pour la fiabilité.

ImplImage im = null; 
InputStream in = new ByteArrayInputStream(bytes); 
try { 
    Mat m = new Mat(image.getHeight,image.getWidth,image.getType,new BytePointer(ByteBuffer.wrap(image.getRaster.getDataBuffer.asInstanceOf[DataBufferByte].getData))); 
    im = new IplImage(m); 
}finally{ 
    in.close(); 
} 
//Again this could be try with resources but the original example was in Scala 
+0

C'est exactement ce que je cherchais, sauf que je suis complètement analphabète sur Scala. Quelqu'un aurait-il la peine de recoder cela en Java? – lcofresi

+0

Donnez-moi une minute. Il y en aura 2. Cela vient de mon repo https://github.com/SimplrTek/GoatImaging2 –

+0

@Icofresi La conversion est assez simple. J'ai laissé quelques notes pour vous. Les exemples JavaCV utilisent Scala car ils peuvent interagir avec les bibliothèques Java lors de la compilation du code octet JVM. –