Beispiel #1
0
        private void DealWithLines(LineSegment2D[] lines)
        {
            foreach (LineSegment2D line in lines)
            {
                //以不同颜色绘制两大类线段:
                int    dltX = line.P2.X - line.P1.X;
                int    dltY = line.P2.Y - line.P1.Y;
                double Ang  = 57.3 * Math.Atan2(dltY, dltX);
                CvInvoke.Line(myImg, line.P1, line.P2, new MCvScalar((byte)(127 + Ang % 128), (byte)(3 * Ang % 255), (byte)(2 * Ang % 255)), 5);
                //CvInvoke.Line(remapImg, line.P1, line.P2, new MCvScalar(0), 5);
            }
            SegmentsClass  sc = new SegmentsClass(lines);
            List <Segment> LS = sc.GroupLines(50, 3, 170);

            string s = ""; string s2 = "";

            for (int k = 0; k < LS.Count; k++)
            {
                double x1 = LS[k].a;
                double y1 = 0;
                double x2 = 0;
                double y2 = LS[k].b;

                if (Math.Abs(Math.PI / 2f - LS[k].az) > 0.0001)
                {
                    CvInvoke.Line(myImg, new Point((int)x1, (int)y1), new Point((int)x2, (int)y2), new MCvScalar(0, 0, 255), 3);
                    CvInvoke.Line(remapImg, new Point((int)x1, (int)y1), new Point((int)x2, (int)y2), new MCvScalar(0), 3);
                }
                else
                {
                    CvInvoke.Line(myImg, new Point((int)x1, 0), new Point((int)x1, 1024), new MCvScalar(0, 0, 255), 3);
                    CvInvoke.Line(remapImg, new Point((int)x1, 0), new Point((int)x1, 1024), new MCvScalar(0), 3);
                }
                //s+="\r\n"+k +":az="+ LS[k].az+",ro="+ LS[k].ro;
                s += "\r\n" + string.Format("A={0:0.##}, B={1:0.##}, C={2:0.##}, ro={3:0.##}, az={4:0.##}, a={5:0.##}, b={6:0.##}",
                                            LS[k].A, LS[k].B, LS[k].C, LS[k].ro, LS[k].az, LS[k].a, LS[k].b);

                s2 += string.Format("  Theta{0}={1:0.####}", k + 1, 57.3 * Math.Atan(LS[k].az));
            }
            //
            //输出矩形,长方形:

            //if (sc.Corner.X != -65536)
            //{
            //    CvInvoke.Circle(remapImg,new Point((int)sc.Corner.X,(int)sc.Corner.Y),5,new MCvScalar(0),5);
            //    CvInvoke.Rectangle(myImg, new Rectangle((int)sc.Corner.X -3, (int)sc.Corner.Y-3 ,6, 6), new MCvScalar(25, 255, 55),5 );
            //    CvInvoke.PutText(myImg, string.Format("x0={0:0.##}  y0={1:0.##}", sc.Corner.X, sc.Corner.Y), new Point((int)sc.Corner.X +20, (int)sc.Corner.Y - 10), FontFace.HersheyPlain, 2, new MCvScalar(0, 255, 0), 1);
            //    CvInvoke.PutText(remapImg, string.Format("x={0:0.##}  y=`{1:0.##}", sc.Corner.X, sc.Corner.Y), new Point((int)sc.Corner.X - 60, (int)sc.Corner.Y + 20), Emgu.CV.CvEnum.FontFace.HersheyPlain, 2, new MCvScalar(0, 255, 0), 1);
            //    CvInvoke.PutText(myImg, s2, new Point((int)sc.Corner.X, (int)sc.Corner.Y - 40), FontFace.HersheyPlain, 2, new MCvScalar(0, 255, 255), 2);
            //    CvInvoke.PutText(remapImg, s2, new Point((int)sc.Corner.X - 80, (int)sc.Corner.Y + 40), Emgu.CV.CvEnum.FontFace.HersheyPlain, 2, new MCvScalar(0, 0, 255), 1);
            //}

            pictureBox1.Image    = myImg.ToBitmap();
            pictureBox2.Image    = remapImg.ToBitmap();
            btnMethodCal.Enabled = true;
        }
Beispiel #2
0
        /// <summary>
        /// 获取直线角点和斜率
        /// </summary>
        /// <param name="img"></param>
        /// <returns></returns>
        public CornerPointK GetCornerAndK(Bitmap img, int cameraID)
        {
            GetLinesByHough(img, cameraID);
            SegmentsClass sc = new SegmentsClass(lines);

            List <Segment> LS = sc.GroupLines(80, 3, 170);

            if (LS.Count != 0)
            {
                cornerPointK.Corner = sc.Corner;
                cornerPointK.LineK1 = LS[0].az;
                cornerPointK.LineK2 = LS[1].az == LS[0].az?LS[2].az:LS[1].az;
                //cornerPointK.Center = new PointF(cornerPointK.Corner.Average(a => a.X), cornerPointK.Corner.Average(a => a.Y));
                Matrix <double> camerCenter = new Matrix <double>(1, 3)
                {
Beispiel #3
0
        /// <summary>
        /// 获取直线角点和斜率
        /// </summary>
        /// <param name="img"></param>
        /// <returns></returns>
        public void GetCornerAndSlope(Bitmap img, int cameraID)
        {
            GetLinesByHough(img, cameraID);
            SegmentsClass sc = new SegmentsClass(lines);

            List <Segment> LS = sc.GroupLines(80, 3, 170);

            if (LS.Count != 0)
            {
                Corner = sc.Corner;
                LineK1 = LS[0].az;
                LineK2 = LS[1].az == LS[0].az ? LS[2].az : LS[1].az;
                double tempAngle = LineK1 <= LineK2 ? LineK1 : LineK2;
                if (tempAngle * 180f / Math.PI <= 45)//顺时针
                {
                    RotatedAngle = tempAngle * 180f / Math.PI;
                }
                else//逆时针
                {
                    RotatedAngle = -(90 - tempAngle * 180f / Math.PI);
                }
                //cornerPointK.Center = new PointF(cornerPointK.Corner.Average(a => a.X), cornerPointK.Corner.Average(a => a.Y));
                Matrix <double> camerCenter = new Matrix <double>(1, 3)
                {