0

16 ビットの符号なし整数配列である Kinect センサーからの深度データで遊んでいます。粗雑な情報を取り除くために、1 ピクセルの内容を左に 3 ビット シフトする必要があります。私が受け取った結果は小さすぎて奇妙です (たとえば、出力される数値はミリメートル単位の距離であるため、~400 のはずですが、0 から 30 の数値が得られます)。

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

(uchar*) 形式 (8 ビット) でデータを取得するため、苦労しています。私の理論では、ビット シフトは 16 ビット数の半分にしか適用されていません。

私は少し迷っています!

4

2 に答える 2

1

マットのコメントによるcastedBuffer[307000]と、unsigned char. から 16 ビット値を取得する場合は、値がビッグエンディアンでエンコードされていると仮定して、とのcastedBuffer両方にアクセスする必要があります( http://en.wikipedia.org/wiki/Endiannessを参照)。castedBuffer[306999]castedBuffer[307000]

配列から 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 には、エンディアン変換と QByteArray からの任意の幅の整数の抽出など、まさにあなたが望むことを行う QDataStream クラスがあります。方法は次のとおりです。

#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 に答える