- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I am trying to run Face tracking using following code but Unity is crashing without any error or response:
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
public class FaceDetection : BaseAction {
private PXCMSession session;
private PXCMSenseManager senseManager;
private PXCMFaceData faceData;
private Thread update;
private string alertMsg;
void Start(){
// Start SenseManager and configure the face module
ConfigureRealSense();
// Start the Update thread
update = new Thread(new ThreadStart(Update));
update.Start();
}
// Use this for initialization
void Update () {
Int32 facesDetected = 0;
Int32 faceH = 0;
Int32 faceW = 0;
Int32 faceX = 0;
Int32 faceY = 0;
float faceDepth = 0;
// Start AcquireFrame-ReleaseFrame loop
while (senseManager.AcquireFrame(true) >= pxcmStatus.PXCM_STATUS_NO_ERROR)
{
// Acquire color image data
PXCMCapture.Sample sample = senseManager.QuerySample();
//Bitmap colorBitmap;
PXCMImage.ImageData colorData;
sample.color.AcquireAccess(PXCMImage.Access.ACCESS_READ, PXCMImage.PixelFormat.PIXEL_FORMAT_RGB32, out colorData);
//colorBitmap = colorData.ToBitmap(0, sample.color.info.width, sample.color.info.height);
// Acquire face data
if (faceData != null)
{
faceData.Update();
facesDetected = faceData.QueryNumberOfDetectedFaces();
if (facesDetected > 0)
{
// Get the first face detected (index 0)
PXCMFaceData.Face face = faceData.QueryFaceByIndex(0);
// Retrieve face location data
PXCMFaceData.DetectionData faceDetectionData = face.QueryDetection();
if (faceDetectionData != null)
{
PXCMRectI32 faceRectangle;
faceDetectionData.QueryBoundingRect(out faceRectangle);
faceH = faceRectangle.h;
faceW = faceRectangle.w;
faceX = faceRectangle.x;
faceY = faceRectangle.y;
// Get average depth value of detected face
faceDetectionData.QueryFaceAverageDepth(out faceDepth);
}
}
}
// Update UI
//Render(colorBitmap, facesDetected, faceH, faceW, faceX, faceY, faceDepth);
Debug.Log("Face height " + faceH);
// Release the color frame
//colorBitmap.Dispose();
sample.color.ReleaseAccess(colorData);
senseManager.ReleaseFrame();
}
}
/* private void Render(Bitmap bitmap, Int32 count, Int32 h, Int32 w, Int32 x, Int32 y, float depth)
{
Debug.Log("object message");
}
*/
private void FaceAlertHandler(PXCMFaceData.AlertData alert){
alertMsg = Convert.ToString(alert.label);
}
private void ConfigureRealSense()
{
PXCMFaceModule faceModule;
PXCMFaceConfiguration faceConfig;
// Start the SenseManager and session
session = PXCMSession.CreateInstance();
senseManager = session.CreateSenseManager();
// Enable the color stream
senseManager.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR, 640, 480, 30);
// Enable the face module
senseManager.EnableFace();
faceModule = senseManager.QueryFace();
faceConfig = faceModule.CreateActiveConfiguration();
// Configure for 3D face tracking
faceConfig.SetTrackingMode(PXCMFaceConfiguration.TrackingModeType.FACE_MODE_COLOR_PLUS_DEPTH);
// Known issue: Pose isEnabled must be set to false for R200 face tracking to work correctly
faceConfig.pose.isEnabled = false;
// Track faces based on their appearance in the scene
faceConfig.strategy = PXCMFaceConfiguration.TrackingStrategyType.STRATEGY_APPEARANCE_TIME;
// Set the module to track four faces in this example
faceConfig.detection.maxTrackedFaces = 4;
// Enable alert monitoring and subscribe to alert event hander
faceConfig.EnableAllAlerts();
faceConfig.SubscribeAlert(FaceAlertHandler);
// Apply changes and initialize
faceConfig.ApplyChanges();
senseManager.Init();
faceData = faceModule.CreateOutput();
// Mirror the image
senseManager.QueryCaptureManager().QueryDevice().SetMirrorMode(PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL);
// Release resources
faceConfig.Dispose();
faceModule.Dispose();
}
private void OnDestroy(){
// Stop the Update thread
update.Abort();
// Dispose RealSense objects
faceData.Dispose();
senseManager.Dispose();
session.Dispose();
}
}
The code I have modified from the following link:
I am new at Unity and Intel RealSense and I am not aware how to structure the code. Any help with the above code or links for tutorial would be great.
Thanks,
Shivang
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Shivang,
Can you please provide the following:
1. The version of SDK and DCM are you running.
2. Verify you are using the rear facing R200 camera, not the forward facing F200 (the sample you're referencing is targeting the R200).
3. Ensure your system meets the requirements listed here: https://software.intel.com/en-us/realsense/devkit?
Also, if you have recently upgraded the SDK version on your dev system, did you ensure that your Unity project was also updated to use the most recent DLLs?
This information will help in troubleshooting the problem.
Thanks,
Bryan
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Shivang,
You'll also want to study the Unity examples provided in the RSSDK to see how the AcquireFrame method is called in a Unity script's Update() method, as opposed to a continuous thread as shown in the C#/XAML sample you've copied the code from.
-Bryan
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page