C++ .at<;乌查尔>;和静态_cast<;乌查尔>;在opencv中?

C++ .at<;乌查尔>;和静态_cast<;乌查尔>;在opencv中?,c++,opencv,C++,Opencv,我有一个浮点矩阵a,我想访问点(x,y)处的元素,但我想将数据类型转换为无符号字符。点(x,y)中的浮点数为652.759 我想要使用的代码(基于Opencv)是 a.at(点(x,y)) 上述代码的结果是68 但是用简单的C++代码< /P>检查结果 static_cast<unsigned char>(a.at<float>(Point(x,y))) static_cast(a.在(x,y)点) 结果是140 有人知道为什么吗?如何使用上述两个代码获得相

我有一个浮点矩阵a,我想访问点(x,y)处的元素,但我想将数据类型转换为无符号字符。点(x,y)中的浮点数为652.759

我想要使用的代码(基于Opencv)是

a.at(点(x,y))
上述代码的结果是68

<>但是用简单的C++代码< /P>检查结果
    static_cast<unsigned char>(a.at<float>(Point(x,y)))
static_cast(a.在(x,y)点)
结果是140

有人知道为什么吗?如何使用上述两个代码获得相同的结果


谢谢

与此代码基本相同:

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
float f=140.f;
无符号字符c=静态_转换(f);//c是140,这没问题
无符号字符错误=*((无符号字符*)&f);//这是错误的

最后一行与代码中的
a(点(x,y))
相同。这是错误的,因为它访问
浮点
,并将其(字节)重新解释为
无符号字符
。二进制值没有实际的转换。

与此代码基本相同:

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
float f=140.f;
无符号字符c=静态_转换(f);//c是140,这没问题
无符号字符错误=*((无符号字符*)&f);//这是错误的

最后一行与代码中的
a(点(x,y))
相同。这是错误的,因为它访问
浮点
,并将其(字节)重新解释为
无符号字符
。二进制值没有实际的转换。

与此代码基本相同:

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
float f=140.f;
无符号字符c=静态_转换(f);//c是140,这没问题
无符号字符错误=*((无符号字符*)&f);//这是错误的

最后一行与代码中的
a(点(x,y))
相同。这是错误的,因为它访问
浮点
,并将其(字节)重新解释为
无符号字符
。二进制值没有实际的转换。

与此代码基本相同:

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
float f=140.f;
无符号字符c=静态_转换(f);//c是140,这没问题
无符号字符错误=*((无符号字符*)&f);//这是错误的
最后一行与代码中的
a(点(x,y))
相同。这是错误的,因为它访问
浮点
,并将其(字节)重新解释为
无符号字符
。二进制值没有实际转换。

at()函数不知道每个点的位数,并根据提供的模板类型进行判断

因此,
at(2)
将返回一个由32位组成的浮点值,从数组的第四个字节开始,而
at(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;
short 0
=
char 1
*
256
+
char 0

函数不知道每个点的位数,并根据提供的模板类型进行判断

因此,
at(2)
将返回一个由32位组成的浮点值,从数组的第四个字节开始,而
at(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;
short 0
=
char 1
*
256
+
char 0

函数不知道每个点的位数,并根据提供的模板类型进行判断

因此,
at(2)
将返回一个由32位组成的浮点值,从数组的第四个字节开始,而
at(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;
short 0
=
char 1
*
256
+
char 0

函数不知道每个点的位数,并根据提供的模板类型进行判断

因此,
at(2)
将返回一个由32位组成的浮点值,从数组的第四个字节开始,而
at(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;

short 0
=
char 1
*
256
+
char 0

这个
at
函数看起来像什么?@BaummitAugen“at”是opencv中的内置函数。它只用于在一个点上获取元素。但是我不知道opencv源代码是如何转换数据类型的……这个
at
函数是什么样子的?@BaummitAugen“at”是opencv中的内置函数。它只用于在一个点上获取元素。但是我不知道opencv源代码是如何转换数据类型的……这个
at
函数是什么样子的?@BaummitAugen“at”是opencv中的内置函数。它只用于在一个点上获取元素。但是我不知道opencv源代码是如何转换数据类型的……这个
at
函数是什么样子的?@BaummitAugen“at”是opencv中的内置函数。它只用于在一个点上获取元素。但是我不知道opencv的源代码是如何转换数据类型的……谢谢你的回答。但是当我把数字652.759插入到你提供的错误代码中时,我得到了147而不是68…实际上,68是我的情况下需要的数字(即使它是错误的),我希望用C++代码实现它而不需要OpenCV…我的问题还有其他可能的解决办法吗??谢谢!谢谢你的回答。但是当我把数字652.759插入到你提供的错误代码中时,我得到了147而不是68…实际上,68是我的情况下需要的数字(即使它是错误的),我希望用C++代码实现它而不需要OpenCV…我的问题还有其他可能的解决办法吗??谢谢!谢谢你的回答。但是当我把652.759插入你提供的错误代码时,我得到的是147而不是68。。。