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

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

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

非常感激。

问候, 伊克尔

4

1 回答 1

1

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

  1. osx 10.6.8 与 OpenNI 开发 64 位(OpenNI1.5.2.7,Nite1.5.2.7,avin2 SensorKinect5.0.5.2)
  2. WinXP SP3 with OpenNI dev 32bit (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 group 上发现了一篇有趣的帖子。我不是 100% 确定,但听起来 SaveCalibrationDataToFile 可能在较新的版本中被弃用。这是有道理的,因为校准不再需要 psi(Ψ) 姿势。

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

高温高压

于 2012-09-21T22:54:26.443 回答