예제 #1
0
        public void Initialize3D()
        {
            try
            {
                xdModels.Load("../../models.xml");
                foreach (XmlNode xnNode in xdModels.DocumentElement.ChildNodes)
                {
                    if (xnNode.NodeType != XmlNodeType.Element)
                    {
                        continue;
                    }
                    XmlElement xeNode = (XmlElement)xnNode;
                    MyModel mm = new MyModel();
                    mm.id = Int32.Parse(xeNode.Attributes["id"].Value);
                    mm.trans = bool.Parse(xeNode.Attributes["trans"].Value);
                    mm.path = xeNode.Attributes["path"].Value;
                    mm.code = xeNode.Attributes["code"].Value;
                    mm.rotX = Int32.Parse(xeNode.Attributes["rotX"].Value);
                    mm.rotY = Int32.Parse(xeNode.Attributes["rotY"].Value);
                    mm.rotZ = Int32.Parse(xeNode.Attributes["rotZ"].Value);
                    mm.sizeX = Int32.Parse(xeNode.Attributes["sizeX"].Value);
                    mm.sizeY = Int32.Parse(xeNode.Attributes["sizeY"].Value);
                    mm.sizeZ = Int32.Parse(xeNode.Attributes["sizeZ"].Value);
                    mm.offX = Int32.Parse(xeNode.Attributes["offX"].Value);
                    mm.offY = Int32.Parse(xeNode.Attributes["offY"].Value);
                    mm.offZ = Int32.Parse(xeNode.Attributes["offZ"].Value);

                    FileStream fs = new FileStream(mm.path, FileMode.Open, FileAccess.Read); //
                    /*
                    Viewbox vb = (Viewbox)XamlReader.Load(fs);
                    fs.Close();
                    mm.root = vb; //for INameScope
                    Viewport3D v3d = (Viewport3D)vb.Child;
                    */

                    Viewport3D v3d = (Viewport3D)XamlReader.Load(fs);
                    fs.Close();

                    mm.root = v3d;

                    // extract storyboard
                    if (v3d.Triggers.Count > 0)
                    {
                        var trigger = (EventTrigger)v3d.Triggers[0];
                        var beginSb = (BeginStoryboard)trigger.Actions[0];
                        mm.sb = beginSb.Storyboard;
                    }

                    ModelVisual3D mv3d = (ModelVisual3D)v3d.Children[0];
                    Model3DGroup m3dgScene = (Model3DGroup)mv3d.Content;
                    Model3DGroup m3dg = (Model3DGroup)m3dgScene.Children[m3dgScene.Children.Count - 1];
                    mm.m3dg = m3dg;

                    // make modelvisual3d

                    //mv3d = new ModelVisual3D();
                    //mv3d.Content = mm.m3dg;
                    //mm.mv3d = mv3d;

                    //m3dg.Transform = null;
                    Transform3DGroup t3dg = new Transform3DGroup();
                    m3dg.Transform = t3dg;

                    //change size
                    double scaleX = mm.sizeX / m3dg.Bounds.SizeX;
                    double scaleY = mm.sizeY / m3dg.Bounds.SizeY;
                    double scaleZ = mm.sizeZ / m3dg.Bounds.SizeZ;
                    scaleX = FixDouble(scaleX);
                    scaleY = FixDouble(scaleY);
                    scaleZ = FixDouble(scaleZ);
                    ScaleTransform3D stransform3D = new ScaleTransform3D(scaleX, scaleY, scaleZ);
                    mm.scaleTransform = stransform3D;
                    t3dg.Children.Add(stransform3D);

                    //move to origin
                    double offX = (-1 * m3dg.Bounds.X) - (m3dg.Bounds.SizeX / 2);
                    double offY = (-1 * m3dg.Bounds.Y) - (m3dg.Bounds.SizeY / 2);
                    double offZ = (-1 * m3dg.Bounds.Z) - (m3dg.Bounds.SizeZ / 2);
                    offX = FixDouble(offX);
                    offY = FixDouble(offY);
                    offZ = FixDouble(offZ);
                    TranslateTransform3D ttransform3d = new TranslateTransform3D(offX, offY, offZ);
                    mm.translateTranform = ttransform3d;
                    t3dg.Children.Add(ttransform3d);

                    //rotate
                    t3dg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), mm.rotX)));
                    t3dg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), mm.rotY)));
                    t3dg.Children.Add(new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 0, 1), mm.rotZ)));

                    //move to top of Z
                    t3dg.Children.Add(new TranslateTransform3D(0, 0, m3dg.Bounds.SizeZ / 2));
                    //t3dg.Children.Add(new TranslateTransform3D(0, m3dg.Bounds.SizeY / 2, 0));

                    //move to offset
                    t3dg.Children.Add(new TranslateTransform3D(mm.offX, mm.offY, mm.offZ)); //0,0,0

                    AddModel(mm);

                    dicModels.Add(mm.id, mm);
                }
                Console.WriteLine("{0} Models added to the 3D model dictionary.", dicModels.Count);

                // Map 3d models to images
                ModelMapping();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

            previousMarkerInfo = new MarkerInfo(-1, new Point3D());
            currentMarkerInfo = previousMarkerInfo;
        }
예제 #2
0
        private void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            // Clear views
            this.detectedImage.Source = null;
            this.recognizedImage.Source = null;
            this.progressBar_confidence.Value = 0;
            this.label_tanimoto.Content = "";

            // mindwave
            if (thinkGear != null)
            {
                thinkGear.UpdateState();
                float attention = thinkGear.ThinkGearState.Attention;
                float meditation = thinkGear.ThinkGearState.Meditation;

                this.progressBar_attention.Value = attention;
                this.progressBar_meditation.Value = meditation;
                this.label_attention.Content = attention;
                this.label_meditation.Content = meditation;

                if (attention > 50 && meditation > 50)
                {
                    if(JediMode) Energized = true;
                    this.button_jedi.Background = Brushes.Green;
                }
                else
                {
                    Energized = false;
                    this.button_jedi.Background = Brushes.Red;
                }
            }

            textBlock_timeout.Text = stopwatch_model.ElapsedMilliseconds.ToString();
            if (stopwatch_model.ElapsedMilliseconds > modelLife)
            {
                //MyModel mm = dicModels[currentMarkerInfo.modelId];
                modeler.Children.Clear();
                isFlushed = true;
                previousMarkerInfo.modelId = -1;
            }

            if (cameraRunning == true)
            {
                #region FPSMeasurement
                if (frameCounter++ == 0)
                {
                    // Starting timing.
                    stopwatch.Start();
                }

                // Determine frame rate in fps (frames per second).
                long frameRate = (long)(frameCounter / this.stopwatch.Elapsed.TotalSeconds);
                if (frameRate > 0)
                {
                    // Update elapsed time, number of frames, and frame rate.
                    this.textBlock_VideoPerformance.Text = string.Format("Elapsed : {0}, Frame : {1}, FPS : {2}",
                        stopwatch.Elapsed.ToString(),
                        frameCounter,
                        frameRate);
                }
                #endregion FPSMeasurement

                cam.InitializeCapture();
                cam.getFrame();
                int id = -1;
                using (IplImage image = cam.getFrame())
                {
                    if (image != null)
                    {
                        // Detection
                        CvRect roi;
                        CvPoint[] pts;
                        IplImage detected = DetectImage(image, out roi, out pts);
                        if (takeSnapShotDetected)
                        {
                            Cv.SaveImage(@"C:\Users\Pye\Desktop\TrainingSet\detected.bmp", detected);
                            takeSnapShotDetected = false;
                        }

                        int roiArea = roi.Size.Width * roi.Size.Height;
                        //Console.WriteLine(roiArea.ToString());  // Debug
                        if (detected != null && roiArea > 10000)
                        {
                            OpenCVSharpHelper.CorrectGamma(detected, detected, slider_Gamma.Value);
                            detectedImage.Source = OpenCVSharpHelper.ToBitmapSource(detected);

                            // Recognition
                            if (_som.IsTrained)
                            {
                                id = RecognizeImage(detected);
                            }

                            // Draw ROI (after recognition)
                            if (displayROICheckbox.IsChecked == true)
                            {
                                OpenCVSharpHelper.DrawROI(image, roi, pts);
                            }

                            detected.Dispose();
                        }

                        // Display 3D
                        if (Render3DCheckbox.IsChecked == true)
                        {
                            if (id != -1) Cv.FillPoly(image, new CvPoint[][] { pts }, CvColor.Gray);
                            // Find the center of roi
                            CvPoint renderPt = new CvPoint(roi.Left + (roi.Width / 2), roi.Top + (roi.Height / 2));
                            Point3D point3D = GetPoint3D(new Point(renderPt.X, renderPt.Y), MainViewport);

                            previousMarkerInfo = currentMarkerInfo;
                            currentMarkerInfo = new MarkerInfo(id, point3D);
                            UpdateViewport();
                        }
                        video.Source = OpenCVSharpHelper.ToBitmapSource(image);
                    }

                }
            }
            else
            {
                stopwatch.Reset();
                cam.DisposeCapture();
            }

            /*/ Debug 3D
            CvPoint tmpPt = new CvPoint(200, 200);
            Point3D pt3D = GetPoint3D(new Point(tmpPt.X, tmpPt.Y), MainViewport);

            previousMarkerInfo = currentMarkerInfo;
            currentMarkerInfo = new MarkerInfo(5, pt3D);
            UpdateViewport();
            */
        }