C++ .at<;乌查尔>;和静态_cast<;乌查尔>;在opencv中?
我有一个浮点矩阵a,我想访问点(x,y)处的元素,但我想将数据类型转换为无符号字符。点(x,y)中的浮点数为652.759 我想要使用的代码(基于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.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。。。