/// <summary> /// Call with new CornesStepCfg, keep calling with images till cfg.done == true /// </summary> /// <param name="cfg"></param> /// <param name="Gray_frame_S1"></param> /// <param name="Gray_frame_S2"></param> public static bool findCorners(CornersStepCfg cfg, Image <Gray, Byte> Gray_frame_S1, Image <Gray, Byte> Gray_frame_S2, bool shoot) { if (File.Exists(saveFileName_corners)) { var lines = File.ReadAllLines(saveFileName_corners); var res = stringToCorner(lines); cfg.corners_points_Left = res[0]; cfg.corners_points_Right = res[1]; cfg.done = true; return(false); } Size patternSize = new Size(width, height); //size of chess board to be detected #region Saving Chessboard Corners in Buffer //Find the chessboard in bothe images cfg.corners_Left = FindChessboardCorners(Gray_frame_S1, patternSize, Emgu.CV.CvEnum.CalibCbType.AdaptiveThresh); cfg.corners_Right = FindChessboardCorners(Gray_frame_S2, patternSize, Emgu.CV.CvEnum.CalibCbType.AdaptiveThresh); //we use this loop so we can show a colour image rather than a gray: //CameraCalibration.DrawChessboardCorners(Gray_Frame, patternSize, corners); //we we only do this is the chessboard is present in both images if (cfg.corners_Left != null && cfg.corners_Right != null) //chess board found in one of the frames? { //make mesurments more accurate by using FindCornerSubPixel Gray_frame_S1.FindCornerSubPix(new PointF[1][] { cfg.corners_Left }, new Size(11, 11), new Size(-1, -1), new MCvTermCriteria(30, 0.01)); Gray_frame_S2.FindCornerSubPix(new PointF[1][] { cfg.corners_Right }, new Size(11, 11), new Size(-1, -1), new MCvTermCriteria(30, 0.01)); { //save the calculated points into an array cfg.corners_points_Left[cfg.buffer_savepoint] = cfg.corners_Left; cfg.corners_points_Right[cfg.buffer_savepoint] = cfg.corners_Right; if (shoot) { Gray_frame_S1.Save($"{saveFilePath}images\\Left_{cfg.buffer_savepoint}.jpg"); Gray_frame_S2.Save($"{saveFilePath}images\\Right_{cfg.buffer_savepoint}.jpg"); cfg.buffer_savepoint++; //increase buffer positon //check the state of buffer if (cfg.buffer_savepoint == buffer_length) { var saveStr = cornerToString(cfg.corners_points_Left) + cornerToString(cfg.corners_points_Right); File.AppendAllText(saveFileName_corners, saveStr); cfg.done = true; } } //Show state of Buffer } //calibrate the delay bassed on size of buffer //if buffer small you want a big delay if big small delay //Thread.Sleep(100);//allow the user to move the board to a different position if (shoot) { cfg.corners_Left = null; cfg.corners_Right = null; return(true); } } //corners_Left = null; //corners_Right = null; return(false); }
static Bgr[] line_colour_array = new Bgr[width * height]; // just for displaying coloured lines of detected chessboard public static void DrawChessFound(Image <Bgr, Byte> frame_S1, Image <Bgr, Byte> frame_S2, CornersStepCfg cfg) { if (cfg.corners_Left == null) { return; } if (cfg.corners_Right == null) { return; } //draw the results frame_S1.Draw(new CircleF(cfg.corners_Left[0], 3), new Bgr(Color.Yellow), 1); frame_S2.Draw(new CircleF(cfg.corners_Right[0], 3), new Bgr(Color.Yellow), 1); for (int i = 1; i < cfg.corners_Left.Length; i++) { //left frame_S1.Draw(new LineSegment2DF(cfg.corners_Left[i - 1], cfg.corners_Left[i]), line_colour_array[i], 2); frame_S1.Draw(new CircleF(cfg.corners_Left[i], 3), new Bgr(Color.Yellow), 1); //right frame_S2.Draw(new LineSegment2DF(cfg.corners_Right[i - 1], cfg.corners_Right[i]), line_colour_array[i], 2); frame_S2.Draw(new CircleF(cfg.corners_Right[i], 3), new Bgr(Color.Yellow), 1); } }