public void PredCoords() { GridMarkDefinitionUtil util = new GridMarkDefinitionUtil(coord); for (int i = 0; i < CoordManager.AllGridMarksNum; ++i) { GridMarkPoint mark = (GridMarkPoint)i; Vector2 position = util.GetGridMarkCoord(mark); if (coord.GetGridMark(mark).Existed) { DrawCircle(ellipses[i], position.x, position.y, 4, Brushes.Blue); } else if (coord.DefinedGridMarkNum >= 2) { SimurateGridMark(position.x, position.y, mark); } } }
/// <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(); }