opencv中.at <uchar>和static_cast <uchar>之间的区别?

时间:2015-08-05 23:12:02

标签: c++ opencv

我有一个浮点矩阵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!

2 个答案:

答案 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。二进制值没有实际转换。