Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 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);
     }
 }