OpenCV C++:使用 converTo 从 CV_32F 转换为 CV8U 会给出意想不到的值
OpenCV C++: Conversion from CV_32F to CV8U using converTo is giving unexpected values
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;
输出为:
-138039790211.54154E-400
我期待这样的输出:
178204184173
我做错了什么?
如果您的垫子现在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]
相关文章:
- 为什么在递归中使用循环会产生意想不到的结果?
- 字符到int8_t转换会产生意想不到的结果?
- 康威的生命游戏帮助我理解这个意想不到的输出
- libc++ 对 std::map/set::equal_range 的实现给出了意想不到的结果
- 微小加密算法实现会产生意想不到的结果
- 使用 std::set 的 .begin() 和 .end() 函数会产生意想不到的结果
- 在我的C++链表实现中取消引用节点指针,给出意想不到的结果
- 为什么 int 到长 long int 的隐式转换在 C++ 中给出了意想不到的答案?
- C++正则表达式Visual Studio Community 2015给出<regex>意想不到的结果
- 打印浮点具有意想不到的价值
- 枚举在Windows上具有意想不到的价值,但在Linux上没有
- istringstream int8_t产生意想不到的结果
- 划分 OpenCV 垫会产生意想不到的结果
- 提升精神,提升任何意想不到的结果
- for 循环中的迭代次数错误.也得到意想不到的输出
- regex_match给出意想不到的结果
- dynamic_pointer_cast意想不到的行为
- C++意想不到的 NaN
- 从 PASCAL 到 C++ 的代码转换给出了意想不到的结果
- OpenCV C++:使用 converTo 从 CV_32F 转换为 CV8U 会给出意想不到的值