c++libtorch tensor转CV Mat出现问题


读取原图片正常 调用的模型也是正常的 感觉唯一的问题是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;
}

 

将cv::Mat resultImg(I.size(0), I.size(1), CV_8UC3);改为cv::Mat resultImg(I.size(0), I.size(1), CV_32FC3);试下!望采纳!

不行嗷 各种类型我都试过了

找到问题了 std::memcpy((void*)resultImg.data, I.data_ptr(), sizeof(torch::kU8) * I.numel());

这个函数有问题 但不知道原因在哪