读取原图片正常 调用的模型也是正常的 感觉唯一的问题是opencv的问题 但不知道原因在哪 拜托各位大佬指点
Tensor Mat_To_Tensor(Mat Img)
{
Tensor output;
//transform channels
cv::cvtColor(Img, Img, cv::COLOR_BGR2RGB);
Img.convertTo(Img, CV_32FC3, 1.0 / 255.0, 0); //transform type 图像大小没有变化,但是类型由UINT8变为了FLOAT32位 归一化
//opencv format H*W*C
torch::TensorOptions option(torch::kFloat32);
Tensor img_tensor = torch::from_blob(Img.data, { 1,Img.rows, Img.cols, Img.channels() }, option);// opencv H x W x C torch C x H x W
img_tensor = img_tensor.toType(torch::kFloat).to(torch::kCPU);
if (img_tensor.size(1) % 8 != 0)
{
int g = img_tensor.size(1);
while (g % 8 != 0) g -= 1;
img_tensor = img_tensor.narrow(1, 0, g);
}
if (img_tensor.size(2) % 8 != 0)
{
int h = img_tensor.size(2);
while (h % 8 != 0) h -= 1;
img_tensor = img_tensor.narrow(2, 0, h);
}
//libtorch format N*C*H*W
img_tensor = img_tensor.permute({ 0, 3, 1, 2 }).toType(torch::kFloat32).to(torch::kCPU);
output = img_tensor.clone(); //.clone can't delet
return output;
}
Mat Tensor_To_Mat(Tensor I)
{
I = I.squeeze(0).detach().permute({ 1, 2, 0 }); //detach从当前计算图中完全剥离下来
I = I.mul(255).clamp(0, 255).toType(torch::kU8).to(torch::kCPU);
I = I.to(torch::kCPU);
// H W C
cv::Mat resultImg(I.size(0), I.size(1), CV_8UC3);
std::memcpy((void*)resultImg.data, I.data_ptr(), sizeof(torch::kU8) * I.numel()); //key code
cv::cvtColor(resultImg, resultImg, COLOR_RGB2BGR);
return resultImg;
}