У меня есть animesr.onnx для моего приложения ios/macos со сверхвысоким разрешением, поэтому мне нужно преобразовать коды Python в коды C++. Это мои коды Python:
session = onnxruntime.InferenceSession('animesr.onnx') img = cv2.imread('imgs/naruto.jpg') ori_h, ori_w, _ = img.shape img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (512,512)) img = (np.array(img)/255.0).astype(np.float32) img = np.transpose(img, (2, 0, 1)) img = np.expand_dims(img, 0) input_name = session.get_inputs()[0].name имя_выхода = session.get_outputs()[0].имя input_feed = {input_name: img} вывод = session.run([имя_выхода], входной_канал) вывод = вывод[0].клип(0, 1) * 255 вывод = вывод.astype(np.uint8) вывод = np.squeeze(выход) вывод = np.transpose(выход, (1, 2, 0)) вывод = cv2.cvtColor(выход, cv2.COLOR_RGB2BGR) вывод = cv2.resize(вывод, (ori_w*4, ori_h*4)) cv2.imwrite('naruto_animesr.jpg', вывод) Все работает нормально, результат такой (слева до, справа после)

А это мои коды на C++:
Ort::Session session(env, ORT_TSTR(modelPath), sessionOptions); cv::Mat inputImage = cv::imread(imagePath, cv::IMREAD_COLOR); // cv::Mat blob = cv::dnn::blobFromImage(inputImage, 1.0/255, cv::Size(512,512), cv::Scalar(), true); cv::Mat resizedImage; cv::resize(inputImage, resizedImage, cv::Size(512,512)); cv::Mat floatImage; resizedImage.convertTo(floatImage, CV_32FC3, 1.0/255.0); Ort::MemoryInfo MemoryInfo = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); std::vector inputShape = {1, 3, 512, 512}; Ort::Value inputTensor = Ort::Value::CreateTensor(memoryInfo, (float*) floatImage.data, 3*512*512, inputShape.data(), inputShape.size()); std::vector inputNames = {"input"}; std::vector outputNames = {"output"}; std::vector outputTensor = session.Run(Ort::RunOptions{}, inputNames.data(), &inputTensor, 1, outputNames.data(), outputNames.size()); Ort::TensorTypeAndShapeInfo outputInfo = outputTensor[0].GetTensorTypeAndShapeInfo(); int каналы = outputInfo.GetShape()[1]; // 3 int height = outputInfo.GetShape()[2]; // 2048 int width = outputInfo.GetShape()[3]; // 2048 const float* outputData = outputTensor[0].GetTensorMutableData(); cv::Mat outputImage(height, width, CV_32FC(каналы), const_cast(outputData)); резюме::Mat uint8Image; outputImage.convertTo(uint8Image, CV_8UC3, 255); резюме::Mat bgrOutput; cv::cvtColor(uint8Image, bgrOutput, cv::COLOR_RGB2BGR); cv::imwrite(outputPath, bgrOutput); Это результат

и это результат cv::ddn::blobFromImage()

Оба результата — отстой, в отличие от моего результата на Python.
Я считаю, что проблема заключается в предварительной обработке изображения в качестве входных данных перед запуском модели и обработке выходных данных в виде изображения CV. Я плохо разбираюсь в операциях с матрицами, таких как преобразование, транспонирование, изменение формы и т. д.
Можете ли вы, ребята, помочь мне предоставить правильные коды обработки изображений с помощью opencv C++
Спасибо