1、 cv::Mat to tensor
void Preprocess(cv::Mat& src, torch::Tensor& input, cv::Scalar mean, float scalor)
{
	cv::Mat img_float;
	src.convertTo(img_float, CV_32F);
	img_float -= mean;
	if (std::abs(1.0f - scalor) > 0.001)
	{
		img_float *= scalor;
	}

	input = torch::zeros({ src.rows, src.cols, src.channels() });
    // 拷贝避免了作用域问题，需要注意的是cv::Mat要是连续的，即stride=width*channels
	memcpy(input.data_ptr(), img_float.data, input.numel() * sizeof(float));
	input = input.permute({ 2, 0, 1 });
	return;
}

2、 tensor to Mat
// 假定你使用的是分割网络，即最后一层的输出 是： N * C * H * W的float类型的tensor
// 参见 下面的代码片段
auto out = seg_net->forward(inputs).toTensor();
auto y = torch::argmax(out, 1);
y = y * 255;
y = y.to(torch::kByte).cpu().contiguous();

std::vector<cv::Mat> vm;
for (int i = 0; i < y.size(0); i++)
{
	auto yo = y[i];
	uchar* data = (uint8_t*)(yo.data_ptr());
    //注意这里的data的作用域
	cv::Mat mr(mtParam.seg_roi.height, mtParam.seg_roi.width, CV_8UC1, data);
}