今天在执行libtorch程序的时候,有如下两句:
cv::Mat img_patch = img_float(cv::Range(pos[0], pos[1]), cv::Range(pos[2], pos[3])); // img_patch为img_float的sub image
at::Tensor image_tensor = torch::from_blob(img_patch.data, {img_patch.rows, img_patch.cols, 3}, torch::kFloat32);
作用是从cv::Mat构建libtorch的tensor patch,超分结果一直不对,逐步log排查后,发现是img_patch的step仍旧与img_float的step一致,造成图像花屏,需要clone:
cv::Mat img_patch = img_float(cv::Range(pos[0], pos[1]), cv::Range(pos[2], pos[3])).clone(); // img_patch为img_float的sub image
at::Tensor image_tensor = torch::from_blob(img_patch.data, {img_patch.rows, img_patch.cols, 3}, torch::kFloat32);
再简单提醒一下clone的作用:
cv::Mat::clone()是cv:;Mat最直接的拷贝、复制方法,用"="号的结果就是内存不独立的,图像Image和拷贝图像copyImage在内存中只有一个,容易造成混乱。