Exemplo n.º 1
0
 /// <summary>
 /// グリッドマーク自動検索処理でグリッドマークが見つかったときのイベントハンドラです.
 /// </summary>
 private void gridMark_Found(object sender, GridMarkEventArgs e)
 {
     Dispatcher.BeginInvoke(new Action(delegate {
         DrawCrossMark(e.ViewerPoint.X, e.ViewerPoint.Y);
         string gridmark = GridMarkDefinitionUtil.ToString(e.GridMarkPoint);
         string message  = string.Format(Properties.Strings.FoundNow, gridmark, e.EncoderPoint.X, e.EncoderPoint.Y);
         WriteLine(message);
     }));
 }
Exemplo n.º 2
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();
        }