IplImage / Mat到字节数组,然后用JavaCV 1.2返回

时间:2016-10-22 15:52:31

标签: serialization javacv iplimage

似乎太多次了#34;已经回答了#34;话题,但是我无法找到可行的解决方案。我需要使用JavaCV序列化IplImages和Mats。我不能使用文件系统,ad我必须坚持使用JavaCV 1.2 / JavaCPP 1.2.4 / OpenCV 3.1(注意:我不能使用OpenCV自己的Java包装 - 我必须使用JavaCV)。我在Stackoverflow上找到了一些建议,但它们都是:1)使用不推荐的方法,或2)使用不再存在的方法。我知道IplImages和Mats很容易互换,因此一个解决方案很容易适用于另一个。理想的解决方案是将IplImage / Mat转换为字节数组并返回的方法。我希望你们能帮忙。

1 个答案:

答案 0 :(得分:0)

我有最新JavaCV的解决方案。实际上,有几个。我遇到了一些图像问题,所以我第二次尝试转换为字节数组会产生更一致的结果。 这里的解决方案是Scala。

要转换为包含图像数据的字节数组,您需要获取字节。

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

转换为java.nio.ByteBuffer,使用图像中的总大小(我转换为mat),然后获取数据。我忘了m.total * m.channels是返回double,long,int还是float。我在Scala中使用.toInt。

另一种选择是使用BufferedImage。使用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.

要从字节数组转换为IplImage,我实际上使用缓冲图像来提高可靠性。

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