今天在做javacv圖片轉換時遇到格式報錯的問題,但是我檢查半天我的格式是Mat格式啊。
然后一查,javaCV中竟然一共有兩種Mat格式,兩者不互通,導入的依賴包也是不同的,而大部分情況下我們導入的都是org.opencv.core.*包,所以遇到另一種格式的Mat數據就會報錯。
真是讓我長見識了。
在查閱外網后終於找到了在兩種Mat格式之間相互轉化的方法。我們需要先將org.opencv.core.Mat轉化為java.awt.image.BufferedImage,再將BufferImage轉化為org.bytedeco.javacpp.opencv_core.Mat格式。
如果預先已經導入了org.opencv.core.*包的話直接將org.bytedeco.javacpp.opencv_core.Mat格式在開頭寫明,當然不要忘記導入相關的jar依賴包。
下面貼下相關的轉化方法:
org.opencv.core.Mat轉java.awt.image.BufferedImage:
public BufferedImage matToBufferedImage(Mat frame) {
int type = 0;
if (frame.channels() == 1) {
type = BufferedImage.TYPE_BYTE_GRAY;
} else if (frame.channels() == 3) {
type = BufferedImage.TYPE_3BYTE_BGR;
}
BufferedImage image = new BufferedImage(frame.width() ,frame.height(), type);
WritableRaster raster = image.getRaster();
DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
byte[] data = dataBuffer.getData();
frame.get(0, 0, data);
return image;
}
BufferImage轉org.bytedeco.javacpp.opencv_core.Mat:
public org.bytedeco.javacpp.opencv_core.Mat bufferedImageToMat(BufferedImage bi) {
OpenCVFrameConverter.ToMat cv = new OpenCVFrameConverter.ToMat();
return cv.convertToMat(new Java2DFrameConverter().convert(bi));
}
