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;
}