我有一个浮点矩阵a,我想在点(x,y)访问该元素,但我想将数据类型转换为unsigned char。点(x,y)的浮点数为652.759
我想使用的代码(基于Opencv)是
a.at<uchar>(Point(x,y))
上述代码的结果是68。
但是当我用简单的c ++代码检查结果时
static_cast<unsigned char>(a.at<float>(Point(x,y)))
结果是140.
任何人都知道为什么?如何使用上面的代码获得相同的结果?
THX!
答案 0 :(得分:2)
xmllint --sax file.xml
函数对于每个点的位数是不可知的,并且基于所提供的模板类型进行判断。
因此,at()
将从数组的第4个字节开始返回一个由32位范围组成的浮点数,而at<float>(2)
将只返回数组中的第二个字节。
例如,以下
at<uchar>(2)
产生
Mat m(10, 1, CV_8U);
m.at<uchar>(0) = 44;
m.at<uchar>(1) = 1;
m.at<uchar>(2) = 0;
m.at<uchar>(3) = 0;
cout << "char 0 : " << (int)m.at<uchar>(0) << endl;
cout << "char 1 : " << (int)m.at<uchar>(1) << endl;
cout << "short 0 : " << (int)m.at<unsigned short>(0) << endl;
char 0 : 44
char 1 : 1
short 0 : 300
= short 0
* char 1
+ 256
答案 1 :(得分:1)
它与此代码的区别基本相同:
float f = 140.f;
unsigned char c = static_cast<unsigned char>(f); // c is 140, this is ok
unsigned char wrong = *((unsigned char*)&f); // this is wrong
最后一行与您代码中的a.at<uchar>(Point(x,y))
相同。这是错误的,因为它访问float
并将其(其字节)重新解释为unsigned char
。二进制值没有实际转换。