我正在使用Kinect传感器的深度数据,这是一个16位无符号整数数组。为了摆脱一些残缺的信息,我需要将一个像素的内容向左移位。我收到的结果太小了,很奇怪(例如,打印出来的数字应该是~400,因为它是以毫米为单位的距离,但我得到数字0-30)。
castedBuffer = (uchar*)internalFrameArray->constData();
std::cout << (int)((unsigned short int)castedBuffer[307000]>>3) << "\n";
我很挣扎,因为我以(uchar *)格式(8位)获取数据,而我的理论是位移仅应用于16位数的一半。
我有点迷失了!
答案 0 :(得分:1)
根据Mat的评论,castedBuffer[307000]
是unsigned char
。如果您希望从castedBuffer
中获取16位值,则需要同时访问castedBuffer[306999]
和castedBuffer[307000]
,假设该值为big-endian编码(请参阅{{ 3}})。
这是一个关于如何从数组中提取16位值的大端示例(假设您需要3位左移):
castedBuffer = reinterpret_cast<unsigned char*>(internalFrameArray->data());
unsigned short int extractedValue = static_cast<unsigned short int>(
((castedBuffer[306999] << 5) & 0xff60) |
(castedBuffer[307000] >> 3));
答案 1 :(得分:1)
Qt有一个QDataStream类,它正是你想要的:字节顺序转换和从QByteArray中提取任意宽度的整数。这是如何做到的:
#include <QtCore/QByteArray>
#include <QtCore/QDataStream>
#include <QtCore/QDebug>
void test(QByteArray internalFrameArray)
{
QDataStream str(&internalFrameArray);
str.setByteOrder(QDataStream::LittleEndian);
// the above must match endianness in the Kinect data stream
str.skipRawData(306999);
quint16 val;
str >> val;
qDebug() << val>>3;
}