在https://github.com/bytedeco/javacpp/issues/38#issuecomment-140728812上有一种更简单、更高效的方法,简而言之:
对于JavaCPP / JavaCV:
Mat mat2 = new Mat((Pointer)null) { { address = mat.getNativeObjAddr(); } };
访问OpenCV的官方Java API:
Mat mat = new Mat(mat2.address());
编辑:OpenCVFrameConverter 现在提供了一种更简单、更安全的方法来实现这一点,例如:
OpenCVFrameConverter.ToMat converter1 = new OpenCVFrameConverter.ToMat();
OpenCVFrameConverter.ToOrgOpenCvCoreMat converter2 = new OpenCVFrameConverter.ToOrgOpenCvCoreMat();
Mat mat = ...;
org.opencv.core.Mat cvmat = converter2.convert(converter1.convert(mat));
Mat mat2 = converter2.convert(converter1.convert(cvmat));
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;
}
2)将java.awt.image.BufferedImage转换为org.bytedeco.javacpp.opencv_core.Mat:
public Mat bufferedImageToMat(BufferedImage bi) {
OpenCVFrameConverter.ToMat cv = new OpenCVFrameConverter.ToMat();
return cv.convertToMat(new Java2DFrameConverter().convert(bi));
}
请确保拥有所有必要的JAR文件和导入项。
你可以深入研究JNI相关内容,但对于测试用例来说,这应该已经足够了。
javacv
中没有像opencv_core.Mat..get(0, 0, data);
这样的方法!! - user924
Mat.dataAddr()
的长结果转换为bytedeco指针,以便您可以将其传递给bytedeco Mat构造函数。 - Bull