我应该如何在OpenNI示例 - NiUserTracker中指示生成UserCalibration.bin文件

时间:2012-09-17 02:01:26

标签: c++ windows visual-studio-2010 openni

这段代码取自名为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(打开大写锁定)时,它不会生成“UserCalibration.bin”。我完全搜索了我的硬盘,没有找到这样的文件。之后,我从OpenNI文件夹中禁用“只读”属性。 当我执行NiUserTracker.exe时,控制台不会报告任何错误。

我最满意的是在线校准,这需要花一点时间进行校准,我认为通过加载用户校准的文件可以更快地完成此过程。

有些人可能指出我正确的方向,为什么我无法生成这个“UserCalibration.bin”文件?我使用64位OpenNI的Win7 64位和Visual Studio 2010 Ultimate(由我们大学提供用于研究目的)。

非常感谢。

此致 ikel

1 个答案:

答案 0 :(得分:1)

我刚刚用两种不同的配置进行了快速测试:

  1. osx 10.6.8,OpenNI开发64位(OpenNI1.5.2.7,Nite1.5.2.7,avin2 SensorKinect5.0.5.2)
  2. WinXP SP3,OpenNI开发32位(OpenNI1.5.4.0,Nite1.5.2.21,avin2 SensorKinect5.1.2.1)
  3. 它看起来不像是权限问题。我稍微修改了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)。我找到了interesting post on the OpenNI group。我不是百分百肯定,但听起来像 SaveCalibrationDataToFile可能在较新版本中已弃用。这有点意义,因为校准不再需要psi(Ψ)姿势。

    尝试恢复旧版本。我在osx上使用的OpenNI配置工作(保存校准文件,但此版本也可以跟踪骨架而不需要psi(Ψ)姿势)。

    HTH