0

このコードの断片は、NiUserTracker という OpenNI サンプルから取得したものです。

//... some codes...

#define XN_CALIBRATION_FILE_NAME "UserCalibration.bin"

// Save calibration to file
void SaveCalibration()
{
    XnUserID aUserIDs[20] = {0};
    XnUInt16 nUsers = 20;
    g_UserGenerator.GetUsers(aUserIDs, nUsers);
    for (int i = 0; i < nUsers; ++i)
    {
        // Find a user who is already calibrated
        if (g_UserGenerator.GetSkeletonCap().IsCalibrated(aUserIDs[i]))
        {
            // Save user's calibration to file
            g_UserGenerator.GetSkeletonCap().SaveCalibrationDataToFile(aUserIDs[i], XN_CALIBRATION_FILE_NAME);
            break;
        }
    }
}

//... some codes ...
//... some codes ...

 void glutKeyboard (unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27:
            CleanupExit();

        //... some codes...

        case 'S':
            SaveCalibration();
            break;
        case 'L':
            LoadCalibration();
            break;
        }
    }

Shift+s または S (Caps Lock をオンにして) を押しても、「UserCalibration.bin」が生成されません。ハード ドライブ全体を検索しましたが、そのようなファイルは見つかりませんでした。その後、OpenNI フォルダーから「読み取り専用」プロパティを無効にします。NiUserTracker.exe を実行すると、コンソールはエラーを報告しません。

私は、キャリブレーションに少し時間がかかるオンライン キャリブレーションに最も満足しています。ユーザーがキャリブレーションしたファイルをロードすることで、このプロセスをより迅速に行うことができると思いました。

この「UserCalibration.bin」ファイルを生成できないのはなぜですか? Win7 64 ビットと 64 ビット OpenNI、および Visual Studio 2010 Ultimate (本学が研究目的で提供) を使用しています。

大変感謝しています。

よろしく、イケル

4

1 に答える 1

1

2つの異なる構成で簡単なテストを行いました。

  1. osx10.6.8とOpenNIdev64ビット(OpenNI1.5.2.7、Nite1.5.2.7、avin2 SensorKinect5.0.5.2)
  2. OpenNI dev32ビットを搭載したWinXPSP3(OpenNI1.5.4.0、Nite1.5.2.21、avin2 SensorKinect5.1.2.1)

許可の問題のようには見えません。SaveCalibration関数を少し変更しました。

// Save calibration to file
void SaveCalibration()
{
    XnUserID aUserIDs[20] = {0};
    XnUInt16 nUsers = 20;
    g_UserGenerator.GetUsers(aUserIDs, nUsers);
    for (int i = 0; i < nUsers; ++i)
    {
        // Find a user who is already calibrated
        if (g_UserGenerator.GetSkeletonCap().IsCalibrated(aUserIDs[i]))
        {
            // Save user's calibration to file
                        XnStatus saveStatus = g_UserGenerator.GetSkeletonCap().SaveCalibrationDataToFile(aUserIDs[i], XN_CALIBRATION_FILE_NAME);
                        std::cout << "saveStatus: " << saveStatus << std::endl;
                        if(saveStatus == XN_STATUS_OK) std::cout << "calibration saved to file" << std::endl;
                        if(saveStatus == XN_STATUS_NOT_IMPLEMENTED) std::cout << "not implemented, calibration wasn't saved" << std::endl;
            break;
        }
    }
}

osxではSTATUS_OKがありますが、WindowsではXN_STATUS_NOT_IMPLEMENTED(値65550)です。OpenNIグループで面白い投稿を見つけました。100%確信はありませんが、新しいバージョンではSaveCalibrationDataToFileが非推奨になる可能性があるようです。キャリブレーションにpsi(Ψ)ポーズが不要になったため、これはある程度意味があります。

古いバージョンに戻してみてください。私がosxで使用しているOpenNI構成は機能します(キャリブレーションファイルを保存しますが、このバージョンでは、psi(Ψ)ポーズを必要とせずにスケルトンを追跡することもできます)。

HTH

于 2012-09-21T22:54:26.443 に答える