Kinect V2開發(7)測量骨骼點高度以及骨骼角度
Kinect得到的是鏡面影象
骨骼角度測量
通過Kinect獲取到關節的三維座標點後可以根據向量點積或叉積公式計算出關節角度
在DirectXMath數學庫中也有現成的計算向量夾角的函式XMVector3AngleBetweenVectors:
Namespace Use DirectX
Header DirectXMath.h
XMVECTOR XMVector3AngleBetweenVectors(
[in] XMVECTOR V1,
[in] XMVECTOR V2
);//返回向量V1、V2間的夾角[angle, angle,angle, angle],單位為弧度
DOUBLE CBodyBasics::Angle(const DirectX::XMVECTOR* vec, JointType jointA, JointType jointB, JointType jointC)
{
double angle = 0.0;
XMVECTOR vBA = XMVectorSubtract(vec[jointB], vec[jointA]);
XMVECTOR vBC = XMVectorSubtract(vec[jointB], vec[jointC]);
XMVECTOR vAngle = XMVector3AngleBetweenVectors(vBA, vBC);
angle = XMVectorGetX(vAngle) * 180.0 * XM_1DIVPI; // XM_1DIVPI: An optimal representation of 1 / π
return angle;
}
在獲取關節資訊後呼叫,這裡測量的是 右肘和右肩連線 與右肘和右腕連線之間的角度
const DirectX::XMVECTOR* vec = filterKinect.GetFilteredJoints(); // Retrive Filtered Joints
double angle = Angle(vec, JointType_WristRight, JointType_ElbowRight, JointType_ShoulderRight); // Get ElbowRight joint angle
char s[10];
sprintf_s(s, "%.0f", angle);
string strAngleInfo = s;
putText(BodyImg, strAngleInfo, cvPoint(0, 50), CV_FONT_HERSHEY_COMPLEX, 0.5, cvScalar(0, 0, 255)); // 螢幕上顯示角度資訊
高度測量
地面檢測的難度比較大,在IBodyFrame
類裡面有一個get_FloorClipPlane
方法,函式的引數是vector4 *floorClipPlane
,返回值是HRESULT
型別。vector4結構體裡有4個float型別的資料成員,分別是x,y,z,w,這4個引數即為地面方程的係數(x,y,z)和常數項(w),將這四個數分別賦值給A,B,C,D,則可得地面方程為
A·x+B·y+C·z+D=0
此處的地面方程是在Kinect的深度相機座標系下得到的,常數項表示Kinect的深度相機的中心點到地面的距離。知道骨骼點的三維座標和地面方程,則可計算關節點離地面的距離
height =
Vector4 vFloorClipPlane;
float A, B, C, D;
float x, y, z;
float baseH;
myBodyFrame->get_FloorClipPlane(&vFloorClipPlane);
A = vFloorClipPlane.x;
B = vFloorClipPlane.y;
C = vFloorClipPlane.z;
D = vFloorClipPlane.w;
x = joints[JointType_SpineBase].Position.X;
y = joints[JointType_SpineBase].Position.Y;
z = joints[JointType_SpineBase].Position.Z;
baseH = (A*x + B*y + C*z + D) / sqrt(pow(A, 2) + pow(B, 2) + pow(C, 2));
cout << "JointType_SpineBase的高度是 " << baseH << "\tm" << endl;
Bones Hierarchy:
我們使用骨骼跟蹤系統定義的關節來定義骨骼的層次結構。 層次結構以髖關節中心關節作為根,並延伸到腳、頭和手:
通過IBody::GetJointOrientations
函式可以獲取到關節的姿態:
HRESULT = pBody -> GetJointOrientations(_countof(joints), jointOrientations);
關節姿態是一個結構體
typedef struct _JointOrientation {
JointType JointType;
Vector4 Orientation; // quaternion
} JointOrientation;
- 末端節點(Head、HandTip、Thumb、Feet)不含有姿態資訊,這些關節返回的四元數各分量都為0:
- 所有的關節姿態描述都以攝像機座標系為參考,當人體站正朝向Kinect時SpineBase關節處的座標系如下圖所示。此時返回的關節四元數理論上應為(w,x,y,z)=(0,0,1,0),對應的Z-Y-X尤拉角為(180°,0,180°)或(0,180°,0)
- 關節座標系的Y軸沿著骨骼的方向,Z軸為骨骼轉動軸( Z-axis points to the direction that makes sense for the joint to rotate),X軸與Y軸和Z軸垂直,構成右手座標系
Bone direction(Y green) - always matches the skeleton.
Normal(Z blue) - joint roll, perpendicular to the bone
Binormal(X red) - perpendicular to the bone and normal
- 關節座標系的Y軸沿著骨骼的方向,Z軸為骨骼轉動軸( Z-axis points to the direction that makes sense for the joint to rotate),X軸與Y軸和Z軸垂直,構成右手座標系
相關推薦
Kinect V2開發(7)測量骨骼點高度以及骨骼角度
Kinect得到的是鏡面影象 骨骼角度測量 通過Kinect獲取到關節的三維座標點後可以根據向量點積或叉積公式計算出關節角度 在DirectXMath數學庫中也有現成的計算向量夾角的函式XMVector3AngleBetweenVectors: Na
Kinect V2開發(6)骨骼資料平滑處理
Kinect獲取到的關節座標資料包含了許多噪聲。 影響噪聲特性和大小的因素有很多(room lighting; a person’s body size; the person’s distance from the sensor array; the per
Kinect V2開發(5)讀關節資料
Kinect能取得Depth(物體與感測器的距離資訊)和BodyIndex(人物索引),基於這些資料可以偵測到人體的骨骼資訊並追蹤,在Kinect V2的SDK 2.0中,它最多可以同時獲取到6個人、每個人25個關節點的資訊,並且通過深度攝像頭,可以同時獲取到這
Kinect V2開發(2)從Kinect獲取資料
在Kinect for windows SDK2.0中,Kinect有多種型別的資料來源,每個型別的資料都有三個類與之對應:Source,Reader和Frame。要讀取骨架,就有IBodyFrameSource, IBodyFrameReader, IBody
Windows Phone開發(7):當好總舵主
發的 content 數據 new 窗口 sdn 內容 str 剛才 吹完了頁面有關的話題,今天我們來聊一下頁面之間是如何導航的,在更多情況下,我們的應用程序不會只有一個頁面的,應該會有N個,就像我們做桌面應 用開發那樣,我們一個應用程序中可能不止一個窗體(極簡單的程序除外
Linux驅動開發(7)——驅動模組傳參
標頭檔案在include/linux/moduleparam.h 傳遞單個引數:module_param(name,type,perm) - name:模組引數的名稱 - type: 模組引數的資料型別(支援int long short uint ulong ushort型
Android studio3.0對於百度地圖api開發(7)——百度地圖地圖導航實現
承接上文https://blog.csdn.net/qq_41562408/article/details/82829938,本次我們來實現百度地圖的導航功能實現。百度地圖的導航功能對於地點的確定我感覺主要是通過緯經度確定地點然後進行導航,其導航模式可分為:步行
四國軍棋引擎開發(7)概率分析與搜尋優化
1.概率分析 四國軍棋屬於不完全資訊博弈,我們是看不到敵方的棋子,但是可以通過棋子間的碰撞來判斷敵方的子力分佈情況和棋子大小的概率。 當棋子產生碰撞後,可能的判決結果有吃子、打兌、撞死3種結果,有時還會附加是否亮軍旗的資訊,之前的處理只是簡單的把所有情況取平均值
ARM開發(7)基於STM32的獨立看門狗
基於STM32的獨立看門狗 一 獨立看門狗原理: 1.1 本實驗實現STM32的獨立看門狗 1.2 實驗思路:理解STM32獨立看門狗原理,根據其原理寫驅動。 1.3 開發環境 : MDK5 庫函式版本開發 JLINK模擬
微信小遊戲開發(7)-支援情況和執行環境
一、支援情況 基本上所有基於HTML5的遊戲引擎都是依賴於瀏覽器環境提供的BOM和DOM API,但是小程式是一個不同於瀏覽器的JavaScript執行環境,沒有BOM和DOM API。因此如果要在小遊戲中使用引擎,需要對引擎進行改造。 目前,Cocos,E
ONVIF協議網路攝像機(IPC)客戶端程式開發(7):裝置搜尋
1 專欄導讀 本專欄第一篇文章「專欄開篇」列出了專欄的完整目錄,按目錄順序閱讀,有助於你的理解,專欄前面文章講過的知識點(或程式碼段),後面文章不會贅述。為了節省篇幅,突出重點,在文章中展示的示例程式碼僅僅是關鍵程式碼,你可以在「專欄開篇」中獲取完整程式碼。
IOS開發(7)WKWebView載入本地HTML、CSS、JS檔案JS(解決html內訪問其他資源路徑問題)
這段時間開發IOS應用,自己本身是搞java web 和 android,搞ios應用後面還有好多坑要跳,所以學習一點就整理一點筆記。不敢保證內容都是對的,但至少,我嘗試過分析整理的。 UIWebVIew和WKWebView都是ios提供的web控制元件。但是
WEB開發(7) Hibernate篇(上)
Hibernate是資料持久化的一種解決方案。 介紹ORM 認識Hibernate H
WEB開發(7) Hibernate篇(下) HQL語言
HQL查詢語言 Hibernate查詢語言為Hibernate Query Language。 HQL概述 -
多媒體開發(7):編譯Android與iOS平臺的FFmpeg
編譯FFmpeg,一個古老的話題,但我還是介紹一遍,就當記錄。之前介紹怎麼給視訊新增水印時,就已經提到FFmpeg的編譯,並且在編譯時指定了濾鏡的功能。 但是,在手機盛行的時代,你可能更需要的是能在iOS或Android平臺上執行的FFmpeg,而對於命令列的ffmpeg,你可以在個人電腦上面使用(因為它簡
數據庫復習總結(7)-表的創建以及插入命令、數據修改、數據刪除
位置 bject src key arc cat () 例如 truncate 一、表的操作 表:創建、修改、刪除 通過select * from sysobjects where xtype=‘U‘可以查看所有存在的表 多個列間使用逗號分隔
Python爬蟲開發(五):反爬蟲措施以及爬蟲編寫注意事項
0×01 介紹 本人對於Python學習建立了一個小小的學習圈子,為各位提供了一個平臺,大家一起來討論學習Python。歡迎各位到來Python學習群:960410445一起討論視訊分享學習。Python是未來的發展方向,正在挑戰我們的分析能力及對世界的認知方式,因此,我們與時俱進,迎接變化,並
springBoot(7):web開發-錯誤處理
spring boot 錯誤處理 處理方式一:實現ErrorController接口原理:Spring Boot 將所有的錯誤默認映射到/error, 實現ErrorController接口代碼:package com.example.demo.controller; import org.sp
握手API網關(7)開發指南-API參考
custom psd title control test 機制 找不到 con 列表 一、簡介 用戶可以使用開發指南介紹的 API 對 API 網關服務進行相關操作。 術語表 術語全稱中文說明 Region 地域 用戶開放API,需選擇API在API網關的部署地
豹哥嵌入式講堂:ARM Cortex-M開發之文件詳解(7)- 反匯編文件(.s/.lst/.dump)
work cfi text1 翻譯 memory 進制數 補充 就是 datatable 大家好,我是豹哥,獵豹的豹,犀利哥的哥。今天豹哥給大家講的是嵌入式開發裏的反匯編文件(.s, .lst, .dump)。 豹哥在第四、五、六節課分別介紹了編譯器/鏈接器生成的