JavaCv:如何将IplImage转换为BufferedImage

时间:2015-08-07 09:01:44

标签: opencv javacv

我必须将IplImage转换为BufferedImage ...应该是一项简单的任务对我来说变得非常复杂。我在Mac OSX上使用JavaCv 1.0(它与OpenCV 3.0链接)。

在旧的JavaCV API中有IplImage方法#getBufferedImage,但我在新的1.0 API中找不到它了。所以我试图将IplImage转换为字节数组并将字节数组转换为BufferedImage。我发现这个解决方案可以执行这样的转换:

IplImage inputImg = cvLoadImage(imgName); //imgName is a JPEG absolute path
byte[] imageData = IplImageToByteArray( inputImg); //defined below
ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
BufferedImage inputImage = ImageIO.read(bais); //Always return null

其中IplImageToByteArray可以通过以下方式之一定义:

public static byte[] IplImageToByteArray(IplImage src) {
    ByteBuffer byteBuffer = src.getByteBuffer();
    byte[] barray = new byte[byteBuffer.remaining()];
    byteBuffer.get(barray);
    return barray;
}

public static byte[] IplImageToByteArray2(IplImage src) {
    byte[] barray = new byte[src.imageSize()];
    src.getByteBuffer().get(barray);
    return barray;
}

返回的字节数组在两种情况下都相同,但ImageIO.read返回null值。我不知道自己错了什么。

2 个答案:

答案 0 :(得分:9)

public static BufferedImage IplImageToBufferedImage(IplImage src) {
    OpenCVFrameConverter.ToIplImage grabberConverter = new OpenCVFrameConverter.ToIplImage();
    Java2DFrameConverter paintConverter = new Java2DFrameConverter();
    Frame frame = grabberConverter.convert(src);
    return paintConverter.getBufferedImage(frame,1);
}

答案 1 :(得分:0)

使用“org.bytedeco.javacv.Java2DFrameUtils”,你会知道我说了什么。