Opencv JavaCv:如何将IplImage转换为ufferedimage

Opencv JavaCv:如何将IplImage转换为ufferedimage,opencv,javacv,Opencv,Javacv,我必须将IplImage转换为BuffereImage。。。对我来说,一项简单的任务变得非常复杂。我在MacOSX上使用JavaCv 1.0(它与OpenCV 3.0链接) 在旧的javacvapi中有IplImage方法#getBufferedImage,但我在新的1.0api中再也找不到它了。因此,我尝试将IplImage转换为字节数组,将字节数组转换为BuffereImage。我发现这个解决方案可以执行这种转换: IplImage inputImg = cvLoadImage(imgNam

我必须将IplImage转换为BuffereImage。。。对我来说,一项简单的任务变得非常复杂。我在MacOSX上使用JavaCv 1.0(它与OpenCV 3.0链接)

在旧的javacvapi中有IplImage方法#getBufferedImage,但我在新的1.0api中再也找不到它了。因此,我尝试将IplImage转换为字节数组,将字节数组转换为BuffereImage。我发现这个解决方案可以执行这种转换:

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始终返回空值。我不知道我错了什么。

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

我自己发现的。ImageIO.read始终返回null的原因可能是IplImage的字节具有BuffereImage无法读取的格式。它不同于常用的PNG、JPG、BMP、ecc。对于那些首先从帧创建IplImage的人(例如,在grabber.grap()之后),可以使用paintConverter将帧直接转换为不需要IplImage的BufferedImage。。。只需使用Igor答案的最后一行。你必须解释为什么你的答案会有效。你不能只是说“试试这个,它会有用的!!”。
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);
}