Guest User

Untitled

a guest
Oct 19th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.80 KB | None | 0 0
  1. private void TestOpenCV(Vector3[] objectPointsUnityVector3, Vector2[] imagePointsUnityVector2)
  2. {
  3. // convert Vector3[] into MCvPoint3D32f[] and Vector2[] into PointF[]
  4. var objectPoints = new Emgu.CV.Structure.MCvPoint3D32f[4];
  5. var imagePoints = new System.Drawing.PointF[4];
  6.  
  7. for (int i = 0; i < objectPointsUnityVector3.Length; i++)
  8. {
  9. objectPoints[i] = new Emgu.CV.Structure.MCvPoint3D32f(objectPointsUnityVector3[i].x, objectPointsUnityVector3[i].y, objectPointsUnityVector3[i].z);
  10. imagePoints[i] = new System.Drawing.PointF(imagePointsUnityVector2[i].x, imagePointsUnityVector2[i].y);
  11. }
  12.  
  13. /* For SolvePnPRansac
  14. // create vertors of points
  15. var objectPointsRansac = new Emgu.CV.Util.VectorOfPoint3D32F(objectPoints);
  16. var imagePointsRansac = new Emgu.CV.Util.VectorOfPointF(imagePoints);
  17. //*/
  18.  
  19. // try to get the Camera matrix into a valid format?
  20. // THIS IS WHERE I NEED HELP
  21. /*/ Tried using the projection matrix values, the focal length, etc
  22. var cameraProjectionMatrix = _mainCamera.projectionMatrix;
  23. _mainCamera.usePhysicalProperties = true;
  24. var focalLength = _mainCamera.focalLength;
  25. //*/
  26.  
  27. var fx = Screen.width;
  28. var cx = 0f;
  29. var fy = Screen.height;
  30. var cy = 0f;
  31. var cameraMatrix = new Emgu.CV.Matrix<float>(new float[3, 3] {
  32. {fx,0,cx},
  33. {0,fy,cy},
  34. {0,0,1}
  35. });
  36.  
  37. IInputArray distortionCoeffs = new Emgu.CV.Util.VectorOfFloat(new float[4] { 0f, 0f, 0f, 0f });
  38.  
  39. // define valid output variables?
  40. var rvec = new Emgu.CV.Util.VectorOfFloat();
  41. var tvec = new Emgu.CV.Util.VectorOfFloat();
  42.  
  43. /*/
  44. Debug.Log("everything works up to here");
  45. return;
  46. //*/
  47.  
  48. try
  49. {
  50. /* RANSAC made the editor crash
  51. var iterations = 10;
  52. var reprojectionError = 1f;
  53. var confident = 0.1f;
  54. var inliers = new Emgu.CV.Util.VectorOfInt(); // i guess this is a reference that will get filled?
  55.  
  56. CvInvoke.SolvePnPRansac(objectPointsRansac, imagePointsRansac, cameraMatrix, distortionCoeffs, rvec, tvec,false, iterations, reprojectionError, confident, inliers, Emgu.CV.CvEnum.SolvePnpMethod.Iterative); //.EPnP);
  57. //*/
  58.  
  59. CvInvoke.SolvePnP(objectPoints, imagePoints, cameraMatrix, distortionCoeffs, rvec, tvec);
  60.  
  61. var translation = new Vector3(tvec[0], -tvec[1], tvec[2]);
  62. var rotation = new Vector3(-rvec[0], rvec[1], rvec[2]) * Mathf.Rad2Deg;
  63.  
  64. Debug.Log(translation.ToString() + " " + rotation.ToString());
  65.  
  66. _mainCamera.transform.position = Vector3.zero;
  67. _mainCamera.transform.rotation = Quaternion.identity;
  68. _transformToPosition.rotation = Quaternion.Euler(rotation);
  69. _transformToPosition.position = translation;
  70. }
  71. catch (System.Exception e)
  72. {
  73. Debug.Log("exception: " + e);
  74. }
  75. }
Add Comment
Please, Sign In to add comment