Esempio n. 1
0
        private void leftTopDecideButton_Click(object sender, RoutedEventArgs e)
        {
            double x = leftTopXSlider.Value;
            double y = leftTopYSlider.Value;

            coord.SetGridMark(x, y, GridMarkPoint.LeftTop);
            PredCoords();
            leftTopGroup.IsEnabled = false;
        }
Esempio n. 2
0
        /// <summary>
        /// グリッドマークを定義するために描画,ダイアログボックスなどのUIを提供し,
        /// グリッドマークを定義します.
        /// <para>ステージのビュワーに,グリッドマークとして定義する座標にバツ印を描画します.
        /// そして,どのグリッドマークとして定義するかをユーザに確認し,
        /// 選択されたグリッドマークとして定義します.
        /// </para>
        /// </summary>
        /// <param name="x">定義するグリッドマークのX座標(ビュワー上の座標)</param>
        /// <param name="y">定義するグリッドマークのY座標(ビュワー上の座標)</param>
        public void ShowGridMarkDifinitionUi(double x, double y)
        {
            Line[] lines = DrawCrossMark(x, y);
            // Grid markを定義する位置を確認するダイアログボックスを表示する
            GridMarkDefinitionUtil util     = new GridMarkDefinitionUtil(coordManager);
            SelectGridMarkWindow   sgWindow = new SelectGridMarkWindow();

            sgWindow.GridMarkPoint = util.NextPoint;
            // ユーザーがGrid markを定義する位置を選択したならば,その箇所でGridf markを定義する.
            if ((Boolean)sgWindow.ShowDialog())
            {
                Camera  camera = Camera.GetInstance();
                Vector2 emulsionSystemPoint = coordManager.TransToEmulsionCoord((int)x, (int)y);
                coordManager.SetGridMark(emulsionSystemPoint, sgWindow.GridMarkPoint, camera.ArrayImage);
                WriteLine(string.Format(Properties.Strings.DefineGridMark,
                                        sgWindow.GridMarkPoint, emulsionSystemPoint.X, emulsionSystemPoint.Y));
            }
            // バツ印を消去
            emulsionViewerCanvas.Children.Remove(lines[0]);
            emulsionViewerCanvas.Children.Remove(lines[1]);
        }
Esempio n. 3
0
 private void leftTopXSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs <double> e)
 {
     try {
         double x = leftTopXSlider.Value;
         double y = leftTopYSlider.Value;
         leftTopXTextBox.Text = x.ToString();
         subCoord.SetGridMark(x, y, GridMarkPoint.LeftTop);
         DrawCircle(ellipses[(int)GridMarkPoint.LeftTop], x, y, 4, Brushes.Black);
         leftTopXTextBox.Background = Brushes.White;
     } catch (Exception) {
     }
 }
Esempio n. 4
0
        /// <summary>
        /// searchThreadが行う処理です.このメソッドを直接呼び出さないでください.
        /// </summary>
        private void searchThread_Task()
        {
            if (Started != null)
            {
                Started(this, new EventArgs());
            }

            Camera camera = Camera.GetInstance();

            camera.Start();

            for (int i = coordManager.DefinedGridMarkNum; i < CoordManager.AllGridMarksNum; ++i)
            {
                GridMarkPoint  presentMark   = utility.NextPoint;
                Vector2        nextGridCoord = utility.GetGridMarkCoord(presentMark);
                MotorControler mc            = MotorControler.GetInstance(parameterManager);
                Led            led           = Led.GetInstance();

                mc.MovePointXY(nextGridCoord, new Action(delegate {
                    mc.SetSpiralCenterPoint();
                }));
                mc.Join();

                Surface surface      = Surface.GetInstance(parameterManager);
                bool    moveContinue = true;

                mc.MoveDistance(0.1, VectorId.Z);
                mc.Join();
                Thread.Sleep(100);

                led.AdjustLight(parameterManager);

                while (moveContinue)
                {
                    mc.MoveDistance(-0.01, VectorId.Z);
                    mc.Join();
                    byte[] b    = camera.ArrayImage;
                    Mat    mat0 = new Mat(440, 512, MatType.CV_8U, b);
                    Mat    mat  = mat0.Clone();
                    Cv2.GaussianBlur(mat, mat, Cv.Size(3, 3), -1);
                    //mat.ImWrite(String.Format(@"c:\img\{0}_g.bmp",
                    //    System.DateTime.Now.ToString("yyyyMMdd_HHmmss_fff")));
                    Mat gau = mat.Clone();
                    Cv2.GaussianBlur(gau, gau, Cv.Size(31, 31), -1);
                    Cv2.Subtract(gau, mat, mat);
                    Cv2.Threshold(mat, mat, 10, 255, ThresholdType.Binary);
                    int brightness = Cv2.CountNonZero(mat);
                    //mat.ImWrite(String.Format(@"c:\img\{0}_t.bmp",
                    //    System.DateTime.Now.ToString("yyyyMMdd_HHmmss_fff")));

                    moveContinue = (brightness < 15000);
                }

                led.AdjustLight(parameterManager);


                /* グリッドマークを検出する */
                // 入力画像にて,グリッドマーク検出を行う.
                // 見つからなかった場合はNumOfSpiralSearchの回数分だけらせん移動を行い探す.
                bool continueFlag = true;
                while (continueFlag)
                {
                    GridMarkEventArgs eventArgs = new GridMarkEventArgs();
                    eventArgs.GridMarkPoint = presentMark;
                    try {
                        Vector2 viewerPoint  = GridMarkRecognizer.SearchGridMark();
                        Vector2 encoderPoint = coordManager.TransToEmulsionCoord(viewerPoint);
                        mc.MovePointXY(encoderPoint);
                        mc.Join();
                        Thread.Sleep(100);
                        viewerPoint  = GridMarkRecognizer.SearchGridMark();
                        encoderPoint = coordManager.TransToEmulsionCoord(viewerPoint);
                        mc.MovePointXY(encoderPoint);
                        mc.Join();
                        Thread.Sleep(100);

                        coordManager.SetGridMark(encoderPoint, presentMark, camera.ArrayImage);

                        continueFlag = false;
                        if (Found != null)
                        {
                            Vector3 position = mc.GetPoint();
                            eventArgs.ViewerPoint   = new Vector2(position.X, position.Y);
                            eventArgs.EncoderPoint  = encoderPoint;
                            eventArgs.GridMarkPoint = presentMark;
                            Found(this, eventArgs);
                        }
                    } catch (GridMarkNotFoundException) {
                        mc.MoveInSpiral(true);
                        continueFlag = (mc.SpiralIndex < NumOfSpiralSearch);
                        if (!continueFlag && NotFound != null)
                        {
                            NotFound(this, eventArgs);
                        }
                    }
                } // while
            }     // for

            // 座標系の生成
            coordManager.CreateCoordSystem();
        }