从 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字节)有符号整数,即int
s。 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
矩阵。
我有一个 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字节)有符号整数,即int
s。 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
矩阵。