我必须将IplImage转换为BufferedImage…对我来说,一个简单的任务变得非常复杂。我正在Mac OSX上使用JavaCv 1.0(它与OpenCV 3.0链接)。
在旧的JavaCV API中有IplImage方法#GetBuffereImage,但我在新的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始终返回空值。我不知道我做错了什么。
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);
}
使用“org.bytedeco.javacv.Java2DFrameUtils”,你就会知道我说了什么。