чтение подписанных ints из openCV в / в тензор libtorch c ++

У меня есть 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);

но когда я печатаю такие значения, я получаю ошибку seg:

  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: ((


person JohnJ    schedule 20.02.2021    source источник
comment
Чтобы уточнить, в приведенном выше примере in_img имеет тип cv::Mat?   -  person Pranav Vempati    schedule 20.02.2021
comment
да Пранав. верно. Когда я использую at :: kByte для чтения, все в порядке ... ожидайте, что значения кажутся масштабированными, чего я не хочу (мне нужна исходная матрица матов, которая содержит как +, так и - значения)   -  person JohnJ    schedule 20.02.2021


Ответы (1)


Тип 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 матрицу того же размера.

person trialNerror    schedule 20.02.2021
comment
OMG - серьезно, гениальный материал .. Большое спасибо. Я бы никогда не понял этого сам: Rolling_eyes ps: люблю свой id. - person JohnJ; 20.02.2021