万屋 2021-05-27 11:52 采纳率: 0%
浏览 233

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;
}
  • 写回答

3条回答 默认 最新

  • 樱花の雨 2021-05-27 13:48
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器