【问题标题】:reading signed ints from openCV in/to libtorch tensor c++从openCV中读取签名的整数/到libtorch张量c ++
【发布时间】:2021-02-20 21:06:45
【问题描述】:

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

将其转换为张量时,值混乱:

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实现中看到的不一样:((

【问题讨论】:

  • 澄清一下,在上面的例子中,in_img 的类型是cv::Mat?
  • 是的,普拉纳夫。这是正确的。当我使用 at::kByte 读取它时,一切都很好.. 期望值似乎是按比例缩放的,这是我不想要的(我想要包含 + 和 - 值的原始 mat 矩阵)

标签: c++ pytorch libtorch


【解决方案1】:

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

【讨论】:

  • OMG - 说真的,天才的东西.. 非常感谢。我自己永远不会想到这一点:rolling_eyes ps:爱你的身份证。
猜你喜欢
  • 2019-02-02
  • 2017-11-02
  • 2015-07-15
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多