2017-08-23 1 views
0

Ich würde einige Datenstrom über 3D-Position (in festen Welt Koordinatensystem) eines Menschen 20 Skelette bekommen.Implementierung wie kinect hierarchische Rotation

Ich möchte die Skeletondaten verwenden, um ein menschliches Modell mit festem Knochen wie dem demo video zu fahren.

In Kinect SDK v1.8 konnte ich die lokale Rotation jedes Skeletts durch erhalten.

Ich möchte eine Funktion wie das implementieren.Aber das Kinect SDK ist nicht Open Source.

Ich habe festgestellt, dass die Funktion xnGetSkeletonJointOrientation Skelett-Rotation wie das in OpenNI bekommen konnte. Aber ich habe die Gerätefunktion über das nicht gefunden. Ich weiß nicht, wo ich falsch liege.

Irgendeine Idee wird geschätzt. Danke!

EDIT

Ich habe eine similar question gefunden.

Hier ist der Code, den er schließlich verwendete.

Point3d Controller::calRelativeToParent(int parentID,Point3d point,int frameID){ 
if(parentID == 0){ 
    QUATERNION temp = calChangeAxis(-1,parentID,frameID); 
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(point)),getConj(temp))); 
}else{ 
    Point3d ref = calRelativeToParent(originalRelativePointMap[parentID].parentID,point,frameID); 
    QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,parentID,frameID); 
    return getVect(multiplyTwoQuats(multiplyTwoQuats(temp,getQuat(ref)),getConj(temp))); 
}} 
QUATERNION Controller::calChangeAxis(int parentID,int qtcId,int frameID){ //currentid = id of the position of the orientation to be changed 
if(parentID == -1){ 
    QUATERNION out = multiplyTwoQuats(quatOrigin.toChange,originalRelativePointMap[qtcId].orientation); 
    return out; 
} 
else{ 
    //QUATERNION temp = calChangeAxis(originalRelativePointMap[parentID].parentID,qtcId,frameID); 
    //return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,temp); 
    return multiplyTwoQuats(finalQuatMap[frameID][parentID].toChange,originalRelativePointMap[qtcId].orientation); 
}} 

Aber ich habe noch einige Fragen dazu.

Was bedeuten die Variablen quatOrigin.toChange und originalRelativePointMap?

Und meiner Meinung nach, ist der Parameter Point3d point der Funktion Controller::calRelativeToParent ein Vektor mit euler angle.In so sein sollte, wie die Controller::calRelativeToParent API in der Haupt program.Because nennen wir wissen, die einzige Root-Rotation.

Antwort

0

Die Skeleton-Klasse hat ein "Joints" -Member, das alle 3D-Positionsdaten für jedes verfolgte Gelenk auf dem Skelett enthält. Ich würde die Gelenkpositionsdaten direkt betrachten, um Ihr Modell anstatt Winkel zu fahren. Nimm einen Punkt als deine Basis (Kopf oder sonst) und erzeuge dann Vektoren in Baumform zwischen Paaren verbundener Skelettpunkte. Skalieren Sie diese Vektoren und wenden Sie sie auf Ihr Modell an.

+0

Sorry für die späte.Meine "Gelenke" Mitglied wurde von einem Gerät wie Kinect ohne hohe Genauigkeit Gelenkposition.So kann ich mein Modell nicht durch die gemeinsame Position fahren, und ich möchte es durch die hierarchische Ausrichtung fahren. – zdczdcc

+0

Ja, ich schlage nur vor, dass Sie Ihre eigene hierarchische Ausrichtung ableiten, da ich mich nicht erinnere, ob Sie das direkt vom Kinect ziehen können. Wenn Sie über Rauschen besorgt sind, wenden Sie an jedem Punkt einen Tiefpassfilter an. Aber um das klarzustellen, schlage ich vor, dass Sie jedes Gelenk nehmen und zu sequenziellen Paaren gruppieren und diese Richtungsvektoren verwenden, um Ihre hierarchische Ausrichtung zu erzeugen. –

+0

Ich könnte 20 Gelenke für jeden Rahmen und speichern sie auf der Festplatte für einige Tests offline.Der Schlüssel ist, ich weiß nicht, wie hierarchische Orientierung abzuleiten.Und ich möchte ein Beispielprojekt für ein Lernen bekommen.So ich heruntergeladen die 'OpenNI' und' libfreenect'. Aber ich habe den relativen Code in diesen beiden Projekten nicht gefunden. – zdczdcc