从 openCV in/to libtorch 张量 c++ 读取有符号整数

reading signed ints from openCV in/to libtorch tensor c++

我有一个 cv::Mat 是 CV_32SC3 类型,它存储正值和负值。

转换为tensor时,数值乱了:

cout << in_img << endl;

 auto tensor_image = torch::from_blob(in_img.data, {1, in_img.rows, in_img.cols, 3}, torch::kByte);

in_img是负数,打印出来后tensor_image,和in_img完全不同。

负值消失了(它似乎以某种方式将其标准化为 255 范围)。我尝试像这样转换为 Long:

auto tensor_image = torch::from_blob(in_img.data, {1, in_img.rows, in_img.cols, 3}, torch::kLong);

但是当我像这样打印值时,出现段错误:

  std::cout << "tensor_image: " << tensor_image << " values." << std::endl;

所以,我尝试只查看第一个元素,如下所示:

std::cout << "input_tensor[0][0][0][0]: " << tensor_image[0][0][0][0] << " values." << std::endl;

并且该值与我在 python 实现中看到的值不同:((

类型32SC3表示您的数据是32位(4字节)有符号整数,即ints。 Pytorch kByte 类型表示 unsigned char (1 个字节,值介于 0 和 255 之间)。因此,您实际上正在读取一个 int 矩阵,就好像它是一个 uchars 矩阵一样。

试试

auto tensor_image = torch::from_blob(in_img.data, {1, in_img.rows, in_img.cols, 3}, torch::kInt32);

转换为 kLong 注定会失败,因为 long 意味着 int64。因此,您的 opencv int32 矩阵中没有足够的字节来将其读取为具有相同大小的 int64 矩阵。