1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| List<Point2f> ImagePointlist = new List<Point2f>(); ImagePointlist.Add(new Point2f(_calibrationAgorithm.DotLeftTop.X, _calibrationAgorithm.DotLeftTop.Y)); ImagePointlist.Add(new Point2f(_calibrationAgorithm.DotRightTop.X, _calibrationAgorithm.DotRightTop.Y)); ImagePointlist.Add(new Point2f(_calibrationAgorithm.DotLeftBottom.X, _calibrationAgorithm.DotLeftBottom.Y)); ImagePointlist.Add(new Point2f(_calibrationAgorithm.DotRightBottom.X, _calibrationAgorithm.DotRightBottom.Y));
float LengthHor = (float)(_calibrationAgorithm.DotHorLength); float LengthVer = (float)(_calibrationAgorithm.DotVerLength); List<Point3f> WorldPointlist = new List<Point3f>();
if (_calibrationAgorithm.CoordinateType == ImageAgorithmDot.xCoordinateType.Theory) { WorldPointlist.Add(new Point3f(0, 0, 0)); WorldPointlist.Add(new Point3f(LengthHor, 0, 0)); WorldPointlist.Add(new Point3f(0, LengthVer * -1, 0)); WorldPointlist.Add(new Point3f(LengthHor , LengthVer * -1 , 0)); Camera.ExtrinsicsCalibriton(WorldPointlist, ImagePointlist); } if (_calibrationAgorithm.CoordinateType == ImageAgorithmDot.xCoordinateType.Actual) { Camera.Point3DX = _calibrationAgorithm.W_DotLeftTop.X; Camera.Point3DY = _calibrationAgorithm.W_DotLeftTop.Y; Camera.Point3DZ = Math.Abs(_calibrationAgorithm.W_DotLeftTop.Z); WorldPointlist.Add(new Point3f(0, 0, 0)); WorldPointlist.Add(new Point3f((float)(_calibrationAgorithm.W_DotRightTop.X + _calibrationAgorithm.W_DotLeftTop.X), (float)(_calibrationAgorithm.W_DotRightTop.Y + _calibrationAgorithm.W_DotLeftTop.Y), (float)(_calibrationAgorithm.W_DotRightTop.Z + Math.Abs(_calibrationAgorithm.W_DotLeftTop.Z)))); WorldPointlist.Add(new Point3f((float)(_calibrationAgorithm.W_DotLeftBottom.X + _calibrationAgorithm.W_DotLeftTop.X), (float)(_calibrationAgorithm.W_DotLeftBottom.Y + _calibrationAgorithm.W_DotLeftTop.Y), (float)(_calibrationAgorithm.W_DotLeftBottom.Z + Math.Abs(_calibrationAgorithm.W_DotLeftTop.Z)))); WorldPointlist.Add(new Point3f((float)(_calibrationAgorithm.W_DotRightBottom.X + _calibrationAgorithm.W_DotLeftTop.X), (float)(_calibrationAgorithm.W_DotRightBottom.Y + _calibrationAgorithm.W_DotLeftTop.Y), (float)(_calibrationAgorithm.W_DotRightBottom.Z + Math.Abs(_calibrationAgorithm.W_DotLeftTop.Z))));
Camera.ExtrinsicsCalibriton(WorldPointlist, ImagePointlist,true); }
public void ExtrinsicsCalibriton(List<Point3f> WorldPoint, List<Point2f> ImagePoint, bool bActual = false) { double[] Tvecs = new double[3]; double[] Rvecs = new double[3]; double[] tvecs = new double[3]; double[] rvecs = new double[3]; double[,] camera_matrix = new double[3, 3];
double[] dist_coeffs = new double[5];
camera_matrix[0, 0] = Intrinsics_Fx; camera_matrix[0, 1] = 0; camera_matrix[0, 2] = Intrinsics_Cx; camera_matrix[1, 0] = 0; camera_matrix[1, 1] = Intrinsics_Fy; camera_matrix[1, 2] = Intrinsics_Cy; camera_matrix[2, 0] = 0; camera_matrix[2, 1] = 0; camera_matrix[2, 2] = 1;
Cv2.SolvePnP(WorldPoint, ImagePoint, camera_matrix, dist_coeffs.ToList(), ref Rvecs, ref Tvecs);
Extrinsics_Rx = Rvecs[0]; Extrinsics_Ry = Rvecs[1]; Extrinsics_Rz = Rvecs[2]; Extrinsics_Tx = Tvecs[0]; Extrinsics_Ty = Tvecs[1]; Extrinsics_Tz = Tvecs[2];
double[,] rotM = new double[3, 3]; Cv2.Rodrigues(Rvecs, out rotM);
double theta_x = Math.Atan2(rotM[2, 1], rotM[2, 2]); double theta_y = Math.Atan2(-rotM[2, 0], Math.Sqrt(rotM[0, 0] * rotM[0, 0] + rotM[1, 0] * rotM[1, 0])); double theta_z = Math.Atan2(rotM[1, 0], rotM[0, 0]);
Extrinsics_Rx_Angle = theta_x * (180 / Math.PI); if (Extrinsics_Rx_Angle > 90) Extrinsics_Rx_Angle = 180 - Extrinsics_Rx_Angle; if (Extrinsics_Rx_Angle < -90) Extrinsics_Rx_Angle = -180 - Extrinsics_Rx_Angle; Extrinsics_Ry_Angle = theta_y * (180 / Math.PI); Extrinsics_Rz_Angle = theta_z * (180 / Math.PI);
Matrix matrix = (new Matrix(Tvecs) * Matrix.transpose(new Matrix(rotM))); matrix = new Matrix(new double[] { 0, 0, 0 }) - matrix;
Extrinsics_Tx_mm = matrix[0, 0]; Extrinsics_Ty_mm = matrix[0, 1]; Extrinsics_Tz_mm = matrix[0, 2]; if (bActual) { Extrinsics_Tx_mm = Extrinsics_Tx_mm + Point3DX; Extrinsics_Ty_mm = Extrinsics_Ty_mm + Point3DY; Extrinsics_Tz_mm = Extrinsics_Tz_mm + Point3DZ; } }
|