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