NDArray 是djl的基本数据类型;Mat是javacv的基本数据类型;因此为了达到javacv与djl混合编程的目的,两者(NDArray与Mat)需要相互转换,相互转换代码如下:
public static NDArray matToNDArray(Mat m) {
Loader.load(opencv_java.class);
float[] data = new float[m.channels() * m.rows() * m.cols()];
@SuppressWarnings("resource")
OpenCVFrameConverter.ToOrgOpenCvCoreMat converter1 = new OpenCVFrameConverter.ToOrgOpenCvCoreMat();
org.opencv.core.Mat frame = new org.opencv.core.Mat();
converter1.convertToOrgOpenCvCoreMat(converter1.convert(m)).assignTo(frame, CvType.CV_32FC1);
frame.get(0,0,data);
NDManager manager = NDManager.newBaseManager();
NDArray nd = manager.create(data, new Shape(m.rows(), m.cols()));
nd = nd.divi(255f);
return nd;
}
public static Mat ndarrayToMat(NDArray a) {
Loader.load(opencv_java.class);
org.opencv.core.MatOfFloat fm;
org.opencv.core.Mat reshapem = null;
if(a.getDataType() == DataType.UINT8) {
a = a.div(255f);
fm = new org.opencv.core.MatOfFloat(a.toFloatArray());
reshapem = fm.reshape(1,new int[] {Math.round(a.getShape().get(0)),Math.round(a.getShape().get(1))});
}else {
fm = new org.opencv.core.MatOfFloat(a.toFloatArray());
reshapem = fm.reshape(1,new int[] {Math.round(a.getShape().get(0)),Math.round(a.getShape().get(1))});
}
@SuppressWarnings("resource")
OpenCVFrameConverter.ToMat converter1 = new OpenCVFrameConverter.ToMat();
Mat result = converter1.convert(converter1.convert(reshapem));
return result;
}
本文介绍了如何在JavaCV与DJL混合编程中实现NDArray与Mat之间的转换。这两种数据类型分别是DJL的深度学习操作基础和OpenCV进行计算机视觉处理的基础。通过转换,开发者可以结合两者的优点,实现图像处理与深度学习任务的无缝对接。

1605

被折叠的 条评论
为什么被折叠?



