2017-08-23 18 views
0

人間の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.toChangeoriginalRelativePointMapは何を表していますか?

そして、私の意見では、機能Controller::calRelativeToParentのパラメータPoint3d pointは、我々は唯一のルートの回転を知っているメインprogram.BecauseでController::calRelativeToParent APIを呼び出す方法を、このようangle.Inオイラーのベクトルでなければなりません。

答えて

0

スケルトンクラスには、スケルトン上の各追跡されたジョイントのすべての3次元位置データを含む「ジョイント」メンバがあります。私は角度ではなくモデルを駆動するためにジョイント位置データを直接調べます。 1つのポイントをあなたのベース(頭かそうでなければ)にしてから、接続された骨格ポイントのペアの間にツリー形式のベクトルを生成します。これらのベクトルをスケールしてモデルに適用します。

+0

申し訳ありません。私の "ジョイント"メンバーは、高精度のジョイントポジションがないキネクトのようなデバイスから入手しました。私はジョイントポジションでモデルを駆動できず、階層的な方向でドライブしたいと思います。 – zdczdcc

+0

はい、私はちょうどあなたがkinectから直接それを引き出すことができます私は思い出していないので、あなた自身の階層的な方向を導くことを示唆しています。ノイズが心配な場合は、各ポイントにローパスフィルターをかけてください。しかし、明確にするために、私は、あなたが各関節を取ってそれらを順次ペアにグループ化し、これらの方向ベクトルを使って階層的な方向付けを作成することを提案しています。 –

+0

私はフレームごとに20関節を得て、オフラインでテストするためにディスクに保存することができました。キーは私が階層オリエンテーションを導出する方法を知らないことです。学習のためのサンプルプロジェクトを手に入れたいです。 'OpenNI'と' libfreenect'ですが、私はこれら二つのプロジェクトで相対的なコードを見つけられませんでした。 – zdczdcc

関連する問題