예제 #1
0
        /*public void saveToCSV(string step)
         * {
         *  var csv = new StringBuilder();
         *
         *  // check if scnes dir exists
         *  if (!Directory.Exists(ProjectConstants.STUDY_DIR))
         *  {
         *      // if not create it
         *      Directory.CreateDirectory(ProjectConstants.STUDY_DIR);
         *  }
         *  string path = ProjectConstants.STUDY_DIR+ "\\PBD_"+ this.m_CsvNameTime +".csv";
         *
         *
         *  //var newLine = string.Format("{0},{1},{2}{3}", PBDManager.Instance.StartTime.ToString(), PBDManager.Instance.EndTime.ToString(), PBDManager.Instance.DurationTime.ToString(), Environment.NewLine);
         *  long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
         *  var newLine = string.Format("{0},{1},{2}{3}", step, now, now - m_CsvNameTime, Environment.NewLine);
         *  csv.Append(newLine);
         *
         *  // File.WriteAllText( path, csv.ToString());
         *  File.AppendAllText(path, csv.ToString());
         * }*/

        public void checkAutomaticallyForAssemblyStep()
        {
            // PDB active?
            if (StateManager.Instance.State == AllEnums.State.RECORD && !m_BlockAssemblyCheck && !m_BlockUntilObjectIsBackAgain)
            {
                long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

                if (now - m_LlastWithdrawlTimestampInMillis > 10000) // was last withdrawl at least 10 seconds ago?
                {
                    if (now - m_lastWorkingTimestampInMillis > 3000) //threshold
                    {
                        //did we already take a snapshot of this period
                        if (!m_AlreadyDetectedAssembly)
                        {
                            // user might be waiting for automatically created step
                            // check if something happened
                            AssemblyZone z = AssemblyZoneManager.Instance.createAssemblyZoneFromChanges();

                            if (z != null)
                            {
                                // block assembly until next pick
                                m_BlockAssemblyCheck = true;

                                // create a scene for displaying assemblyzone and add it to workflow
                                Scene.Scene autoScene = new Scene.Scene();
                                autoScene.Add(z.getDrawable(true));
                                AdaptiveScene adaptiveScene = new AdaptiveScene(autoScene, AdaptivityLevel.AdaptivityLevels.FirstOrDefault());
                                EditWorkflowManager.Instance.createStep(AllEnums.PBD_Mode.ASSEMBLY_DONE, adaptiveScene, "Zone-" + z.Id, z.TriggerMessage);
                                AssemblyZoneManager.Instance.CurrentLayout.AssemblyZones.Add(z);
                                m_AlreadyDetectedAssembly = true;

                                // temporarilty display feedback that zone was detected
                                Scene.Scene     feedbackScene = new Scene.Scene();
                                Scene.SceneText text          = new Scene.SceneText(0.5 * KinectManager.Instance.ImageSize.Width, 0.5 * KinectManager.Instance.ImageSize.Height, "Step created", System.Windows.Media.Color.FromRgb(255, 255, 255), 10.0, new System.Windows.Media.FontFamily("Arial"));
                                feedbackScene.Add(text);
                                SceneManager.Instance.TemporaryFeedbackScene = feedbackScene;
                                SceneManager.Instance.DisplayTempFeedback    = true;
                                m_CreatedFeedbackTimestampInMillis           = now;
                            }

                            // create a new snapshot
                            if (!m_IsUserWorking)
                            {
                                AssemblyZoneManager.Instance.createDepthSnapshot();
                            }
                        }
                    }
                }
            }

            // maybe find a better place for this:
            // check if the feedback should still be displayed
            long nower = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

            if (nower - m_CreatedFeedbackTimestampInMillis > m_FeedbackShow_Time)
            {
                SceneManager.Instance.DisplayTempFeedback = false;
                SceneManager.Instance.TemporaryFeedbackScene.Clear();
            }
        }
예제 #2
0
        private void ViewPort_Drop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent("SceneItem"))
            {
                string item = e.Data.GetData("SceneItem") as string;

                var pos    = e.GetPosition(m_Viewport);
                var hitRes = VisualTreeHelper.HitTest(m_Viewport, pos);
                RayMeshGeometry3DHitTestResult rayMeshRes = hitRes as RayMeshGeometry3DHitTestResult;
                if (rayMeshRes != null)
                {
                    double x = (double)rayMeshRes.PointHit.X;
                    double y = (double)rayMeshRes.PointHit.Y;

                    Scene.SceneItem s = null;
                    if (item == typeof(SceneRect).ToString())
                    {
                        s = new Scene.SceneRect(x, y, 50, 50, System.Windows.Media.Color.FromRgb(0, 255, 0));
                    }
                    else if (item == typeof(SceneText).ToString())
                    {
                        s = new Scene.SceneText(x, y, "Text", System.Windows.Media.Color.FromRgb(255, 255, 255), 10.0, new FontFamily("Arial"));
                    }
                    else if (item == typeof(SceneTextViewer).ToString())
                    {
                        s = new Scene.SceneTextViewer(x, y, 0.2, 0.2, "Text", new FontFamily("Arial"), 10.0, System.Windows.Media.Color.FromRgb(255, 255, 255));
                    }
                    else if (item == typeof(SceneCircle).ToString())
                    {
                        s = new Scene.SceneCircle(x, y, 10, 0.0, Math.PI * 2.0, System.Windows.Media.Color.FromRgb(0, 255, 0));
                    }
                    else if (item == typeof(SceneImage).ToString())
                    {
                        s = new Scene.SceneImage(x, y, 100, 100, null);
                    }
                    else if (item == typeof(SceneVideo).ToString())
                    {
                        s = new Scene.SceneVideo(x, y, 100, 100, null);
                    }
                    else if (item == typeof(ScenePolygon).ToString())
                    {
                        s = new Scene.ScenePolygon(new Polygon(new Vector2[] { new Vector2(0 + x, 0 + y), new Vector2(50 + x, 50 + y), new Vector2(50 + x, y) }), System.Windows.Media.Color.FromRgb(0, 255, 0));
                    }
                    else if (item == typeof(SceneAudio).ToString())
                    {
                        s = new Scene.SceneAudio(null);
                    }

                    if (s != null)
                    {
                        SceneManager.Instance.CurrentScene.Add(s);
                    }
                    else
                    {
                        throw new NotImplementedException();
                    }
                }
            }
        }
예제 #3
0
        public void createEndScene(string pName, string pEndcondition)
        {
            // create a scene for displaying the withdrawel from the box
            Scene.Scene     autoScene = new Scene.Scene();
            Scene.SceneText text      = new Scene.SceneText(0.5 * KinectManager.Instance.ImageSize.Width, 0.5 * KinectManager.Instance.ImageSize.Height, "Fertig", System.Windows.Media.Color.FromRgb(255, 255, 255), 10.0, new System.Windows.Media.FontFamily("Arial"));
            autoScene.Add(text);

            AdaptiveScene adaptiveScene = new AdaptiveScene(autoScene, AdaptivityLevel.AdaptivityLevels.FirstOrDefault());

            createStep(AllEnums.PBD_Mode.END_CONDITION, adaptiveScene, pName, pEndcondition);
        }
예제 #4
0
        public double fps   = 0;   // current FPS

        private DebugInformationManager()
        {
            // display GUI FPS
            SceneText fpsInfo = new Scene.SceneText(0.43, 0.013, "DebugFPS:", System.Windows.Media.Color.FromRgb(255, 0, 0), 10, new System.Windows.Media.FontFamily("Arial"));

            SceneManager.Instance.temporarylyDisplaySceneItem(fpsInfo);

            // display Leap FPS
            SceneText leapFpsInfo = new Scene.SceneText(0.43, 0.013, "LeapFPS:", System.Windows.Media.Color.FromRgb(255, 0, 0), 10, new System.Windows.Media.FontFamily("Arial"));

            SceneManager.Instance.temporarylyDisplaySceneItem(leapFpsInfo);
        }
예제 #5
0
        public Scene.SceneText createSceneTextHeadingObjectDetectionZone(ObjectDetectionZone z, string text)
        {
            int x_offset = SettingsManager.Instance.Settings.SettingsTable.KinectDrawing_AssemblyArea.X;
            int y_offset = SettingsManager.Instance.Settings.SettingsTable.KinectDrawing_AssemblyArea.Y;

            float h = ((float)z.Height / (float)SettingsManager.Instance.Settings.SettingsTable.KinectDrawing_AssemblyArea.Height);
            float w = ((float)z.Width / (float)SettingsManager.Instance.Settings.SettingsTable.KinectDrawing_AssemblyArea.Width);
            float x = ((float)(z.X - x_offset) / (float)SettingsManager.Instance.Settings.SettingsTable.KinectDrawing_AssemblyArea.Width);
            float y = 1.0f - h - ((float)(z.Y - y_offset) / (float)SettingsManager.Instance.Settings.SettingsTable.KinectDrawing_AssemblyArea.Height);

            Color c = System.Windows.Media.Color.FromRgb(255, 255, 0); // yellow

            Scene.SceneText textItem = new Scene.SceneText(x, y, text, c, 10.0, new FontFamily("Arial"));
            return(textItem);
        }
예제 #6
0
        //Code to be called within a certain part of the main ProccessFrame Method
        public void Object_ProccessFrame_Draw(bool hasToUpdateUI, Image <Bgra, Byte> pImage)
        {
            if (m_TakeScreenShotFromZone)
            {
                if (m_SelectedZone != null)
                {
                    long now = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
                    if (now - m_ScreenshotTakenTimestamp > 200) // take picture after 200ms - frame should be gone by then
                    {
                        // crop image
                        Rectangle boundingBox = new Rectangle(m_SelectedZone.X, m_SelectedZone.Y, m_SelectedZone.Width, m_SelectedZone.Height);
                        pImage.ROI = boundingBox;

                        ObjectDetectionManager.Instance.SaveAndAddObjectToDatabase(pImage);

                        SceneManager.Instance.DisableObjectScenes = false;
                        m_TakeScreenShotFromZone = false;
                        m_SelectedZone           = null;

                        CvInvoke.cvResetImageROI(pImage);
                    }
                }
            }

            // first clear all the feedback from previous frame
            SceneManager.Instance.TemporaryObjectsTextScene.Clear();

            // should we check for objects?
            if (SettingsManager.Instance.Settings.ObjectsRecognizeObject &&
                ObjectDetectionManager.Instance.CurrentLayout != null &&
                hasToUpdateUI)
            {
                // walk over all zones
                foreach (ObjectDetectionZone zone in ObjectDetectionManager.Instance.CurrentLayout.ObjectDetectionZones)
                {
                    // crop image
                    Rectangle boundingBox = new Rectangle(zone.X, zone.Y, zone.Width, zone.Height);
                    pImage.ROI = boundingBox;
                    Image <Gray, byte> grayscaleImage = pImage.Copy().Convert <Gray, byte>();
                    CvInvoke.cvResetImageROI(pImage);

                    // walk over all objects
                    foreach (TrackableObject obj in Database.DatabaseManager.Instance.Objects)
                    {
                        if (ObjectDetectionManager.Instance.RecognizeObject(obj.EmguImage, grayscaleImage))
                        {
                            // YAY we found an object
                            // trigger stuff
                            WorkflowManager.Instance.OnObjectRecognized(obj);

                            // update last seen timestamp
                            obj.LastSeenTimeStamp = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
                            obj.LastSeenZoneId    = zone.Id;

                            // display visual feedback
                            Scene.SceneText textItem = ObjectDetectionManager.Instance.createSceneTextHeadingObjectDetectionZone(zone, obj.Name);
                            SceneManager.Instance.TemporaryObjectsTextScene.Add(textItem);
                        }
                    }
                }
            }

            CvInvoke.cvResetImageROI(pImage);
            if (ObjectDetectionManager.Instance.CurrentLayout != null)
            {
                if (SettingsManager.Instance.Settings.ObjectsVisualFeedbackDisplay && (ObjectDetectionManager.Instance.CurrentLayout.ObjectDetectionZones.Count != 0))
                {
                    //write boxes
                    MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5);
                    foreach (ObjectDetectionZone z in ObjectDetectionManager.Instance.CurrentLayout.ObjectDetectionZones)
                    {
                        // draw ID
                        pImage.Draw(z.Id + "", ref font, new System.Drawing.Point(z.X, z.Y), new Bgra(0, 0, 0, 0));
                        // draw Frame
                        if (z.wasRecentlyTriggered())
                        {
                            pImage.Draw(new Rectangle(z.X, z.Y, z.Width, z.Height), new Bgra(0, 255, 255, 0), 0);
                        }
                        else
                        {
                            pImage.Draw(new Rectangle(z.X, z.Y, z.Width, z.Height), new Bgra(255, 255, 255, 0), 0);
                        }
                    }
                }

                UtilitiesImage.ToImage(image, pImage);

                if (SettingsManager.Instance.Settings.ObjectsVisualFeedbackProject)
                {
                    SceneManager.Instance.TemporaryObjectsScene.Clear();
                    // add a temporary scene for each box
                    foreach (ObjectDetectionZone z in ObjectDetectionManager.Instance.CurrentLayout.ObjectDetectionZones)
                    {
                        // false = call from the display loop
                        SceneManager.Instance.TemporaryObjectsScene.Add(ObjectDetectionManager.Instance.createSceneBoxForObjectDetectionZone(z, false));
                    }
                }
                else
                {
                    SceneManager.Instance.TemporaryObjectsScene.Clear();
                }
            }
        }