似乎太多次了#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转换为字节数组并返回的方法。我希望你们能帮忙。
答案 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