0

我正在使用来自 Kinect 传感器的深度数据,这是一个 16 位无符号整数数组。为了摆脱一些杂乱无章的信息,我需要将一个像素的内容向左移动三个。我收到的结果太小而且很奇怪(例如,打印出来的数字应该是 ~400,因为它是以毫米为单位的距离,但我得到的数字是 0-30)。

castedBuffer = (uchar*)internalFrameArray->constData();
std::cout << (int)((unsigned short int)castedBuffer[307000]>>3) << "\n";

我很挣扎,因为我以 (uchar*) 格式(8 位)输出数据,我的理论是位移仅应用于 16 位数字的一半。

我有点失落!

4

2 回答 2

1

根据 Mat 的评论,castedBuffer[307000]是一个unsigned char. 如果要从 中获取 16 位值,则castedBuffer需要同时访问castedBuffer[306999]castedBuffer[307000],假设该值是大端编码的(请参阅http://en.wikipedia.org/wiki/Endianness)。

这是一个大端示例,说明如何从数组中提取 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));
于 2012-06-14T16:20:13.430 回答
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;  
}
于 2012-06-14T17:27:21.743 回答