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; }
/// <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]); }
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) { } }
/// <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(); }