/// <summary> /// Place and orient an ArUco object. /// </summary> protected void PlaceArucoObject(ArucoObject arucoObject, Cv.Core.Vec3d rvec, Cv.Core.Vec3d tvec, int cameraId, float positionFactor = 1f) { GameObject arucoGameObject = arucoObject.gameObject; Camera camera = arucoTracker.ArucoCamera.ImageCameras[cameraId]; // Place and orient the object to match the marker Transform arucoObjectTransform = arucoGameObject.transform; arucoGameObject.transform.SetParent(camera.transform); arucoGameObject.transform.localPosition = tvec.ToPosition() * positionFactor; arucoGameObject.transform.localRotation = rvec.ToRotation(); arucoGameObject.transform.SetParent(arucoObjectTransform); // Adjust the object position Vector3 cameraOpticalCenter = arucoTracker.ArucoCamera.CameraParameters.OpticalCenters[cameraId]; Vector3 imageCenter = new Vector3(0.5f, 0.5f, arucoGameObject.transform.position.z); Vector3 opticalCenter = new Vector3(cameraOpticalCenter.x, cameraOpticalCenter.y, arucoGameObject.transform.position.z); Vector3 opticalShift = camera.ViewportToWorldPoint(opticalCenter) - camera.ViewportToWorldPoint(imageCenter); // TODO: fix the position shift orientation Vector3 positionShift = opticalShift // Take account of the optical center not in the image center + arucoGameObject.transform.up * arucoGameObject.transform.localScale.y / 2; // Move up the object to coincide with the marker arucoGameObject.transform.localPosition += positionShift; //print(arucoGameObject.name + " - imageCenter: " + imageCenter.ToString("F3") + "; opticalCenter: " + opticalCenter.ToString("F3") // + "; positionShift: " + (arucoGameObject.transform.rotation * opticalShift).ToString("F4")); arucoGameObject.SetActive(true); }
public Cv.Core.Vec3d At(uint pos) { Cv.Core.Exception exception = new Cv.Core.Exception(); Cv.Core.Vec3d element = new Cv.Core.Vec3d(au_std_vectorVec3d_at(cppPtr, pos, exception.cppPtr), DeleteResponsibility.False); exception.Check(); return(element); }
public unsafe Cv.Core.Vec3d[] Data() { System.IntPtr *dataPtr = au_std_vectorVec3d_data(cppPtr); uint size = Size(); Cv.Core.Vec3d[] data = new Cv.Core.Vec3d[size]; for (int i = 0; i < size; i++) { data[i] = new Cv.Core.Vec3d(dataPtr[i], DeleteResponsibility.False); } return(data); }
public static bool EstimatePoseCharucoBoard(Std.VectorPoint2f charucoCorners, Std.VectorInt charucoIds, CharucoBoard board, Cv.Core.Mat cameraMatrix, Cv.Core.Mat distCoeffs, out Cv.Core.Vec3d rvec, out Cv.Core.Vec3d tvec) { Cv.Core.Exception exception = new Cv.Core.Exception(); System.IntPtr rvecPtr, tvecPtr; bool valid = au_estimatePoseCharucoBoard(charucoCorners.cppPtr, charucoIds.cppPtr, board.cppPtr, cameraMatrix.cppPtr, distCoeffs.cppPtr, out rvecPtr, out tvecPtr, exception.cppPtr); rvec = new Cv.Core.Vec3d(rvecPtr); tvec = new Cv.Core.Vec3d(tvecPtr); exception.Check(); return(valid); }
/// <summary> /// <see cref="ArucoObjectTracker.EstimateTranforms(int, Dictionary, HashSet{ArucoObject})"/> /// </summary> public override void EstimateTranforms(int cameraId, Aruco.Dictionary dictionary) { if (!IsActivated || arucoTracker.MarkerTracker.DetectedMarkers[cameraId][dictionary] <= 0) { return; } CameraParameters cameraParameters = arucoTracker.ArucoCamera.CameraParameters; foreach (var arucoGridBoard in arucoTracker.GetArucoObjects <ArucoGridBoard>(dictionary)) { Cv.Core.Vec3d rvec = null, tvec = null; arucoGridBoard.MarkersUsedForEstimation = Aruco.EstimatePoseBoard(arucoTracker.MarkerTracker.MarkerCorners[cameraId][dictionary], arucoTracker.MarkerTracker.MarkerIds[cameraId][dictionary], arucoGridBoard.Board, cameraParameters.CamerasMatrix[cameraId], cameraParameters.DistCoeffs[cameraId], out rvec, out tvec); arucoGridBoard.Rvec = rvec; arucoGridBoard.Tvec = tvec; } }
public static void DrawAxis(Cv.Core.Mat image, Cv.Core.Mat cameraMatrix, Cv.Core.Mat distCoeffs, Cv.Core.Vec3d rvec, Cv.Core.Vec3d tvec, float length) { Cv.Core.Exception exception = new Cv.Core.Exception(); au_drawAxis(image.cppPtr, cameraMatrix.cppPtr, distCoeffs.cppPtr, rvec.cppPtr, tvec.cppPtr, length, exception.cppPtr); exception.Check(); }
public void PushBack(Cv.Core.Vec3d value) { au_std_vectorVec3d_push_back(cppPtr, value.cppPtr); }