IplImage/Mat到字节数组和返回与JavaCV 1.2



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

我有一个最新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。

另一个选择是使用buffereimage。如果只使用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,我实际上使用了Buffered Image以提高可靠性。

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

相关内容

  • 没有找到相关文章