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.
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
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. –
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