OpenCV C ++: преобразование из CV_32F в CV8U с использованием convertTo дает неожиданные значения

0
cv::Mat x(2,2,CV_32F);
x.at<float>(0,0)=0.7;
x.at<float>(0,1) = 0.8;
x.at<float>(1,0) = 0.72;
x.at<float>(1,1) = 0.68;
x.convertTo( x, CV_8U, 255, 0  );
std::cout << x.at<int>(0,0)  << std::endl;
std::cout << x.at<int>(0,1)  << std::endl;
std::cout << x.at<float>(1,0)  << std::endl; // I deliberately put <float> just to see what happens
std::cout << x.at<int>(1,1)  << std::endl;

Выход:

-1380397902 1 1.54154e-40 0

Я ожидал выхода вроде:

178 204 184 173

Что я делаю не так?

  • 1
    С каких пор С ++ 1 индексируется?
  • 0
    Виноват. Я исправил вопрос.
Теги:
opencv

1 ответ

3
Лучший ответ

если ваш Mat теперь CV_8U, вам нужно будет получить к нему доступ как

x.at<uchar>(1,1)

следующая проблема будет печатать номер правильно, cout, увидев символ, попытается напечатать письмо, поэтому вам придется отдать его int:

std::cout << int(x.at<uchar>(0,0))  << std::endl;

тогда, если ваш мат равен 2x2, вы не можете получить доступ к элементу на 2,2, это выходит за рамки и приведет к UB. !

(в c++ мы индексируем от 0..n-1, справа?)

так, здесь, скорректированный пример:

cv::Mat x(2,2,CV_32F);
x.at<float>(0,0)=0.7;
x.at<float>(1,0) = 0.8;
x.at<float>(0,1) = 0.72;
x.at<float>(1,1) = 0.68;
Mat y;

x.convertTo( y, CV_8U, 255, 0  );
cout << int(y.at<uchar>(0,0))  << std::endl;
cout << int(y.at<uchar>(1,0))  << std::endl;
cout << int(y.at<uchar>(0,1))  << std::endl;
cout << int(y.at<uchar>(1,1))  << std::endl;

cerr << x << endl;
cerr << y << endl;

178
204
184
173
[0.69999999, 0.72000003;
  0.80000001, 0.68000001]
[178, 184;
  204, 173]

  • 0
    Спасибо Берак за очень полезный ответ! Я принимал вещи, которые я не должен. Вот публикация, которая показывает, какие другие типы данных связаны с какими другими типами OpenCV. stackoverflow.com/questions/13484475/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню