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
Что я делаю не так?
если ваш 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]