Я хочу сделать ту же функцию на Java openCV, но я застрял в части транспонирования, так как я не нашел никакой реализации в Java Mat, это функция в Python:
def preprocess(im):
# Convert to float32
test_img = im.astype(np.float32)
# Extrapolate image with a small border in order obtain an accurate reshaped image after DUC layer
test_shape = [im.shape[0],im.shape[1]]
cell_shapes = [math.ceil(l / 8)*8 for l in test_shape]
test_img = cv.copyMakeBorder(test_img, 0, max(0, int(cell_shapes[0]) - im.shape[0]), 0, max(0, int(cell_shapes[1]) - im.shape[1]), cv.BORDER_CONSTANT, value=rgb_mean)
test_img = np.transpose(test_img, (2, 0, 1))
# subtract rbg mean
for i in range(3):
test_img[i] -= rgb_mean[i]
test_img = np.expand_dims(test_img, axis=0)
# convert to ndarray
test_img = mx.ndarray.array(test_img)
return test_img
Этомоя реализация в Java:
Mat src, dst = new Mat();
int top, bottom, left, right;
int borderType = Core.BORDER_CONSTANT;
src = Imgcodecs.imread("name", Imgcodecs.IMREAD_COLOR);
int[] shapes = {src.height(),src.width()};
double[] cellShapes = new double[shapes.length];
for (int i = 0; i<shapes.length;i++){
cellShapes[i] = Math.ceil(shapes[0]/8)*8;
}
top = 0;
bottom = Math.max(0,(int)cellShapes[0]-shapes[0]);
left = 0;
right = Math.max(0,(int)cellShapes[1]-shapes[1]);
Scalar value = Core.mean(src);
Core.copyMakeBorder( src, dst, top, bottom, left, right, borderType, value);
/*
transpose stuff
*/
Mat nMat = new Mat();
Core.subtract(dst,value,nMat);
float[] image = new float[(int)((nMat.total())) * nMat.channels()];
dst.get(0,0,image);
Любая помощь, чтобы закончить этот код?