private void InitializeFace() { // 顔検出を有効にする var sts = senceManager.EnableFace(); if (sts < pxcmStatus.PXCM_STATUS_NO_ERROR) { throw new Exception("顔検出の有効化に失敗しました"); } //顔検出器を生成する var faceModule = senceManager.QueryFace(); //顔検出のプロパティを取得 PXCMFaceConfiguration config = faceModule.CreateActiveConfiguration(); config.SetTrackingMode(PXCMFaceConfiguration.TrackingModeType.FACE_MODE_COLOR_PLUS_DEPTH); config.ApplyChanges(); // パイプラインを初期化する pxcmStatus ret = senceManager.Init(); if (ret < pxcmStatus.PXCM_STATUS_NO_ERROR) { throw new Exception("初期化に失敗しました"); } // デバイス情報の取得 PXCMCapture.Device device = senceManager.QueryCaptureManager().QueryDevice(); if (device == null) { throw new Exception("deviceの生成に失敗しました"); } // ミラー表示にする device.SetMirrorMode(PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL); PXCMCapture.DeviceInfo deviceInfo; device.QueryDeviceInfo(out deviceInfo); if (deviceInfo.model == PXCMCapture.DeviceModel.DEVICE_MODEL_IVCAM) { device.SetDepthConfidenceThreshold(1); device.SetIVCAMFilterOption(6); device.SetIVCAMMotionRangeTradeOff(21); } config.detection.isEnabled = true; config.detection.maxTrackedFaces = DETECTION_MAXFACES; config.QueryExpressions().Enable(); //追加:顔の姿勢情報取得を可能にする config.QueryExpressions().EnableAllExpressions(); //追加:すべての表出情報を取得可能にする config.QueryExpressions().properties.maxTrackedFaces = EXPRESSION_MAXFACES; //追加:二人までの表出を取得可能に設定する config.ApplyChanges(); faceData = faceModule.CreateOutput(); }
private void CreateResolutionMap() { ColorResolutions = new Dictionary <string, IEnumerable <Tuple <PXCMImage.ImageInfo, PXCMRangeF32> > >(); var desc = new PXCMSession.ImplDesc { group = PXCMSession.ImplGroup.IMPL_GROUP_SENSOR, subgroup = PXCMSession.ImplSubgroup.IMPL_SUBGROUP_VIDEO_CAPTURE }; for (int i = 0; ; i++) { PXCMSession.ImplDesc desc1; if (Session.QueryImpl(desc, i, out desc1) < pxcmStatus.PXCM_STATUS_NO_ERROR) { break; } PXCMCapture capture; if (Session.CreateImpl(desc1, out capture) < pxcmStatus.PXCM_STATUS_NO_ERROR) { continue; } for (int j = 0; ; j++) { PXCMCapture.DeviceInfo info; if (capture.QueryDeviceInfo(j, out info) < pxcmStatus.PXCM_STATUS_NO_ERROR) { break; } PXCMCapture.Device device = capture.CreateDevice(j); if (device == null) { throw new Exception("PXCMCapture.Device null"); } var deviceResolutions = new List <Tuple <PXCMImage.ImageInfo, PXCMRangeF32> >(); for (int k = 0; k < device.QueryStreamProfileSetNum(PXCMCapture.StreamType.STREAM_TYPE_COLOR); k++) { PXCMCapture.Device.StreamProfileSet profileSet; device.QueryStreamProfileSet(PXCMCapture.StreamType.STREAM_TYPE_COLOR, k, out profileSet); PXCMCapture.DeviceInfo dinfo; device.QueryDeviceInfo(out dinfo); var currentRes = new Tuple <PXCMImage.ImageInfo, PXCMRangeF32>(profileSet.color.imageInfo, profileSet.color.frameRate); if (IsProfileSupported(profileSet, dinfo)) { continue; } if (SupportedColorResolutions.Contains(new Tuple <int, int>(currentRes.Item1.width, currentRes.Item1.height))) { deviceResolutions.Add(currentRes); } } try { ColorResolutions.Add(info.name, deviceResolutions); } catch (Exception e) { e.ToString(); } device.Dispose(); } capture.Dispose(); } }
private bool PopulateDeviceFromFileMenu() { devices.Clear(); devices_iuid.Clear(); PXCMSession.ImplDesc desc = new PXCMSession.ImplDesc(); desc.group = PXCMSession.ImplGroup.IMPL_GROUP_SENSOR; desc.subgroup = PXCMSession.ImplSubgroup.IMPL_SUBGROUP_VIDEO_CAPTURE; PXCMSession.ImplDesc desc1; PXCMCapture.Device device = null; PXCMCapture.DeviceInfo dinfo; PXCMSenseManager pp = PXCMSenseManager.CreateInstance(); if (pp == null) { UpdateStatus("Init Failed"); return(false); } if (pp.captureManager == null) { pp.Dispose(); UpdateStatus("Init Failed"); return(false); } try { if (session.QueryImpl(desc, 0, out desc1) < pxcmStatus.PXCM_STATUS_NO_ERROR) { throw null; } if (pp.captureManager.SetFileName(filename, false) < pxcmStatus.PXCM_STATUS_NO_ERROR) { throw null; } if (pp.captureManager.LocateStreams() < pxcmStatus.PXCM_STATUS_NO_ERROR) { throw null; } device = pp.captureManager.QueryDevice(); if (device != null) { device.QueryDeviceInfo(out dinfo); } else { pp.Dispose(); UpdateStatus("Init Failed"); return(false); } } catch { pp.Dispose(); UpdateStatus("Init Failed"); return(false); } DeviceMenu.DropDownItems.Clear(); ToolStripMenuItem sm1 = new ToolStripMenuItem(dinfo.name, null, new EventHandler(Device_Item_Click)); devices[sm1] = dinfo; devices_iuid[sm1] = desc1.iuid; DeviceMenu.DropDownItems.Add(sm1); sm1 = new ToolStripMenuItem("Playback from the file : ", null); sm1.Enabled = false; DeviceMenu.DropDownItems.Add(sm1); sm1 = new ToolStripMenuItem(filename, null); sm1.Enabled = false; DeviceMenu.DropDownItems.Add(sm1); if (DeviceMenu.DropDownItems.Count > 0) { (DeviceMenu.DropDownItems[0] as ToolStripMenuItem).Checked = true; } // populate color depth menu from the file profiles.Clear(); ColorMenu.DropDownItems.Clear(); DepthMenu.DropDownItems.Clear(); PXCMCapture.Device.StreamProfileSet profile = new PXCMCapture.Device.StreamProfileSet(); if (dinfo.streams.HasFlag(PXCMCapture.StreamType.STREAM_TYPE_COLOR)) { for (int p = 0; ; p++) { if (device.QueryStreamProfileSet(PXCMCapture.StreamType.STREAM_TYPE_COLOR, p, out profile) < pxcmStatus.PXCM_STATUS_NO_ERROR) { break; } PXCMCapture.Device.StreamProfile sprofile = profile[PXCMCapture.StreamType.STREAM_TYPE_COLOR]; sm1 = new ToolStripMenuItem(ProfileToString(sprofile), null, new EventHandler(Color_Item_Click)); profiles[sm1] = sprofile; ColorMenu.DropDownItems.Add(sm1); } } if (((int)dinfo.streams & (int)PXCMCapture.StreamType.STREAM_TYPE_DEPTH) != 0) { for (int p = 0; ; p++) { if (device.QueryStreamProfileSet(PXCMCapture.StreamType.STREAM_TYPE_DEPTH, p, out profile) < pxcmStatus.PXCM_STATUS_NO_ERROR) { break; } PXCMCapture.Device.StreamProfile sprofile = profile[PXCMCapture.StreamType.STREAM_TYPE_DEPTH]; if (sprofile.options != (PXCMCapture.Device.StreamOption) 0x20000) // do not show Depth Confidence { sm1 = new ToolStripMenuItem(ProfileToString(sprofile), null, new EventHandler(Depth_Item_Click)); profiles[sm1] = sprofile; DepthMenu.DropDownItems.Add(sm1); } } } GetCheckedDevice(); pp.Close(); pp.Dispose(); return(true); }
/* Using PXCMSenseManager to handle data */ public void SimplePipeline() { form.UpdateInfo(String.Empty, Color.Black); bool liveCamera = false; bool flag = true; PXCMSenseManager instance = null; _disconnected = false; instance = form.g_session.CreateSenseManager(); if (instance == null) { form.UpdateStatus("Failed creating SenseManager"); return; } if (form.GetRecordState()) { instance.captureManager.SetFileName(form.GetFileName(), true); PXCMCapture.DeviceInfo info; if (form.Devices.TryGetValue(form.GetCheckedDevice(), out info)) { instance.captureManager.FilterByDeviceInfo(info); } } else if (form.GetPlaybackState()) { instance.captureManager.SetFileName(form.GetFileName(), false); instance.captureManager.SetRealtime(false); } else { PXCMCapture.DeviceInfo info; if (String.IsNullOrEmpty(form.GetCheckedDevice())) { form.UpdateStatus("Device Failure"); return; } if (form.Devices.TryGetValue(form.GetCheckedDevice(), out info)) { instance.captureManager.FilterByDeviceInfo(info); } liveCamera = true; } /* Set Module */ pxcmStatus status = instance.EnableHand(form.GetCheckedModule()); PXCMHandModule handAnalysis = instance.QueryHand(); if (status != pxcmStatus.PXCM_STATUS_NO_ERROR || handAnalysis == null) { form.UpdateStatus("Failed Loading Module"); return; } PXCMSenseManager.Handler handler = new PXCMSenseManager.Handler(); handler.onModuleProcessedFrame = new PXCMSenseManager.Handler.OnModuleProcessedFrameDelegate(OnNewFrame); PXCMHandConfiguration handConfiguration = handAnalysis.CreateActiveConfiguration(); PXCMHandData handData = handAnalysis.CreateOutput(); if (handConfiguration == null) { form.UpdateStatus("Failed Create Configuration"); return; } if (handData == null) { form.UpdateStatus("Failed Create Output"); return; } if (form.getInitGesturesFirstTime() == false) { int totalNumOfGestures = handConfiguration.QueryGesturesTotalNumber(); if (totalNumOfGestures > 0) { this.form.UpdateGesturesToList("", 0); for (int i = 0; i < totalNumOfGestures; i++) { string gestureName = string.Empty; if (handConfiguration.QueryGestureNameByIndex(i, out gestureName) == pxcmStatus.PXCM_STATUS_NO_ERROR) { this.form.UpdateGesturesToList(gestureName, i + 1); } } form.setInitGesturesFirstTime(true); form.UpdateGesturesListSize(); } } FPSTimer timer = new FPSTimer(form); form.UpdateStatus("Init Started"); if (handAnalysis != null && instance.Init(handler) == pxcmStatus.PXCM_STATUS_NO_ERROR) { PXCMCapture.DeviceInfo dinfo; PXCMCapture.Device device = instance.captureManager.device; if (device != null) { pxcmStatus result = device.QueryDeviceInfo(out dinfo); if (result == pxcmStatus.PXCM_STATUS_NO_ERROR && dinfo != null && dinfo.model == PXCMCapture.DeviceModel.DEVICE_MODEL_IVCAM) { device.SetDepthConfidenceThreshold(1); device.SetMirrorMode(PXCMCapture.Device.MirrorMode.MIRROR_MODE_DISABLED); device.SetIVCAMFilterOption(6); } _maxRange = device.QueryDepthSensorRange().max; } if (handConfiguration != null) { handConfiguration.EnableAllAlerts(); handConfiguration.EnableSegmentationImage(true); handConfiguration.ApplyChanges(); handConfiguration.Update(); } form.UpdateStatus("Streaming"); int frameCounter = 0; int frameNumber = 0; string nextPageGesture, previousPageGesture, firstPageGesture, endPageGesture; HandsRecognition.Hand nextHand, previousHand, firstHand, endHand; while (!form.stop) { form.GetHandType(out nextHand, out previousHand, out firstHand, out endHand); form.GetGestureName(out nextPageGesture, out previousPageGesture, out firstPageGesture, out endPageGesture); handConfiguration.DisableAllGestures(); if (string.IsNullOrEmpty(nextPageGesture) == false && handConfiguration.IsGestureEnabled(nextPageGesture) == false) { handConfiguration.EnableGesture(nextPageGesture, true); NextPageGesture.Gesture = nextPageGesture; NextPageGesture.handler = form.NextPage; NextPageGesture.HandType = nextHand; } if (string.IsNullOrEmpty(previousPageGesture) == false && handConfiguration.IsGestureEnabled(previousPageGesture) == false) { handConfiguration.EnableGesture(previousPageGesture, true); PreviousPageGesture.Gesture = previousPageGesture; PreviousPageGesture.handler = form.PreviousPage; PreviousPageGesture.HandType = previousHand; } if (string.IsNullOrEmpty(firstPageGesture) == false && handConfiguration.IsGestureEnabled(firstPageGesture) == false) { handConfiguration.EnableGesture(firstPageGesture, true); FirstPageGesture.Gesture = firstPageGesture; FirstPageGesture.handler = form.FirstPage; FirstPageGesture.HandType = firstHand; } if (string.IsNullOrEmpty(endPageGesture) == false && handConfiguration.IsGestureEnabled(endPageGesture) == false) { handConfiguration.EnableGesture(endPageGesture, true); EndPageGesture.Gesture = endPageGesture; EndPageGesture.handler = form.EndPage; EndPageGesture.HandType = endHand; } handConfiguration.ApplyChanges(); if (instance.AcquireFrame(true) < pxcmStatus.PXCM_STATUS_NO_ERROR) { break; } frameCounter++; if (!DisplayDeviceConnection(!instance.IsConnected())) { if (handData != null) { handData.Update(); } PXCMCapture.Sample sample = instance.QueryHandSample(); if (sample != null && sample.depth != null) { DisplayPicture(sample.depth, handData); if (handData != null) { frameNumber = liveCamera ? frameCounter : instance.captureManager.QueryFrameIndex(); DisplayJoints(handData); DisplayGesture(handData, frameNumber); DisplayAlerts(handData, frameNumber); } form.UpdatePanel(); } timer.Tick(); } instance.ReleaseFrame(); } // Clean Up if (handData != null) { handData.Dispose(); } if (handConfiguration != null) { handConfiguration.Dispose(); } } else { form.UpdateStatus("Init Failed"); flag = false; } foreach (PXCMImage pxcmImage in m_images) { pxcmImage.Dispose(); } instance.Close(); instance.Dispose(); if (flag) { form.UpdateStatus("Stopped"); } }
/// <summary> /// 取得所有裝置支援的顏色與解析度 /// </summary> private PXCMCapture.Device.StreamProfileSet[][] GetDeviceStreamProfiles() { var result = new List <PXCMCapture.Device.StreamProfileSet[]>(); var desc = new PXCMSession.ImplDesc { group = PXCMSession.ImplGroup.IMPL_GROUP_SENSOR, subgroup = PXCMSession.ImplSubgroup.IMPL_SUBGROUP_VIDEO_CAPTURE }; for (int i = 0; ; i++) { PXCMSession.ImplDesc desc1; if (RealSenseObjects.Session.QueryImpl(desc, i, out desc1) < pxcmStatus.PXCM_STATUS_NO_ERROR) { break; } PXCMCapture capture; if (RealSenseObjects.Session.CreateImpl(desc1, out capture) < pxcmStatus.PXCM_STATUS_NO_ERROR) { continue; } for (int j = 0; ; j++) { PXCMCapture.DeviceInfo info; if (capture.QueryDeviceInfo(j, out info) < pxcmStatus.PXCM_STATUS_NO_ERROR) { break; } PXCMCapture.Device device = capture.CreateDevice(j); if (device == null) { throw new Exception("PXCMCapture.Device null"); } var deviceResolutions = new List <PXCMCapture.Device.StreamProfileSet>(); for (int k = 0; k < device.QueryStreamProfileSetNum(PXCMCapture.StreamType.STREAM_TYPE_COLOR); k++) { PXCMCapture.Device.StreamProfileSet profileSet; device.QueryStreamProfileSet(PXCMCapture.StreamType.STREAM_TYPE_COLOR, k, out profileSet); PXCMCapture.DeviceInfo dinfo; device.QueryDeviceInfo(out dinfo); if (IsProfileSupported(profileSet, dinfo)) { continue; } deviceResolutions.Add(profileSet); } try { result.Add(deviceResolutions.ToArray()); } catch (Exception e) { } device.Dispose(); } capture.Dispose(); } return(result.ToArray()); }
private void InitializeFace() { // 顔検出を有効にする var sts = senceManager.EnableFace(); if (sts < pxcmStatus.PXCM_STATUS_NO_ERROR) { throw new Exception("顔検出の有効化に失敗しました"); } //顔検出器を生成する var faceModule = senceManager.QueryFace(); //顔検出のプロパティを取得 PXCMFaceConfiguration config = faceModule.CreateActiveConfiguration(); config.SetTrackingMode(PXCMFaceConfiguration.TrackingModeType.FACE_MODE_COLOR_PLUS_DEPTH); config.ApplyChanges(); //追加:顔識別のプロパティを取得 PXCMFaceConfiguration.RecognitionConfiguration rcfg = config.QueryRecognition(); //追加:顔識別を有効化 rcfg.Enable(); //追加:顔識別用データベースの用意 PXCMFaceConfiguration.RecognitionConfiguration.RecognitionStorageDesc desc = new PXCMFaceConfiguration.RecognitionConfiguration.RecognitionStorageDesc(); desc.maxUsers = 10; rcfg.CreateStorage("MyDB", out desc); rcfg.UseStorage("MyDB"); //追加:顔識別の登録の設定を行う rcfg.SetRegistrationMode(PXCMFaceConfiguration.RecognitionConfiguration.RecognitionRegistrationMode.REGISTRATION_MODE_CONTINUOUS); // パイプラインを初期化する pxcmStatus ret = senceManager.Init(); if (ret < pxcmStatus.PXCM_STATUS_NO_ERROR) { throw new Exception("初期化に失敗しました"); } // デバイス情報の取得 PXCMCapture.Device device = senceManager.QueryCaptureManager().QueryDevice(); if (device == null) { throw new Exception("deviceの生成に失敗しました"); } // ミラー表示にする device.SetMirrorMode(PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL); PXCMCapture.DeviceInfo deviceInfo; device.QueryDeviceInfo(out deviceInfo); if (deviceInfo.model == PXCMCapture.DeviceModel.DEVICE_MODEL_IVCAM) { device.SetDepthConfidenceThreshold(1); device.SetIVCAMFilterOption(6); device.SetIVCAMMotionRangeTradeOff(21); } config.detection.isEnabled = true; config.detection.maxTrackedFaces = DETECTION_MAXFACES; config.QueryRecognition().Enable(); config.ApplyChanges(); faceData = faceModule.CreateOutput(); }