抬手动作+切换mediapipe模型

This commit is contained in:
terric 2023-11-16 01:23:16 +08:00
parent c5186f75b5
commit 66f0abbd26
14 changed files with 787 additions and 202 deletions

View File

@ -462,7 +462,6 @@ namespace OpenCVForUnityExample.DnnModel
float[] landmarks_presence = new float[(39 - auxiliary_points_num)];
results_col4_199_39x5.colRange(new OpenCVRange(4, 5)).get(0, 0, landmarks_presence);
Mat results_col199_316_39x3 = results.rowRange(new OpenCVRange(199, 316 - (3 * auxiliary_points_num))).reshape(1, 39 - auxiliary_points_num);
float[] landmarks_world = new float[(39 - auxiliary_points_num) * 3];
results_col199_316_39x3.get(0, 0, landmarks_world);

View File

@ -1,5 +1,155 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &812840956832231530
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1958927731802958260}
- component: {fileID: 2260945507531342483}
- component: {fileID: 3436322692073427523}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1958927731802958260
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 812840956832231530}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2576201504434113081}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -100, y: -100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2260945507531342483
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 812840956832231530}
m_CullTransparentMesh: 1
--- !u!114 &3436322692073427523
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 812840956832231530}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 9b4580a483f26ac4388ec72c4c479a83, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &4637189147528760871
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4138242365235796459}
- component: {fileID: 7693179399692606510}
- component: {fileID: 3913808783048664634}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4138242365235796459
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4637189147528760871}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7867255813535008431}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: -100, y: -100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7693179399692606510
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4637189147528760871}
m_CullTransparentMesh: 1
--- !u!114 &3913808783048664634
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4637189147528760871}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: c218c4357d09a2f4e94961d8b04540c6, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &4975108645149662689
GameObject:
m_ObjectHideFlags: 0
@ -87,6 +237,81 @@ CanvasGroup:
m_Interactable: 1
m_BlocksRaycasts: 1
m_IgnoreParentGroups: 0
--- !u!1 &5012355027590094061
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8940443638627649355}
- component: {fileID: 5822777235898107403}
- component: {fileID: 5023932294307215150}
m_Layer: 5
m_Name: Mask
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &8940443638627649355
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5012355027590094061}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 2576201504434113081}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5822777235898107403
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5012355027590094061}
m_CullTransparentMesh: 1
--- !u!114 &5023932294307215150
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5012355027590094061}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: fc3cc6afdc9d6f645bad60ad7309189e, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &5611881615064894930
GameObject:
m_ObjectHideFlags: 0
@ -100,6 +325,7 @@ GameObject:
- component: {fileID: 7069011303126796865}
- component: {fileID: 4329244061302087914}
- component: {fileID: 5061662039744333050}
- component: {fileID: 25324508393644868}
m_Layer: 5
m_Name: Driver
m_TagString: Untagged
@ -120,12 +346,14 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1449208219289806508}
- {fileID: 4138242365235796459}
- {fileID: 173739580069041147}
m_Father: {fileID: 1888392902869825718}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -450, y: 0}
m_SizeDelta: {x: 700, y: 500}
m_AnchoredPosition: {x: -300, y: 0}
m_SizeDelta: {x: 256, y: 256}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2054363549373963548
CanvasRenderer:
@ -155,7 +383,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: f3df4d9369dcdc840b85c95d3e1176f4, type: 3}
m_Sprite: {fileID: 21300000, guid: 404ba9da9833aa0429c62a90c92f0e33, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
@ -231,6 +459,19 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0
--- !u!114 &25324508393644868
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5611881615064894930}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_ShowMaskGraphic: 1
--- !u!1 &6036208431044648634
GameObject:
m_ObjectHideFlags: 0
@ -289,7 +530,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@ -310,6 +551,81 @@ MonoBehaviour:
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: Co-Driver
--- !u!1 &8039057556249263921
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 173739580069041147}
- component: {fileID: 3300850338272086747}
- component: {fileID: 1636194949858596997}
m_Layer: 5
m_Name: Mask
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &173739580069041147
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8039057556249263921}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7867255813535008431}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3300850338272086747
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8039057556249263921}
m_CullTransparentMesh: 1
--- !u!114 &1636194949858596997
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8039057556249263921}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: fc3cc6afdc9d6f645bad60ad7309189e, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &8042575492156197460
GameObject:
m_ObjectHideFlags: 0
@ -344,8 +660,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 30}
m_SizeDelta: {x: 160, y: 160}
m_AnchoredPosition: {x: 0, y: 20}
m_SizeDelta: {x: 160, y: 30}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &8391011484397638028
CanvasRenderer:
@ -368,7 +684,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_Color: {r: 0.49019608, g: 0.49019608, b: 0.49019608, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@ -488,12 +804,14 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6401048517044185304}
- {fileID: 1958927731802958260}
- {fileID: 8940443638627649355}
m_Father: {fileID: 1888392902869825718}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 450, y: 0}
m_SizeDelta: {x: 700, y: 500}
m_AnchoredPosition: {x: 300, y: 0}
m_SizeDelta: {x: 256, y: 256}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6645283475793646557
CanvasRenderer:
@ -523,7 +841,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 4c832a36ea64b7b4da0fffa78a702860, type: 3}
m_Sprite: {fileID: 21300000, guid: 404ba9da9833aa0429c62a90c92f0e33, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
@ -629,7 +947,6 @@ RectTransform:
m_Children:
- {fileID: 7867255813535008431}
- {fileID: 2576201504434113081}
- {fileID: 3633320821606894435}
m_Father: {fileID: 5269051166812510682}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@ -637,137 +954,3 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &9208700712057849365
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3633320821606894435}
- component: {fileID: 6811689815506691815}
- component: {fileID: 5648383841688649297}
m_Layer: 5
m_Name: label
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3633320821606894435
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9208700712057849365}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1888392902869825718}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 350}
m_SizeDelta: {x: 450, y: 150}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6811689815506691815
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9208700712057849365}
m_CullTransparentMesh: 1
--- !u!114 &5648383841688649297
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9208700712057849365}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Are you sitting at...
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4286085240
m_fontColor: {r: 0.47058824, g: 0.47058824, b: 0.47058824, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 50
m_fontSizeBase: 50
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}

View File

@ -100,7 +100,6 @@ public class CVEstimator : Singleton<CVEstimator>
{
DateTime startTime = DateTime.Now;
Mat bgrMat = new Mat();
while (IsRunning)
{
Mat rgbaMat = MotionCaptureManager.Instance.RgbaMat;
@ -112,15 +111,12 @@ public class CVEstimator : Singleton<CVEstimator>
}
Imgproc.cvtColor(rgbaMat, bgrMat, Imgproc.COLOR_RGBA2BGR);
if (!YogaManager.Instance.CurrentEstimator.TryGetROIRegionMat(rgbaMat, bgrMat, out List<float[]> voloResultBox))
if (!YogaManager.Instance.CurrentEstimator.TryGetROIRegionMat(bgrMat, rgbaMat, out Mat result))
{
continue; //重新检测
}
//更新人物框检测结果
MotionCaptureManager.Instance.VoloResult = voloResultBox;
if (!YogaManager.Instance.CurrentEstimator.Esitmate(bgrMat, voloResultBox, out List<Point> points))
if (!YogaManager.Instance.CurrentEstimator.Esitmate(bgrMat, rgbaMat, result, out List<Point> points))
{
Debug.LogWarning("Pose estimation failed. Re-Estimating.");
continue; //重新检测

View File

@ -37,9 +37,9 @@ public abstract class Estimator
public abstract void DisposeModel();
//检测到的人体框 默认使用VOLO7
public virtual bool TryGetROIRegionMat(Mat rgbaMat, Mat bgrMat, out List<float[]> voloResult)
public virtual bool TryGetROIRegionMat(Mat bgrMat, Mat rgbaMat, out Mat result)
{
voloResult = null;
result = null;
if (_objectDetector == null)
{
Debug.LogWarning("ObjectDetector is not ready. ");
@ -47,37 +47,8 @@ public abstract class Estimator
}
//获取数据
Mat results = _objectDetector.infer(bgrMat);
var voloResultBox = new List<float[]>();
bool hasValidObject = false;
for (int i = results.rows() - 1; i >= 0; --i)
{
float[] box = new float[4];
results.get(i, 0, box); //方框
float[] conf = new float[1];
results.get(i, 4, conf); //检测数据
float[] cls = new float[1];
results.get(i, 5, cls); //类别
result = _objectDetector.infer(bgrMat);
if (!IsObjectValid(box, conf, cls, rgbaMat))
{
return false;
}
hasValidObject = true;
voloResultBox.Clear();
voloResultBox.Add(box);
voloResultBox.Add(conf);
voloResultBox.Add(cls);
break;
}
if (!hasValidObject) //没有检测到人体
{
Debug.Log("No person block found. Re-Estimation.");
return false; //重新检测
}
voloResult = voloResultBox;
return true;
}
@ -128,7 +99,7 @@ public abstract class Estimator
Imgproc.putText(image, label, new Point(left, top), Imgproc.FONT_HERSHEY_SIMPLEX, 0.5, Scalar.all(255), 1, Imgproc.LINE_AA);
}
public abstract bool Esitmate(Mat bgrMat, List<float[]> voloResultBox, out List<Point> points);
public abstract bool Esitmate(Mat bgrMat, Mat rgbaMat, Mat result, out List<Point> points);
public virtual void Check(ref Mat img) { }
}

View File

@ -1,21 +1,148 @@
using OpenCVForUnity.CoreModule;
using OpenCVForUnity.ImgprocModule;
using OpenCVForUnity.UnityUtils;
using OpenCVForUnityExample.DnnModel;
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.GlobalIllumination;
using static UnityEngine.Networking.UnityWebRequest;
using OpenCVRange = OpenCVForUnity.CoreModule.Range;
public class MediaPipeEstimator : Estimator
{
private MediaPipePersonDetector _personDetector;
private MediaPipePoseEstimator _poseEstimator;
private bool _mask = false;
public override void InitModel()
{
throw new NotImplementedException();
var personDetectModelPath = Utils.getFilePath(YogaConfig.MODEL_PATHS[ModelType.MediapipePersonDetect]);
if (string.IsNullOrEmpty(personDetectModelPath))
{
Debug.LogError(YogaConfig.MODEL_PATHS[ModelType.MediapipePersonDetect] + " is not loaded. Please read “StreamingAssets/OpenCVForUnity/dnn/setup_dnn_module.pdf” to make the necessary setup.");
}
else
{
_personDetector = new MediaPipePersonDetector(personDetectModelPath, 0.3f, 0.6f, 5000);
}
var poseModelPath = Utils.getFilePath(YogaConfig.MODEL_PATHS[ModelType.MediapipePose]);
if (string.IsNullOrEmpty(poseModelPath))
{
Debug.LogError(YogaConfig.MODEL_PATHS[ModelType.MediapipePose] + " is not loaded. Please read “StreamingAssets/OpenCVForUnity/dnn/setup_dnn_module.pdf” to make the necessary setup.");
}
else
{
_poseEstimator = new MediaPipePoseEstimator(poseModelPath, 0.9f);
}
}
public override bool Esitmate(Mat bgrMat, List<float[]> voloResultBox, out List<Point> points)
public override void Check(ref Mat img)
{
throw new NotImplementedException();
if (_personDetector == null || _poseEstimator == null)
{
Imgproc.putText(img, "model file is not loaded.", new Point(5, img.rows() - 30), Imgproc.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(255, 255, 255, 255), 2, Imgproc.LINE_AA, false);
Imgproc.putText(img, "Please read console message.", new Point(5, img.rows() - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(255, 255, 255, 255), 2, Imgproc.LINE_AA, false);
}
}
public override bool TryGetROIRegionMat(Mat bgrMat, Mat rgbaMat, out Mat result)
{
result = _personDetector.infer(bgrMat);
if (result.rows() == 0)
{
return false;
}
return true;
}
public override bool Esitmate(Mat bgrMat, Mat rgbaMat, Mat result, out List<Point> points)
{
points = null;
for (int i = 0; i < result.rows(); ++i)
{
List<Mat> results = _poseEstimator.infer(bgrMat, result.row(i));
//_poseEstimator.visualize(rgbaMat, results[0], false, false);
points = GetKeypoints(results[0]);
if (points != null && YogaManager.Instance.ActionCheckPoints(points))
{
return true;
}
}
//没有检测到人体
return false;
}
private List<Point> GetKeypoints(Mat result)
{
var retVal = new List<Point>();
if (result.empty() || result.rows() < 317)
return retVal;
//获取关键点
float[] conf = new float[1];
result.get(316, 0, conf);
float[] bbox = new float[4];
result.get(0, 0, bbox);
int auxiliary_points_num = 6;
Mat results_col4_199_39x5 = result.rowRange(new OpenCVRange(4, 199 - (5 * auxiliary_points_num))).reshape(1, 39 - auxiliary_points_num);
float[] landmarks_screen_xy = new float[(39 - auxiliary_points_num) * 2];
results_col4_199_39x5.colRange(new OpenCVRange(0, 2)).get(0, 0, landmarks_screen_xy);
float[] landmarks_screen_xyz = new float[(39 - auxiliary_points_num) * 3];
results_col4_199_39x5.colRange(new OpenCVRange(0, 3)).get(0, 0, landmarks_screen_xyz);
// # only show visible keypoints which presence bigger than 0.8
float[] landmarks_presence = new float[(39 - auxiliary_points_num)];
results_col4_199_39x5.colRange(new OpenCVRange(4, 5)).get(0, 0, landmarks_presence);
Mat results_col199_316_39x3 = result.rowRange(new OpenCVRange(199, 316 - (3 * auxiliary_points_num))).reshape(1, 39 - auxiliary_points_num);
float[] landmarks_world = new float[(39 - auxiliary_points_num) * 3];
results_col199_316_39x3.get(0, 0, landmarks_world);
//将关键点映射到现有的open pose关键点上
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 0)); //Nose
retVal.Add(new Point(-1, -1)); //Neck
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 11)); //LShoulder
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 13)); //LElbow
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 15)); //LWrist
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 12)); //RShoulder
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 14)); //RElbow
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 16)); //RWrist
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 23)); //LHip
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 25)); //LKnee
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 27)); //LAnkle
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 24)); //RHip
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 26)); //RKnee
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 28)); //RAnkle
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 2)); //LEye
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 5)); //REye
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 7)); //LEar
retVal.Add(GetPointData(landmarks_screen_xy, landmarks_presence, 8)); //REar
retVal.Add(new Point(-1, -1)); //Background
return retVal;
}
private Point GetPointData(float[] landmarks, float[] _landmarks_presence, int index)
{
if (_landmarks_presence[index] < 0.8f)
return null;
index = index * 2;
return new Point(landmarks[index], landmarks[index + 1]);
}
public override void DisposeModel()
{
throw new NotImplementedException();
}
}

View File

@ -6,10 +6,11 @@ using System;
using System.Collections.Generic;
using UnityEngine;
using Yoga;
using static UnityEngine.Networking.UnityWebRequest;
public class OpenPoseEsimater : Estimator
{
KeypointsModel _openPoseModel;
KeypointsModel _openPoseModel;
private Net _net;
private double threshold = 0.5;
@ -39,8 +40,42 @@ public class OpenPoseEsimater : Estimator
_net.Dispose();
}
public override bool Esitmate(Mat bgrMat, List<float[]> voloResultBox, out List<Point> points)
public override bool Esitmate(Mat bgrMat, Mat rgbaMat, Mat results, out List<Point> points)
{
var voloResultBox = new List<float[]>();
points = null;
bool hasValidObject = false;
for (int i = results.rows() - 1; i >= 0; --i)
{
float[] box = new float[4];
results.get(i, 0, box); //方框
float[] conf = new float[1];
results.get(i, 4, conf); //检测数据
float[] cls = new float[1];
results.get(i, 5, cls); //类别
if (!IsObjectValid(box, conf, cls, rgbaMat))
{
return false;
}
hasValidObject = true;
voloResultBox.Clear();
voloResultBox.Add(box);
voloResultBox.Add(conf);
voloResultBox.Add(cls);
break;
}
if (!hasValidObject) //没有检测到人体
{
Debug.Log("No person block found. Re-Estimation.");
return false; //重新检测
}
//更新人物框检测结果
MotionCaptureManager.Instance.VoloResult = voloResultBox;
points = null;
if (_openPoseModel == null)

View File

@ -1,11 +1,13 @@
using OpenCVForUnity.CoreModule;
using System;
using System.Collections.Generic;
using UnityEngine;
public class HandsUp : PoseBase
{
public override bool CheckPose(List<Point> points)
{
// 必须包含 Neck 和 LEar 和 Neck 的点位
// 必须包含 "Nose", "RShoulder", "LShoulder", "RElbow", "LElbow" 点位
if (!YogaManager.Instance.ActionCheckPoints(points))
return false;
@ -13,6 +15,21 @@ public class HandsUp : PoseBase
if (!YogaManager.Instance.ActionCheckPoints(basePoint))
return false;
return false;
var rArmVector = ("RElbow".vector(points) - "RShoulder".vector(points)).normalized;
var lArmVector = ("LElbow".vector(points) - "LShoulder".vector(points)).normalized;
var rArmBaseVector = ("RElbow".vector(basePoint) - "RShoulder".vector(basePoint)).normalized;
var lArmBaseVector = ("LElbow".vector(basePoint) - "LShoulder".vector(basePoint)).normalized;
var angleR = Vector3.Angle(rArmVector, rArmBaseVector);
var angleL = Vector3.Angle(lArmVector, lArmBaseVector);
Debug.LogWarning("angleR:" + angleR + " angleL:" + angleL);
if (angleR < 10 || angleL < 10)
return false;
return true;
}
}

View File

@ -61,10 +61,16 @@ namespace Yoga
base.Init();
_webCamTextureToMatHelper = gameObject.GetComponent<WebCamTextureToMatHelper>();
#if UNITY_ANDROID && !UNITY_EDITOR
// Avoids the front camera low light issue that occurs in only some Android devices (e.g. Google Pixel, Pixel2).
webCamTextureToMatHelper.avoidAndroidFrontCameraLowLightIssue = true;
#endif
_webCamTextureToMatHelper.Initialize();
UIManager.Instance.LoadReset();
if (YogaManager.Instance.Action == null)
YogaManager.Instance.InitData();
@ -78,7 +84,7 @@ namespace Yoga
case ModelType.OpenPose:
YogaManager.Instance.CurrentEstimator = new OpenPoseEsimater();
break;
case ModelType.Mediapipe:
case ModelType.MediapipePose:
YogaManager.Instance.CurrentEstimator = new MediaPipeEstimator();
break;
}

View File

@ -57,6 +57,8 @@ public static class YogaConfig
public static readonly Dictionary<ModelType, string> MODEL_PATHS = new Dictionary<ModelType, string>()
{
{ModelType.OpenPose,"OpenCVForUnity/dnn/lightweight_pose_estimation_201912.onnx" },
{ModelType.MediapipePersonDetect,"OpenCVForUnity/dnn/person_detection_mediapipe_2023mar.onnx" },
{ModelType.MediapipePose,"OpenCVForUnity/dnn/pose_estimation_mediapipe_2023mar.onnx" },
//{"","" },
};

View File

@ -13,12 +13,12 @@ public class YogaDataLoader
#if UNITY_EDITOR
data[-1] = new YogaData()
{
VideoPath = "Video/Action2",
Action = AvatarAction.Nod,
ModelType = ModelType.OpenPose,
VideoPath = "Video/Action3",
Action = AvatarAction.HandsUp,
ModelType = ModelType.MediapipePose,
MaxActionCount = 1000,
TotalSeconds = 20.0f,
MustPoints = new List<string>() { "Nose", "REye", "LEye", "Neck" },
MustPoints = new List<string>() { "Nose", "RShoulder", "LShoulder", "RElbow", "LElbow" },
//AnyPoints = new List<string>() { "RWrist", "LWrist" }
};
#endif
@ -44,10 +44,10 @@ public class YogaDataLoader
{
VideoPath = "Video/Action3",
Action = AvatarAction.HandsUp,
ModelType = ModelType.OpenPose,
ModelType = ModelType.MediapipePose,
MaxActionCount = 4,
TotalSeconds = 12.66f,
MustPoints = new List<string>() { "Nose", "RShoulder", "LShoulder", "RightWrist" }
MustPoints = new List<string>() { "Nose", "RShoulder", "LShoulder", "RElbow", "LElbow" }
};
if (data.ContainsKey(index))
@ -76,6 +76,7 @@ public enum ModelType
{
OpenPose,
YoloV7,
Mediapipe,
MediapipePose,
MediapipePersonDetect,
//,
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,124 @@
fileFormatVersion: 2
guid: c218c4357d09a2f4e94961d8b04540c6
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

BIN
Assets/UI/Img/seat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

124
Assets/UI/Img/seat.png.meta Normal file
View File

@ -0,0 +1,124 @@
fileFormatVersion: 2
guid: 9b4580a483f26ac4388ec72c4c479a83
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant: