人間の20個のスケルトンの3D位置(固定ワールド座標系で)に関するデータストリームが得られます。kinect階層的回転のような実装
骨格データを使用して、demo videoのような固定された骨を持つ人間のモデルを駆動したいとします。
Kinect SDK v1.8では、各スケルトンのローカルローテーションをNUI_SKELETON_BONE_ORIENTATION.hierarchicalRotation
で取得できました。
私はそのような機能を実装したいと思います。しかし、KinectのSDKはオープンソースではありません。
私は、関数xnGetSkeletonJointOrientation
がスケルトンの回転をOpenNIのように得ることができることを発見しました。しかし、私はその実装関数を見つけませんでした。どこが間違っているのか分かりません。
ご了承ください。ありがとうございます!私はsimilar questionを発見した
EDIT
。
ここで彼は最後に使用したコードです。
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);
}}
しかし、私はまだそれについて何か質問があります。
変数quatOrigin.toChange
とoriginalRelativePointMap
は何を表していますか?
そして、私の意見では、機能Controller::calRelativeToParent
のパラメータPoint3d point
は、我々は唯一のルートの回転を知っているメインprogram.BecauseでController::calRelativeToParent
APIを呼び出す方法を、このようangle.Inオイラーのベクトルでなければなりません。
申し訳ありません。私の "ジョイント"メンバーは、高精度のジョイントポジションがないキネクトのようなデバイスから入手しました。私はジョイントポジションでモデルを駆動できず、階層的な方向でドライブしたいと思います。 – zdczdcc
はい、私はちょうどあなたがkinectから直接それを引き出すことができます私は思い出していないので、あなた自身の階層的な方向を導くことを示唆しています。ノイズが心配な場合は、各ポイントにローパスフィルターをかけてください。しかし、明確にするために、私は、あなたが各関節を取ってそれらを順次ペアにグループ化し、これらの方向ベクトルを使って階層的な方向付けを作成することを提案しています。 –
私はフレームごとに20関節を得て、オフラインでテストするためにディスクに保存することができました。キーは私が階層オリエンテーションを導出する方法を知らないことです。学習のためのサンプルプロジェクトを手に入れたいです。 'OpenNI'と' libfreenect'ですが、私はこれら二つのプロジェクトで相対的なコードを見つけられませんでした。 – zdczdcc