Software Archive
Read-only legacy content
17061 Discussions

Track multiple properties (ex. track objects and faces)?

Dirk_R_
Beginner
335 Views

Is it possible to track multiple properties?

For example track objects and faces at the same time?
While tracking objects I want to count how many persons are sitting in front of the computer.

I get the object tracking working, but not the face tracking.
The trackes faces are always 0.
I've tried something like this.
 

        public void EnableTracker()
        {
	   // Object tracking works anly with this resolution
            _senseManager.captureManager.FilterByStreamProfiles(PXCMCapture.StreamType.STREAM_TYPE_COLOR, 640, 480, 30);
            // Enable object tracking
            _senseManager.EnableTracker();
            // Enable face tracking
            _senseManager.EnableFace();
            
            PXCMTracker objectTracker = _senseManager.QueryTracker();
            PXCMFaceModule faceTracker = _senseManager.QueryFace();
                       
            var handler = new PXCMSenseManager.Handler
            {
                onModuleProcessedFrame = OnModuleProcessedFrame
            };

            if (_senseManager.Init(handler) >= pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                pxcmStatus objectTrackingstatus = Set2DTrackFromFiles(_fileNames, objectTracker);
                pxcmStatus faceTrackingStatus = ConfigureFace(faceTracker);

                if ((objectTrackingstatus < pxcmStatus.PXCM_STATUS_NO_ERROR) && 
		(faceTrackingStatus < pxcmStatus.PXCM_STATUS_NO_ERROR))
                {
                    _senseManager.Close();
                    _senseManager.Dispose();
                    return;
                }
                _senseManager.StreamFrames(true);
            }
        }

         private pxcmStatus OnModuleProcessedFrame(int mid, PXCMBase module, PXCMCapture.Sample sample)
        {
            // check if the callback is from the object tracking module.

            if ((mid == PXCMTracker.CUID) && !Stop)
            {
                var tracker = module.QueryInstance<PXCMTracker>();
//..
            }

            else if ((mid == PXCMFaceModule.CUID) && !Stop)
            {
                PXCMFaceModule face = (PXCMFaceModule)module.QueryInstance(PXCMFaceModule.CUID);
                PXCMFaceData fdata = face.CreateOutput();
                Int32 nfaces = fdata.QueryNumberOfDetectedFaces();
//Always = 0

            }

            // return NO_ERROR to continue, or any error to abort.

            return pxcmStatus.PXCM_STATUS_NO_ERROR;
        }

 

0 Kudos
1 Reply
Dirk_R_
Beginner
335 Views

Dirk R. wrote:

I've found the solution. It's working now.
I have to add one line *fdata.Update();*

 

        public void EnableTracker()
        {
	   // Object tracking works anly with this resolution
            _senseManager.captureManager.FilterByStreamProfiles(PXCMCapture.StreamType.STREAM_TYPE_COLOR, 640, 480, 30);
            // Enable object tracking
            _senseManager.EnableTracker();
            // Enable face tracking
            _senseManager.EnableFace();
            
            PXCMTracker objectTracker = _senseManager.QueryTracker();
            PXCMFaceModule faceTracker = _senseManager.QueryFace();
                       
            var handler = new PXCMSenseManager.Handler
            {
                onModuleProcessedFrame = OnModuleProcessedFrame
            };

            if (_senseManager.Init(handler) >= pxcmStatus.PXCM_STATUS_NO_ERROR)
            {
                pxcmStatus objectTrackingstatus = Set2DTrackFromFiles(_fileNames, objectTracker);
                pxcmStatus faceTrackingStatus = ConfigureFace(faceTracker);

                if ((objectTrackingstatus < pxcmStatus.PXCM_STATUS_NO_ERROR) && 
		(faceTrackingStatus < pxcmStatus.PXCM_STATUS_NO_ERROR))
                {
                    _senseManager.Close();
                    _senseManager.Dispose();
                    return;
                }
                _senseManager.StreamFrames(true);
            }
        }

         private pxcmStatus OnModuleProcessedFrame(int mid, PXCMBase module, PXCMCapture.Sample sample)
        {
            // check if the callback is from the object tracking module.

            if ((mid == PXCMTracker.CUID) && !Stop)
            {
                var tracker = module.QueryInstance<PXCMTracker>();
//..
            }

            else if ((mid == PXCMFaceModule.CUID) && !Stop)
            {
                PXCMFaceModule face = (PXCMFaceModule)module.QueryInstance(PXCMFaceModule.CUID);
                PXCMFaceData fdata = face.CreateOutput();
		fdata.Update();
                Int32 nfaces = fdata.QueryNumberOfDetectedFaces();
//Always = 0

            }

            // return NO_ERROR to continue, or any error to abort.

            return pxcmStatus.PXCM_STATUS_NO_ERROR;
        }

 

0 Kudos
Reply