Salve a tutti, sono Luca.
La faccio breve: ho scaricato le librerie OpenNI2 e NiTE2 per Kinect per un progetto. Per provare a creare un nuovo progetto (usando Visual Studio 2012) ho seguito la guida di OpenNI2, tutto ok fin qui. Ho poi copiato e incollato il codice di un sample fornito dalla PrimeSense per vedere se andava tutto bene e in effetti, dopo aver inserito le librerie necessarie, il codice era pulito, senza segni rossi per intenderci. Di seguito riporto il codice del sample:
#include "OpenNI.h"
#include "NiTE.h"
#include "../Common/NiteSampleUtilities.h"
#define MAX_USERS 10
bool g_visibleUsers[MAX_USERS] = {false};
nite::SkeletonState g_skeletonStates[MAX_USERS] = {nite::SKELETON_NONE};
#define USER_MESSAGE(msg) \
{printf("[%08llu] User #%d:\t%s\n",ts, user.getId(),msg);}
void updateUserState(const nite::UserData& user, unsigned long long ts)
{
if (user.isNew())
USER_MESSAGE("New")
else if (user.isVisible() && !g_visibleUsers[user.getId()])
USER_MESSAGE("Visible")
else if (!user.isVisible() && g_visibleUsers[user.getId()])
USER_MESSAGE("Out of Scene")
else if (user.isLost())
USER_MESSAGE("Lost")
g_visibleUsers[user.getId()] = user.isVisible();
if(g_skeletonStates[user.getId()] != user.getSkeleton().getState())
{
switch(g_skeletonStates[user.getId()] = user.getSkeleton().getState())
{
case nite::SKELETON_NONE:
USER_MESSAGE("Stopped tracking.")
break;
case nite::SKELETON_CALIBRATING:
USER_MESSAGE("Calibrating...")
break;
case nite::SKELETON_TRACKED:
USER_MESSAGE("Tracking!")
break;
case nite::SKELETON_CALIBRATION_ERROR_NOT_IN_POSE:
case nite::SKELETON_CALIBRATION_ERROR_HANDS:
case nite::SKELETON_CALIBRATION_ERROR_LEGS:
case nite::SKELETON_CALIBRATION_ERROR_HEAD:
case nite::SKELETON_CALIBRATION_ERROR_TORSO:
USER_MESSAGE("Calibration Failed... :-|")
break;
}
}
}
int main(int argc, char** argv)
{
nite::UserTracker userTracker;
nite::Status niteRc;
nite::NiTE::initialize();
niteRc = userTracker.create();
if (niteRc != nite::STATUS_OK)
{
printf("Couldn't create user tracker\n");
return 3;
}
printf("\nStart moving around to get detected...\n(PSI pose may be required for skeleton calibration, depending on the configuration)\n");
nite::UserTrackerFrameRef userTrackerFrame;
while (!wasKeyboardHit())
{
niteRc = userTracker.readFrame(&userTrackerFrame);
if (niteRc != nite::STATUS_OK)
{
printf("Get next frame failed\n");
continue;
}
const nite::Array<nite::UserData>& users = userTrackerFrame.getUsers();
for (int i = 0; i < users.getSize(); ++i)
{
const nite::UserData& user = users[i];
updateUserState(user,userTrackerFrame.getTimestamp());
if (user.isNew())
{
userTracker.startSkeletonTracking(user.getId());
}
else if (user.getSkeleton().getState() == nite::SKELETON_TRACKED)
{
const nite::SkeletonJoint& head = user.getSkeleton().getJoint(nite::JOINT_HEAD);
if (head.getPositionConfidence() > .5)
printf("%d. (%5.2f, %5.2f, %5.2f)\n", user.getId(), head.getPosition().x, head.getPosition().y, head.getPosition().z);
}
}
}
nite::NiTE::shutdown();
}
Facendo il build però ho avuto 10 errori di questo tipo (ne riporto uno ma gli altri 9 solo uguali anche se riferiti a funzioni diverse):
Errore 1 error LNK2019: riferimento al simbolo esterno __imp__oniFrameAddRef non risolto nella funzione "public: void __thiscall openni::VideoFrameRef::_setFrame(struct OniFrame *)" (?_setFrame@VideoFrameRef@openni@@QAEXPAUOniFrame@@@Z)
Non ho ben capito quale sia il problema perchè in effetti non ci sono problemi di discordanza con il nome della funzione dichiarata, anche perchè io non ho scritto proprio nulla, è stato un copia e incolla (e l'originale funziona benissimo); e poi le (funzioni).h utili le ho dutte dichiarate con #include, quindi non so bene come risolvere.
Grazie mille per le risposte, se vorrete provare a darmene.