Skip to content

Commit 495e0bb

Browse files
committed
v1.0.9 update OpenCVForUnity version to 2.6.4. update DlibFaceLandmarkDetector version to 1.4.1.
1 parent 6610dd8 commit 495e0bb

File tree

17 files changed

+3064
-961
lines changed

17 files changed

+3064
-961
lines changed

HLWithDlibExampleMRTK2/Assets/HoloLensWithDlibFaceLandmarkDetectorExample/HLARHeadExample/HLARHeadExample.cs

Lines changed: 78 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ namespace HoloLensWithDlibFaceLandmarkDetectorExample
2222
/// HoloLens AR Head Example
2323
/// An example of AR head projection using OpenCVForUnity and DlibLandmarkDetector on Hololens.
2424
/// </summary>
25-
[RequireComponent(typeof(HLCameraStreamToMatHelper), typeof(ImageOptimizationHelper))]
25+
[RequireComponent(typeof(HLCameraStream2MatHelper), typeof(ImageOptimizationHelper))]
2626
public class HLARHeadExample : MonoBehaviour
2727
{
2828
[SerializeField, HeaderAttribute("Preview")]
@@ -265,7 +265,7 @@ public class HLARHeadExample : MonoBehaviour
265265
/// <summary>
266266
/// The webcam texture to mat helper.
267267
/// </summary>
268-
HLCameraStreamToMatHelper webCamTextureToMatHelper;
268+
HLCameraStream2MatHelper webCamTextureToMatHelper;
269269

270270
/// <summary>
271271
/// The image optimization helper.
@@ -297,11 +297,6 @@ public class HLARHeadExample : MonoBehaviour
297297
/// </summary>
298298
string dlibShapePredictorFileName = "DlibFaceLandmarkDetector/sp_human_face_68.dat";
299299

300-
/// <summary>
301-
/// The dlib shape predictor file path.
302-
/// </summary>
303-
string dlibShapePredictorFilePath;
304-
305300
Scalar COLOR_WHITE = new Scalar(255, 255, 255, 255);
306301
Scalar COLOR_GRAY = new Scalar(128, 128, 128, 255);
307302

@@ -386,8 +381,18 @@ bool isDetectingInFrameArrivedThread
386381
public Text debugStr;
387382

388383

384+
string cascade_filepath;
385+
string cascade4Thread_filepath;
386+
string dlibShapePredictor_filepath;
387+
string dlibShapePredictor4Thread_filepath;
388+
389+
/// <summary>
390+
/// The CancellationTokenSource.
391+
/// </summary>
392+
CancellationTokenSource cts = new CancellationTokenSource();
393+
389394
// Use this for initialization
390-
protected void Start()
395+
async void Start()
391396
{
392397
displayCameraPreviewToggle.isOn = displayCameraPreview;
393398
enableDownScaleToggle.isOn = enableDownScale;
@@ -400,29 +405,69 @@ protected void Start()
400405
enableLerpFilterToggle.isOn = enableLerpFilter;
401406

402407
imageOptimizationHelper = gameObject.GetComponent<ImageOptimizationHelper>();
403-
webCamTextureToMatHelper = gameObject.GetComponent<HLCameraStreamToMatHelper>();
408+
webCamTextureToMatHelper = gameObject.GetComponent<HLCameraStream2MatHelper>();
404409
#if WINDOWS_UWP && !DISABLE_HOLOLENSCAMSTREAM_API
405410
webCamTextureToMatHelper.frameMatAcquired += OnFrameMatAcquired;
406411
#endif
407-
webCamTextureToMatHelper.outputColorFormat = WebCamTextureToMatHelper.ColorFormat.GRAY;
408-
webCamTextureToMatHelper.Initialize();
409412

410413
rectangleTracker = new RectangleTracker();
411414

415+
416+
// Asynchronously retrieves the readable file path from the StreamingAssets directory.
417+
if (debugStr != null)
418+
{
419+
debugStr.text = "Preparing file access...";
420+
}
421+
422+
cascade_filepath = await DlibFaceLandmarkDetector.UnityUtils.Utils.getFilePathAsyncTask("OpenCVForUnity/objdetect/lbpcascade_frontalface.xml", cancellationToken: cts.Token);
423+
//cascade4Thread_filepath = await DlibFaceLandmarkDetector.UnityUtils.Utils.getFilePathAsyncTask("OpenCVForUnity/objdetect/haarcascade_frontalface_alt.xml", cancellationToken: cts.Token);
424+
cascade4Thread_filepath = await DlibFaceLandmarkDetector.UnityUtils.Utils.getFilePathAsyncTask("OpenCVForUnity/objdetect/lbpcascade_frontalface.xml", cancellationToken: cts.Token);
412425
dlibShapePredictorFileName = HoloLensWithDlibFaceLandmarkDetectorExample.dlibShapePredictorFileName;
413-
dlibShapePredictorFilePath = DlibFaceLandmarkDetector.UnityUtils.Utils.getFilePath(dlibShapePredictorFileName);
414-
if (string.IsNullOrEmpty(dlibShapePredictorFilePath))
426+
dlibShapePredictor_filepath = await DlibFaceLandmarkDetector.UnityUtils.Utils.getFilePathAsyncTask(dlibShapePredictorFileName, cancellationToken: cts.Token);
427+
dlibShapePredictor4Thread_filepath = await DlibFaceLandmarkDetector.UnityUtils.Utils.getFilePathAsyncTask("DlibFaceLandmarkDetector/sp_human_face_6.dat", cancellationToken: cts.Token);
428+
429+
if (debugStr != null)
430+
{
431+
debugStr.text = "";
432+
}
433+
434+
Run();
435+
}
436+
437+
// Use this for initialization
438+
void Run()
439+
{
440+
cascade = new CascadeClassifier();
441+
cascade.load(cascade_filepath);
442+
#if !WINDOWS_UWP || UNITY_EDITOR
443+
// "empty" method is not working on the UWP platform.
444+
if (cascade.empty())
445+
{
446+
Debug.LogError("cascade file is not loaded. Please copy from “OpenCVForUnity/StreamingAssets/OpenCVForUnity/objdetect/” to “Assets/StreamingAssets/OpenCVForUnity/objdetect/” folder. ");
447+
}
448+
#endif
449+
450+
cascade4Thread = new CascadeClassifier();
451+
cascade4Thread.load(cascade4Thread_filepath);
452+
#if !WINDOWS_UWP || UNITY_EDITOR
453+
// "empty" method is not working on the UWP platform.
454+
if (cascade4Thread.empty())
455+
{
456+
Debug.LogError("cascade file is not loaded. Please copy from “OpenCVForUnity/StreamingAssets/OpenCVForUnity/objdetect/” to “Assets/StreamingAssets/OpenCVForUnity/objdetect/” folder. ");
457+
}
458+
#endif
459+
460+
if (string.IsNullOrEmpty(dlibShapePredictor_filepath))
415461
{
416462
Debug.LogError("shape predictor file does not exist. Please copy from “DlibFaceLandmarkDetector/StreamingAssets/DlibFaceLandmarkDetector/” to “Assets/StreamingAssets/DlibFaceLandmarkDetector/” folder. ");
417463
}
418-
faceLandmarkDetector = new FaceLandmarkDetector(dlibShapePredictorFilePath);
464+
faceLandmarkDetector = new FaceLandmarkDetector(dlibShapePredictor_filepath);
419465

420-
dlibShapePredictorFilePath = DlibFaceLandmarkDetector.UnityUtils.Utils.getFilePath("DlibFaceLandmarkDetector/sp_human_face_6.dat");
421-
if (string.IsNullOrEmpty(dlibShapePredictorFilePath))
466+
if (string.IsNullOrEmpty(dlibShapePredictor4Thread_filepath))
422467
{
423468
Debug.LogError("shape predictor file does not exist. Please copy from “DlibFaceLandmarkDetector/StreamingAssets/DlibFaceLandmarkDetector/” to “Assets/StreamingAssets/DlibFaceLandmarkDetector/” folder. ");
424469
}
425-
faceLandmarkDetector4Thread = new FaceLandmarkDetector(dlibShapePredictorFilePath);
470+
faceLandmarkDetector4Thread = new FaceLandmarkDetector(dlibShapePredictor4Thread_filepath);
426471

427472

428473
// set 3d face object points. (right-handed coordinates system)
@@ -469,6 +514,9 @@ protected void Start()
469514

470515
opticalFlowFilter = new OFPointsFilter((int)faceLandmarkDetector.GetShapePredictorNumParts());
471516
opticalFlowFilter.diffCheckSensitivity /= imageOptimizationHelper.downscaleRatio;
517+
518+
webCamTextureToMatHelper.outputColorFormat = Source2MatHelperColorFormat.GRAY;
519+
webCamTextureToMatHelper.Initialize();
472520
}
473521

474522
/// <summary>
@@ -584,29 +632,7 @@ public void OnWebCamTextureToMatHelperInitialized()
584632

585633
mouthParticleSystem = mouth.GetComponentsInChildren<ParticleSystem>(true);
586634

587-
588-
//grayMat = new Mat();
589-
cascade = new CascadeClassifier();
590-
cascade.load(Utils.getFilePath("OpenCVForUnity/objdetect/lbpcascade_frontalface.xml"));
591-
#if !WINDOWS_UWP || UNITY_EDITOR
592-
// "empty" method is not working on the UWP platform.
593-
if (cascade.empty())
594-
{
595-
Debug.LogError("cascade file is not loaded. Please copy from “OpenCVForUnity/StreamingAssets/OpenCVForUnity/objdetect/” to “Assets/StreamingAssets/OpenCVForUnity/objdetect/” folder. ");
596-
}
597-
#endif
598-
599635
grayMat4Thread = new Mat();
600-
cascade4Thread = new CascadeClassifier();
601-
//cascade4Thread.load(Utils.getFilePath("OpenCVForUnity/objdetect/haarcascade_frontalface_alt.xml"));
602-
cascade4Thread.load(Utils.getFilePath("OpenCVForUnity/objdetect/lbpcascade_frontalface.xml"));
603-
#if !WINDOWS_UWP || UNITY_EDITOR
604-
// "empty" method is not working on the UWP platform.
605-
if (cascade4Thread.empty())
606-
{
607-
Debug.LogError("cascade file is not loaded. Please copy from “OpenCVForUnity/StreamingAssets/OpenCVForUnity/objdetect/” to “Assets/StreamingAssets/OpenCVForUnity/objdetect/” folder. ");
608-
}
609-
#endif
610636
}
611637

612638
/// <summary>
@@ -630,15 +656,9 @@ public void OnWebCamTextureToMatHelperDisposed()
630656
ExecuteOnMainThread.Clear();
631657
}
632658

633-
if (cascade != null)
634-
cascade.Dispose();
635-
636659
if (grayMat4Thread != null)
637660
grayMat4Thread.Dispose();
638661

639-
if (cascade4Thread != null)
640-
cascade4Thread.Dispose();
641-
642662
rectangleTracker.Reset();
643663

644664
camMatrix.Dispose();
@@ -667,12 +687,13 @@ public void OnWebCamTextureToMatHelperDisposed()
667687
}
668688

669689
/// <summary>
670-
/// Raises the web cam texture to mat helper error occurred event.
690+
/// Raises the webcam texture to mat helper error occurred event.
671691
/// </summary>
672692
/// <param name="errorCode">Error code.</param>
673-
public void OnWebCamTextureToMatHelperErrorOccurred(WebCamTextureToMatHelper.ErrorCode errorCode)
693+
/// <param name="message">Message.</param>
694+
public void OnWebCamTextureToMatHelperErrorOccurred(Source2MatHelperErrorCode errorCode, string message)
674695
{
675-
Debug.Log("OnWebCamTextureToMatHelperErrorOccurred " + errorCode);
696+
Debug.Log("OnWebCamTextureToMatHelperErrorOccurred " + errorCode + ":" + message);
676697
}
677698

678699
#if WINDOWS_UWP && !DISABLE_HOLOLENSCAMSTREAM_API
@@ -1536,6 +1557,12 @@ void OnDestroy()
15361557
webCamTextureToMatHelper.Dispose();
15371558
imageOptimizationHelper.Dispose();
15381559

1560+
if (cascade != null)
1561+
cascade.Dispose();
1562+
1563+
if (cascade4Thread != null)
1564+
cascade4Thread.Dispose();
1565+
15391566
if (faceLandmarkDetector != null)
15401567
faceLandmarkDetector.Dispose();
15411568

@@ -1544,6 +1571,9 @@ void OnDestroy()
15441571

15451572
if (rectangleTracker != null)
15461573
rectangleTracker.Dispose();
1574+
1575+
if (cts != null)
1576+
cts.Dispose();
15471577
}
15481578

15491579
/// <summary>

HLWithDlibExampleMRTK2/Assets/HoloLensWithDlibFaceLandmarkDetectorExample/HLARHeadExample/HLARHeadExample.unity

Lines changed: 71 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -3393,8 +3393,8 @@ GameObject:
33933393
serializedVersion: 6
33943394
m_Component:
33953395
- component: {fileID: 1076083699}
3396-
- component: {fileID: 1076083697}
33973396
- component: {fileID: 1076083695}
3397+
- component: {fileID: 1076083701}
33983398
- component: {fileID: 1076083700}
33993399
m_Layer: 0
34003400
m_Name: HLARHeadExample
@@ -3417,74 +3417,6 @@ MonoBehaviour:
34173417
m_EditorClassIdentifier:
34183418
_downscaleRatio: 2
34193419
_frameSkippingRatio: 1
3420-
--- !u!114 &1076083697
3421-
MonoBehaviour:
3422-
m_ObjectHideFlags: 0
3423-
m_CorrespondingSourceObject: {fileID: 0}
3424-
m_PrefabInstance: {fileID: 0}
3425-
m_PrefabAsset: {fileID: 0}
3426-
m_GameObject: {fileID: 1076083694}
3427-
m_Enabled: 1
3428-
m_EditorHideFlags: 0
3429-
m_Script: {fileID: 11500000, guid: 0195895dd83eb204da131e4a7c4bcfe3, type: 3}
3430-
m_Name:
3431-
m_EditorClassIdentifier:
3432-
_requestedDeviceName:
3433-
_requestedWidth: 896
3434-
_requestedHeight: 504
3435-
_requestedIsFrontFacing: 0
3436-
_requestedFPS: 30
3437-
_rotate90Degree: 0
3438-
_flipVertical: 0
3439-
_flipHorizontal: 0
3440-
_outputColorFormat: 0
3441-
_timeoutFrameCount: 300
3442-
onInitialized:
3443-
m_PersistentCalls:
3444-
m_Calls:
3445-
- m_Target: {fileID: 1076083700}
3446-
m_TargetAssemblyTypeName:
3447-
m_MethodName: OnWebCamTextureToMatHelperInitialized
3448-
m_Mode: 1
3449-
m_Arguments:
3450-
m_ObjectArgument: {fileID: 0}
3451-
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
3452-
m_IntArgument: 0
3453-
m_FloatArgument: 0
3454-
m_StringArgument:
3455-
m_BoolArgument: 0
3456-
m_CallState: 2
3457-
onDisposed:
3458-
m_PersistentCalls:
3459-
m_Calls:
3460-
- m_Target: {fileID: 1076083700}
3461-
m_TargetAssemblyTypeName:
3462-
m_MethodName: OnWebCamTextureToMatHelperDisposed
3463-
m_Mode: 1
3464-
m_Arguments:
3465-
m_ObjectArgument: {fileID: 0}
3466-
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
3467-
m_IntArgument: 0
3468-
m_FloatArgument: 0
3469-
m_StringArgument:
3470-
m_BoolArgument: 0
3471-
m_CallState: 2
3472-
onErrorOccurred:
3473-
m_PersistentCalls:
3474-
m_Calls:
3475-
- m_Target: {fileID: 1076083700}
3476-
m_TargetAssemblyTypeName:
3477-
m_MethodName: OnWebCamTextureToMatHelperErrorOccurred
3478-
m_Mode: 0
3479-
m_Arguments:
3480-
m_ObjectArgument: {fileID: 0}
3481-
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
3482-
m_IntArgument: 0
3483-
m_FloatArgument: 0
3484-
m_StringArgument:
3485-
m_BoolArgument: 0
3486-
m_CallState: 2
3487-
avoidAndroidFrontCameraLowLightIssue: 0
34883420
--- !u!4 &1076083699
34893421
Transform:
34903422
m_ObjectHideFlags: 0
@@ -3545,6 +3477,76 @@ MonoBehaviour:
35453477
videoFPS: {fileID: 443524926926304178}
35463478
trackFPS: {fileID: 443524928155071722}
35473479
debugStr: {fileID: 443524927024673313}
3480+
--- !u!114 &1076083701
3481+
MonoBehaviour:
3482+
m_ObjectHideFlags: 0
3483+
m_CorrespondingSourceObject: {fileID: 0}
3484+
m_PrefabInstance: {fileID: 0}
3485+
m_PrefabAsset: {fileID: 0}
3486+
m_GameObject: {fileID: 1076083694}
3487+
m_Enabled: 1
3488+
m_EditorHideFlags: 0
3489+
m_Script: {fileID: 11500000, guid: a80f11196f5e6394aaec3da665ebfc5a, type: 3}
3490+
m_Name:
3491+
m_EditorClassIdentifier:
3492+
_requestedDeviceName:
3493+
_requestedWidth: 896
3494+
_requestedHeight: 504
3495+
_requestedIsFrontFacing: 0
3496+
_requestedFPS: 30
3497+
_rotate90Degree: 0
3498+
_flipVertical: 0
3499+
_flipHorizontal: 0
3500+
_outputColorFormat: 3
3501+
_timeoutFrameCount: 1500
3502+
_onInitialized:
3503+
m_PersistentCalls:
3504+
m_Calls:
3505+
- m_Target: {fileID: 1076083700}
3506+
m_TargetAssemblyTypeName: HoloLensWithDlibFaceLandmarkDetectorExample.HLARHeadExample,
3507+
Assembly-CSharp
3508+
m_MethodName: OnWebCamTextureToMatHelperInitialized
3509+
m_Mode: 1
3510+
m_Arguments:
3511+
m_ObjectArgument: {fileID: 0}
3512+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
3513+
m_IntArgument: 0
3514+
m_FloatArgument: 0
3515+
m_StringArgument:
3516+
m_BoolArgument: 0
3517+
m_CallState: 2
3518+
_onDisposed:
3519+
m_PersistentCalls:
3520+
m_Calls:
3521+
- m_Target: {fileID: 1076083700}
3522+
m_TargetAssemblyTypeName: HoloLensWithDlibFaceLandmarkDetectorExample.HLARHeadExample,
3523+
Assembly-CSharp
3524+
m_MethodName: OnWebCamTextureToMatHelperDisposed
3525+
m_Mode: 1
3526+
m_Arguments:
3527+
m_ObjectArgument: {fileID: 0}
3528+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
3529+
m_IntArgument: 0
3530+
m_FloatArgument: 0
3531+
m_StringArgument:
3532+
m_BoolArgument: 0
3533+
m_CallState: 2
3534+
_onErrorOccurred:
3535+
m_PersistentCalls:
3536+
m_Calls:
3537+
- m_Target: {fileID: 1076083700}
3538+
m_TargetAssemblyTypeName: HoloLensWithDlibFaceLandmarkDetectorExample.HLARHeadExample,
3539+
Assembly-CSharp
3540+
m_MethodName: OnWebCamTextureToMatHelperErrorOccurred
3541+
m_Mode: 0
3542+
m_Arguments:
3543+
m_ObjectArgument: {fileID: 0}
3544+
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
3545+
m_IntArgument: 0
3546+
m_FloatArgument: 0
3547+
m_StringArgument:
3548+
m_BoolArgument: 0
3549+
m_CallState: 2
35483550
--- !u!1 &1108638276
35493551
GameObject:
35503552
m_ObjectHideFlags: 0

0 commit comments

Comments
 (0)