Как мне создать файл UserCalibration.bin, как указано в примере OpenNI — NiUserTracker

Этот фрагмент кода был взят из примера OpenNI под названием NiUserTracker

//... 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-битную Win7 с 64-битным OpenNI и Visual Studio 2010 Ultimate (предоставлены нашим университетом для исследовательских целей).

Высоко ценится.

С Уважением,
Икел

0

Решение

Я только что сделал быстрый тест с двумя различными конфигурациями:

  1. OSX 10.6.8 с OpenNI dev 64bit (OpenNI1.5.2.7, Nite1.5.2.7, avin2 SensorKinect5.0.5.2)
  2. WinXP SP3 с 32-разрядной версией OpenNI (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;
}
}
}

У меня есть STATUS_OK на OSX, но XN_STATUS_NOT_IMPLEMENTED (значение 65550) на Windows. Я нашел интересный пост по группе OpenNI. Я не уверен на 100%, но это звучит как
SaveCalibrationDataToFile может быть устаревшим в более новых версиях. Это имело бы смысл, так как поза пси (s) больше не требуется для калибровки.

Попробуйте вернуться к более старой версии. Конфигурация OpenNI, которую я использую на osx, работает (сохраняет файл калибровки, но эта версия также может отслеживать скелет, не требуя позы psi (Ψ)).

НТН

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]