![](/img/trans.png)
[英]Is there a way of storing Opencv/javacv Mat objects in a database?
[英]OpenCV Mat to JavaCV Mat conversion
在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));
您可以使用 java.awt.image.BufferedImage 作為接口。
只需將您的org.opencv.core.Mat對象轉換為java.awt.image.BufferedImage ,然后將結果對象轉換為org.bytedeco.javacpp.opencv_core.Mat 。
現在,這些是您需要的功能:
1) 將 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;
}
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));
}
確保擁有所有必要的罐子和進口。
您可以更深入地研究 JNI 的內容,但對於測試用例,這應該足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.