Projection3DTo3D.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Drawing;
  6. using System.Threading.Tasks;
  7. using Emgu.CV;
  8. using Emgu.CV.Structure;
  9. namespace bbiwarg.Utility
  10. {
  11. class Projection3DTo3D
  12. {
  13. private ImageSize sizeA;
  14. private ImageSize sizeB;
  15. private List<Vector3D> calibrationPoints3D;
  16. private List<Vector2D> calibrationPointsA;
  17. private List<Vector2D> calibrationPointsB;
  18. private int numPointsForCalibration;
  19. private IntrinsicCameraParameters intrinsicParam1;
  20. private IntrinsicCameraParameters intrinsicParam2;
  21. private ExtrinsicCameraParameters[] extrinsicParams;
  22. private Matrix<double> foundamentalMatrix;
  23. private Matrix<double> essentialMatrix;
  24. public bool IsCalibrated { get; private set; }
  25. public Projection3DTo3D(ImageSize sizeA, ImageSize sizeB, int numPointsForCalibration = 8)
  26. {
  27. this.sizeA = sizeA;
  28. this.sizeB = sizeB;
  29. this.numPointsForCalibration = numPointsForCalibration;
  30. reset();
  31. }
  32. public void reset()
  33. {
  34. IsCalibrated = false;
  35. calibrationPoints3D = new List<Vector3D>();
  36. calibrationPointsA = new List<Vector2D>();
  37. calibrationPointsB = new List<Vector2D>();
  38. intrinsicParam1 = new IntrinsicCameraParameters();
  39. intrinsicParam2 = new IntrinsicCameraParameters();
  40. }
  41. public void addCalibrationPoints(Vector3D p3D, Vector2D pA, Vector2D pB)
  42. {
  43. calibrationPoints3D.Add(p3D);
  44. calibrationPointsA.Add(pA);
  45. calibrationPointsB.Add(sizeA.getAbsolutePoint(sizeB.getRelativePoint(pB)));
  46. if (calibrationPointsA.Count == numPointsForCalibration)
  47. calibrate();
  48. }
  49. private void calibrate()
  50. {
  51. MCvPoint3D32f[][] points3D = new MCvPoint3D32f[numPointsForCalibration][];
  52. PointF[][] pointsA = new PointF[numPointsForCalibration][];
  53. PointF[][] pointsB = new PointF[numPointsForCalibration][];
  54. for (int i = 0; i < numPointsForCalibration; i++)
  55. {
  56. points3D[i] = new MCvPoint3D32f[1] { new MCvPoint3D32f(calibrationPoints3D[i].X, calibrationPoints3D[i].Y, calibrationPoints3D[i].Z) };
  57. pointsA[i] = new PointF[1] { calibrationPointsA[i] };
  58. pointsB[i] = new PointF[1] { calibrationPointsB[i] };
  59. }
  60. /*
  61. CameraCalibration.StereoCalibrate(points3D, pointsA, pointsB, intrinsicParam1, intrinsicParam2, new Size(sizeA.Width, sizeB.Width), Emgu.CV.CvEnum.CALIB_TYPE.DEFAULT, new MCvTermCriteria(0.1e5), out extrinsicParams, out foundamentalMatrix, out essentialMatrix);
  62. Console.WriteLine("EXTRINSICS:");
  63. Console.WriteLine(extrinsicParams.RotationVector.ToString());
  64. Console.WriteLine(extrinsicParams.TranslationVector.ToString());*/
  65. //CameraCalibration.CalibrateCamera(points3D, pointsB, new Size(sizeA.Width, sizeB.Width), intrinsicParam2, Emgu.CV.CvEnum.CALIB_TYPE.DEFAULT, new MCvTermCriteria(0.1e5), out extrinsicParams);
  66. }
  67. }
  68. }