2015-08-07 2 views
2

Мне нужно преобразовать IplImage в BufferedImage ... то, что должно быть простой задачей, становится очень сложным для меня. Я использую JavaCv 1.0 на Mac OSX (который связан с OpenCV 3.0).JavaCv: как преобразовать IplImage в BufferedImage

В старом API JavaCV был метод 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 возвращает всегда нулевое значение. Я понятия не имею, что я ошибаюсь.

+0

Я нашел это самостоятельно. Вероятно, причина, по которой ImageIO.read всегда возвращает null, состоит в том, что байты IplImage имеют формат, который BufferedImage не может читать. Он отличается от распространенных PNG, JPG, BMP, ecc. –

ответ

8
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); 
} 
+0

gamma, get yourself –

+0

Для тех, кто сначала создает IplImage из кадра (например, после grabber.grap()), можно использовать paintConverter для преобразования рамки непосредственно в BufferedImage без необходимости использования IplImage ... Просто воспользуйтесь последней строкой ответа Игоря. –

Смежные вопросы