4

次の C++ コードは、Kinect 2 から最新のフレームを継続的に取得します。

int main()
{
    setupKinect();
    acquireFrames();  
    return 0;
}

template<class Interface>
inline static void safeRelease(Interface *&interfaceToRelease)
{
    if (interfaceToRelease != nullptr) {
        interfaceToRelease->Release();
        interfaceToRelease = nullptr;
    }
}

void acquireFrames() {
    while (true) {
        if (bodyFrameReader != nullptr) {
            IBodyFrame* bodyFrame = nullptr;
            HRESULT hr = bodyFrameReader->AcquireLatestFrame(&bodyFrame);
            if (SUCCEEDED(hr)) {
                // processing bodyFrame 
            } else {    
                // acquiring frame failed   
            }
            safeRelease(bodyFrame);
        }
    }
}

void setupKinect() {
    IKinectSensor * sensor = nullptr;
    HRESULT hr = GetDefaultKinectSensor(&sensor);
    if (SUCCEEDED(hr)) {
        hr = sensor->Open();
        if (SUCCEEDED(hr)) {
            IBodyFrameSource* bodyFrameSource = nullptr;
            hr = sensor->get_BodyFrameSource(&bodyFrameSource);
            if (SUCCEEDED(hr)) {
                hr = bodyFrameSource->OpenReader(&bodyFrameReader);

            }
            safeRelease(bodyFrameSource);
        }
    }
    safeRelease(sensor);
}

AcquireLatestFrameほとんどの場合、失敗した HRESULT が返されるのはなぜですか? 一部のテストでは、関数が 1 秒間に約 30 回しか成功しないことが明らかになったため、この関数によって特定のフレームが取得/返されるのは多くても 1 回と思われます (Kinect フレームレートは 30 fps です)。これは正しいですか?

4

1 に答える 1

1

はい、あなたは正しいです。

出典: ここの表の「深度センシング」の下にある「30hz」を参照してください: (少し下にスクロールする必要がある場合があります)

https://developer.microsoft.com/en-us/windows/kinect/hardware

関数のドキュメントには次のように書かれています。

戻り値

タイプ: HRESULT

成功した場合は S_OK を返します。それ以外の場合は、失敗コードを返します。

(ソース: https://msdn.microsoft.com/en-us/library/microsoft.kinect.kinect.ibodyframereader.acquirelatestframe.aspx )

ほとんどの場合に返される失敗の HRESULT コードは E_PENDING です。これは、新しいフレームがまだ準備できていないことを意味します。


あなたの質問に答えるには: AcquireLatestFrame が最も頻繁に失敗した HRESULT を返すのはなぜですか?

同じ入力データを複数回処理する必要がないためです (同じ結果を何度も計算することで、CPU 時間を浪費するだけです)。

于 2016-09-07T22:49:33.233 に答える