/// <summary> /// <see cref="ArucoObjectTracker.Draw(int, Dictionary, HashSet{ArucoObject})"/> /// </summary> public override void Draw(int cameraId, Aruco.Dictionary dictionary) { if (!IsActivated || arucoTracker.MarkerTracker.DetectedMarkers[cameraId][dictionary] <= 0) { return; } bool updatedCameraImage = false; Cv.Core.Mat[] cameraImages = arucoTracker.ArucoCamera.Images; CameraParameters cameraParameters = arucoTracker.ArucoCamera.CameraParameters; foreach (var arucoGridBoard in arucoTracker.GetArucoObjects <ArucoGridBoard>(dictionary)) { if (arucoTracker.DrawAxes && cameraParameters != null && arucoGridBoard.MarkersUsedForEstimation > 0 && arucoGridBoard.Rvec != null) { Aruco.DrawAxis(cameraImages[cameraId], cameraParameters.CamerasMatrix[cameraId], cameraParameters.DistCoeffs[cameraId], arucoGridBoard.Rvec, arucoGridBoard.Tvec, arucoGridBoard.AxisLength); updatedCameraImage = true; } } if (updatedCameraImage) { arucoTracker.ArucoCamera.Images = cameraImages; } }
protected virtual void ArucoObjectController_DictionaryRemoved(Aruco.Dictionary dictionary) { if (!IsActivated) { return; } }
/// <summary> /// <see cref="ArucoObjectTracker.Draw(int, Dictionary)"/> /// </summary> public override void Draw(int cameraId, Aruco.Dictionary dictionary) { if (!IsActivated) { return; } bool updatedCameraImage = false; Cv.Core.Mat[] cameraImages = arucoTracker.ArucoCamera.Images; // Draw the detected markers // TODO: draw only markers in ArucoObjects list + add option to draw all the detected markers if (arucoTracker.DrawDetectedMarkers && DetectedMarkers[cameraId][dictionary] > 0) { Aruco.DrawDetectedMarkers(cameraImages[cameraId], MarkerCorners[cameraId][dictionary], MarkerIds[cameraId][dictionary]); updatedCameraImage = true; } // Draw the rejected marker candidates if (arucoTracker.DrawRejectedCandidates && RejectedCandidateCorners[cameraId][dictionary].Size() > 0) { Aruco.DrawDetectedMarkers(cameraImages[cameraId], RejectedCandidateCorners[cameraId][dictionary], REJECTED_MARKERS_CANDIDATES_COLOR); updatedCameraImage = true; } if (updatedCameraImage) { arucoTracker.ArucoCamera.Images = cameraImages; } }
/// <summary> /// <see cref="ArucoObjectTracker.Detect(int, Dictionary, HashSet{ArucoObject})"/> /// </summary> public override void Detect(int cameraId, Aruco.Dictionary dictionary) { if (!IsActivated) { return; } CameraParameters cameraParameters = arucoTracker.ArucoCamera.CameraParameters; Std.VectorVectorPoint2f diamondCorners = null; Std.VectorVec4i diamondIds = null; if (arucoTracker.MarkerTracker.DetectedMarkers[cameraId][dictionary] > 0) { if (cameraParameters == null) { Aruco.DetectCharucoDiamond(arucoTracker.ArucoCamera.Images[cameraId], arucoTracker.MarkerTracker.MarkerCorners[cameraId][dictionary], arucoTracker.MarkerTracker.MarkerIds[cameraId][dictionary], DETECT_SQUARE_MARKER_LENGTH_RATE, out diamondCorners, out diamondIds); } else { Aruco.DetectCharucoDiamond(arucoTracker.ArucoCamera.Images[cameraId], arucoTracker.MarkerTracker.MarkerCorners[cameraId][dictionary], arucoTracker.MarkerTracker.MarkerIds[cameraId][dictionary], DETECT_SQUARE_MARKER_LENGTH_RATE, out diamondCorners, out diamondIds, cameraParameters.CamerasMatrix[cameraId], cameraParameters.DistCoeffs[cameraId]); } } DiamondCorners[cameraId][dictionary] = diamondCorners; DiamondIds[cameraId][dictionary] = diamondIds; DetectedDiamonds[cameraId][dictionary] = (diamondIds != null) ? (int)diamondIds.Size() : 0; }
/// <summary> /// Detect the ArUco objects for a camera on an custom image. /// </summary> /// <param name="cameraId">The id of the camera.</param> /// <param name="dictionary">The dictionary to use for the detection.</param> /// <param name="dictionary">The image to use for the detection.</param> public virtual void Detect(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { if (!IsActivated) { throw new Exception("Activate the tracker before detecting ArUco objects."); } }
/// <summary> /// Place and orient the detected ArUco objects relative to a camera. /// </summary> /// <param name="cameraId">The id of the camera to use.</param> /// <param name="dictionary">The dictionary to use.</param> public virtual void UpdateTransforms(int cameraId, Aruco.Dictionary dictionary) { if (!IsActivated) { throw new Exception("Activate the tracker before updating transforms of ArUco objects."); } }
public override void Draw(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { base.Draw(cameraId, dictionary, image); if (DetectedMarkers[cameraId][dictionary] > 0) { // Draw all the detected markers if (arucoTracker.DrawDetectedMarkers) { Aruco.DrawDetectedMarkers(image, MarkerCorners[cameraId][dictionary], MarkerIds[cameraId][dictionary]); } // Draw axes of detected tracked markers if (arucoTracker.DrawAxes && arucoCameraUndistortion != null && MarkerRvecs[cameraId][dictionary] != null) { for (uint i = 0; i < DetectedMarkers[cameraId][dictionary]; i++) { ArucoObject foundArucoObject; int detectedMarkerHashCode = ArucoMarker.GetArucoHashCode(MarkerIds[cameraId][dictionary].At(i)); if (arucoTracker.ArucoObjects[dictionary].TryGetValue(detectedMarkerHashCode, out foundArucoObject)) { Aruco.DrawAxis(image, arucoCameraUndistortion.RectifiedCameraMatrices[cameraId], arucoCameraUndistortion.UndistortedDistCoeffs[cameraId], MarkerRvecs[cameraId][dictionary].At(i), MarkerTvecs[cameraId][dictionary].At(i), estimatePoseMarkerLength); } } } } // Draw the rejected marker candidates if (arucoTracker.DrawRejectedCandidates && RejectedCandidateCorners[cameraId][dictionary].Size() > 0) { Aruco.DrawDetectedMarkers(image, RejectedCandidateCorners[cameraId][dictionary]); } }
// ArucoObjectTracker methods /// <summary> /// <see cref="ArucoObjectTracker.Activate(ArucoTracker)"/> /// </summary> public override void Activate(ArucoTracker arucoTracker) { base.Activate(arucoTracker); // Initialize the properties and the ArUco objects MarkerCorners = new Dictionary <Aruco.Dictionary, Std.VectorVectorPoint2f> [arucoTracker.ArucoCamera.CamerasNumber]; MarkerIds = new Dictionary <Aruco.Dictionary, Std.VectorInt> [arucoTracker.ArucoCamera.CamerasNumber]; RejectedCandidateCorners = new Dictionary <Aruco.Dictionary, Std.VectorVectorPoint2f> [arucoTracker.ArucoCamera.CamerasNumber]; MarkerRvecs = new Dictionary <Aruco.Dictionary, Std.VectorVec3d> [arucoTracker.ArucoCamera.CamerasNumber]; MarkerTvecs = new Dictionary <Aruco.Dictionary, Std.VectorVec3d> [arucoTracker.ArucoCamera.CamerasNumber]; DetectedMarkers = new Dictionary <Aruco.Dictionary, int> [arucoTracker.ArucoCamera.CamerasNumber]; for (int cameraId = 0; cameraId < arucoTracker.ArucoCamera.CamerasNumber; cameraId++) { MarkerCorners[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVectorPoint2f>(); MarkerIds[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorInt>(); RejectedCandidateCorners[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVectorPoint2f>(); MarkerRvecs[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVec3d>(); MarkerTvecs[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVec3d>(); DetectedMarkers[cameraId] = new Dictionary <Aruco.Dictionary, int>(); foreach (var arucoObjectDictionary in arucoTracker.ArucoObjects) { Aruco.Dictionary dictionary = arucoObjectDictionary.Key; MarkerCorners[cameraId].Add(dictionary, new Std.VectorVectorPoint2f()); MarkerIds[cameraId].Add(dictionary, new Std.VectorInt()); RejectedCandidateCorners[cameraId].Add(dictionary, new Std.VectorVectorPoint2f()); MarkerRvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); MarkerTvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); DetectedMarkers[cameraId].Add(dictionary, 0); } } }
// ArucoObjectTracker methods public override void Activate(IArucoObjectsTracker arucoTracker) { base.Activate(arucoTracker); DiamondCorners = new Dictionary <Aruco.Dictionary, Std.VectorVectorPoint2f> [arucoCamera.CameraNumber]; DiamondIds = new Dictionary <Aruco.Dictionary, Std.VectorVec4i> [arucoCamera.CameraNumber]; DetectedDiamonds = new Dictionary <Aruco.Dictionary, int> [arucoCamera.CameraNumber]; DiamondRvecs = new Dictionary <Aruco.Dictionary, Std.VectorVec3d> [arucoCamera.CameraNumber]; DiamondTvecs = new Dictionary <Aruco.Dictionary, Std.VectorVec3d> [arucoCamera.CameraNumber]; for (int cameraId = 0; cameraId < arucoCamera.CameraNumber; cameraId++) { DiamondCorners[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVectorPoint2f>(); DiamondIds[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVec4i>(); DetectedDiamonds[cameraId] = new Dictionary <Aruco.Dictionary, int>(); DiamondRvecs[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVec3d>(); DiamondTvecs[cameraId] = new Dictionary <Aruco.Dictionary, Std.VectorVec3d>(); foreach (var arucoObjectDictionary in arucoTracker.ArucoObjects) { Aruco.Dictionary dictionary = arucoObjectDictionary.Key; DiamondCorners[cameraId].Add(dictionary, new Std.VectorVectorPoint2f()); DiamondIds[cameraId].Add(dictionary, new Std.VectorVec4i()); DetectedDiamonds[cameraId].Add(dictionary, 0); DiamondRvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); DiamondTvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); } } }
public override void Draw(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { if (DetectedMarkers[cameraId][dictionary] > 0) { // Draw all the detected markers if (arucoTracker.DrawDetectedMarkers) { // TODO: draw only markers in ArucoObjects list + add option to draw all the detected markers Aruco.DrawDetectedMarkers(image, MarkerCorners[cameraId][dictionary], MarkerIds[cameraId][dictionary]); } // Draw axes of detected tracked markers if (arucoTracker.DrawAxes && cameraParameters != null && MarkerRvecs[cameraId][dictionary] != null) { for (uint i = 0; i < DetectedMarkers[cameraId][dictionary]; i++) { ArucoObject foundArucoObject; int detectedMarkerHashCode = ArucoMarker.GetArucoHashCode(MarkerIds[cameraId][dictionary].At(i)); if (arucoTracker.ArucoObjects[dictionary].TryGetValue(detectedMarkerHashCode, out foundArucoObject)) { Aruco.DrawAxis(image, cameraParameters.CameraMatrices[cameraId], cameraParameters.DistCoeffs[cameraId], MarkerRvecs[cameraId][dictionary].At(i), MarkerTvecs[cameraId][dictionary].At(i), EstimatePoseMarkerLength); } } } } // Draw the rejected marker candidates if (arucoTracker.DrawRejectedCandidates && RejectedCandidateCorners[cameraId][dictionary].Size() > 0) { Aruco.DrawDetectedMarkers(image, RejectedCandidateCorners[cameraId][dictionary]); } }
public override void Detect(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { base.Detect(cameraId, dictionary, image); ArucoMarkerTracker markerTracker = arucoTracker.MarkerTracker; Std.VectorVectorPoint2f diamondCorners = null; Std.VectorVec4i diamondIds = null; if (markerTracker.DetectedMarkers[cameraId][dictionary] > 0) { if (arucoCameraUndistortion == null) { Aruco.DetectCharucoDiamond(image, markerTracker.MarkerCorners[cameraId][dictionary], markerTracker.MarkerIds[cameraId][dictionary], DetectSquareMarkerLengthRate, out diamondCorners, out diamondIds); } else { Aruco.DetectCharucoDiamond(image, markerTracker.MarkerCorners[cameraId][dictionary], markerTracker.MarkerIds[cameraId][dictionary], DetectSquareMarkerLengthRate, out diamondCorners, out diamondIds, arucoCameraUndistortion.RectifiedCameraMatrices[cameraId], arucoCameraUndistortion.UndistortedDistCoeffs[cameraId]); } } DiamondCorners[cameraId][dictionary] = diamondCorners; DiamondIds[cameraId][dictionary] = diamondIds; DetectedDiamonds[cameraId][dictionary] = (diamondIds != null) ? (int)diamondIds.Size() : 0; }
/// <summary> /// Detect the ArUco objects on the current image of a camera. /// </summary> /// <param name="cameraId">The id of the camera to use.</param> /// <param name="dictionary">The dictionary to use for the detection.</param> public virtual void Detect(int cameraId, Aruco.Dictionary dictionary) { if (IsActivated) { Detect(cameraId, dictionary, arucoTracker.ArucoCamera.Images[cameraId]); } }
// MonoBehaviour methods /// <summary> /// Initializes the properties. /// </summary> protected virtual void Awake() { if (Dictionary == null) { dictionary = Aruco.GetPredefinedDictionary(dictionaryName); } UpdateArucoHashCode(); }
// MonoBehaviour methods /// <summary> /// Calls <see cref="UpdateProperties()"/>. /// </summary> protected virtual void Awake() { if (Dictionary == null) { dictionary = Aruco.GetPredefinedDictionary(dictionaryName); } UpdateProperties(); }
public override void Place(int cameraId, Aruco.Dictionary dictionary) { foreach (var arucoGridBoard in arucoTracker.GetArucoObjects <ArucoGridBoard>(dictionary)) { if (arucoGridBoard.Rvec != null) { PlaceArucoObject(arucoGridBoard, arucoGridBoard.Rvec, arucoGridBoard.Tvec, cameraId); } } }
protected override void ArucoObjectsController_DictionaryRemoved(Aruco.Dictionary dictionary) { for (int cameraId = 0; cameraId < arucoCamera.CameraNumber; cameraId++) { DiamondIds[cameraId].Remove(dictionary); DetectedDiamonds[cameraId].Remove(dictionary); DiamondRvecs[cameraId].Remove(dictionary); DiamondTvecs[cameraId].Remove(dictionary); } }
// ArucoObjectsController related methods protected override void ArucoObjectsController_DictionaryAdded(Aruco.Dictionary dictionary) { for (int cameraId = 0; cameraId < arucoCamera.CameraNumber; cameraId++) { DiamondIds[cameraId].Add(dictionary, new Std.VectorVec4i()); DetectedDiamonds[cameraId].Add(dictionary, 0); DiamondRvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); DiamondTvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); } }
public override void Draw(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { foreach (var arucoGridBoard in arucoTracker.GetArucoObjects <ArucoGridBoard>(dictionary)) { if (arucoTracker.DrawAxes && cameraParameters != null && arucoGridBoard.Rvec != null) { Aruco.DrawAxis(image, cameraParameters.CameraMatrices[cameraId], cameraParameters.DistCoeffs[cameraId], arucoGridBoard.Rvec, arucoGridBoard.Tvec, arucoGridBoard.AxisLength); } } }
protected override void ArucoObjectsController_DictionaryRemoved(Aruco.Dictionary dictionary) { for (int cameraId = 0; cameraId < arucoTracker.ArucoCamera.CameraNumber; cameraId++) { MarkerCorners[cameraId].Remove(dictionary); MarkerIds[cameraId].Remove(dictionary); RejectedCandidateCorners[cameraId].Remove(dictionary); MarkerRvecs[cameraId].Remove(dictionary); MarkerTvecs[cameraId].Remove(dictionary); DetectedMarkers[cameraId].Remove(dictionary); } }
public override void Detect(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { Std.VectorVectorPoint2f markerCorners, rejectedCandidateCorners; Std.VectorInt markerIds; Aruco.DetectMarkers(image, dictionary, out markerCorners, out markerIds, arucoTracker.DetectorParameters, out rejectedCandidateCorners); DetectedMarkers[cameraId][dictionary] = (int)markerIds.Size(); MarkerCorners[cameraId][dictionary] = markerCorners; MarkerIds[cameraId][dictionary] = markerIds; RejectedCandidateCorners[cameraId][dictionary] = rejectedCandidateCorners; }
// ArucoObjectsController related methods protected override void ArucoObjectsController_DictionaryAdded(Aruco.Dictionary dictionary) { for (int cameraId = 0; cameraId < arucoTracker.ArucoCamera.CameraNumber; cameraId++) { MarkerCorners[cameraId].Add(dictionary, new Std.VectorVectorPoint2f()); MarkerIds[cameraId].Add(dictionary, new Std.VectorInt()); RejectedCandidateCorners[cameraId].Add(dictionary, new Std.VectorVectorPoint2f()); MarkerRvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); MarkerTvecs[cameraId].Add(dictionary, new Std.VectorVec3d()); DetectedMarkers[cameraId].Add(dictionary, 0); } }
public override void EstimateTransforms(int cameraId, Aruco.Dictionary dictionary) { Std.VectorVec3d rvecs = null, tvecs = null; if (DetectedMarkers[cameraId][dictionary] > 0 && cameraParameters != null) { Aruco.EstimatePoseSingleMarkers(MarkerCorners[cameraId][dictionary], EstimatePoseMarkerLength, cameraParameters.CameraMatrices[cameraId], cameraParameters.DistCoeffs[cameraId], out rvecs, out tvecs); } MarkerRvecs[cameraId][dictionary] = rvecs; MarkerTvecs[cameraId][dictionary] = tvecs; }
public override void UpdateTransforms(int cameraId, Aruco.Dictionary dictionary) { base.UpdateTransforms(cameraId, dictionary); foreach (var arucoCharucoBoard in arucoTracker.GetArucoObjects <ArucoCharucoBoard>(dictionary)) { if (arucoCharucoBoard.Rvec != null) { arucoCameraDisplay.PlaceArucoObject(arucoCharucoBoard.transform, cameraId, arucoCharucoBoard.Tvec.ToPosition(), arucoCharucoBoard.Rvec.ToRotation()); } } }
/// <summary> /// Calls <see cref="OnPropertyUpdated()"/> in editor mode. /// </summary> protected virtual void OnValidate() { #if UNITY_EDITOR if (!UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode) { if (Dictionary == null || dictionaryName != Dictionary.Name) { dictionary = Aruco.GetPredefinedDictionary(dictionaryName); } OnPropertyUpdated(); } #endif }
public override void Draw(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { base.Draw(cameraId, dictionary, image); foreach (var arucoGridBoard in arucoTracker.GetArucoObjects<ArucoGridBoard>(dictionary)) { if (arucoTracker.DrawAxes && arucoCameraUndistortion != null && arucoGridBoard.Rvec != null) { Aruco.DrawAxis(image, arucoCameraUndistortion.RectifiedCameraMatrices[cameraId], arucoCameraUndistortion.UndistortedDistCoeffs[cameraId], arucoGridBoard.Rvec, arucoGridBoard.Tvec, arucoGridBoard.AxisLength); } } }
public override void EstimateTransforms(int cameraId, Aruco.Dictionary dictionary) { // TODO: add autoscale feature (see: https://github.com/opencv/opencv_contrib/blob/master/modules/aruco/samples/detect_diamonds.cpp#L203) Std.VectorVec3d diamondRvecs = null, diamondTvecs = null; if (DetectedDiamonds[cameraId][dictionary] > 0 && cameraParameters != null) { Aruco.EstimatePoseSingleMarkers(DiamondCorners[cameraId][dictionary], EstimatePoseSquareLength, cameraParameters.CameraMatrices[cameraId], cameraParameters.DistCoeffs[cameraId], out diamondRvecs, out diamondTvecs); } DiamondRvecs[cameraId][dictionary] = diamondRvecs; DiamondTvecs[cameraId][dictionary] = diamondTvecs; }
// ArucoObjectTracker methods public override void Detect(int cameraId, Aruco.Dictionary dictionary, Cv.Mat image) { ArucoMarkerTracker markerTracker = arucoTracker.MarkerTracker; if (arucoTracker.RefineDetectedMarkers && arucoTracker.MarkerTracker.DetectedMarkers[cameraId][dictionary] > 0) { foreach (var arucoBoard in arucoTracker.GetArucoObjects <ArucoGridBoard>(dictionary)) { Aruco.RefineDetectedMarkers(image, arucoBoard.Board, markerTracker.MarkerCorners[cameraId][dictionary], markerTracker.MarkerIds[cameraId][dictionary], markerTracker.RejectedCandidateCorners[cameraId][dictionary]); markerTracker.DetectedMarkers[cameraId][dictionary] = (int)markerTracker.MarkerIds[cameraId][dictionary].Size(); } } }
public override void EstimateTransforms(int cameraId, Aruco.Dictionary dictionary) { base.EstimateTransforms(cameraId, dictionary); Std.VectorVec3d diamondRvecs = null, diamondTvecs = null; if (DetectedDiamonds[cameraId][dictionary] > 0 && arucoCameraUndistortion != null) { Aruco.EstimatePoseSingleMarkers(DiamondCorners[cameraId][dictionary], EstimatePoseSquareLength, arucoCameraUndistortion.RectifiedCameraMatrices[cameraId], arucoCameraUndistortion.UndistortedDistCoeffs[cameraId], out diamondRvecs, out diamondTvecs); } DiamondRvecs[cameraId][dictionary] = diamondRvecs; DiamondTvecs[cameraId][dictionary] = diamondTvecs; }
/// <summary> /// <see cref="ArucoObjectTracker.Place(int, Dictionary, HashSet{ArucoObject})"/> /// </summary> public override void Place(int cameraId, Aruco.Dictionary dictionary) { if (!IsActivated || arucoTracker.MarkerTracker.DetectedMarkers[cameraId][dictionary] <= 0) { return; } foreach (var arucoCharucoBoard in arucoTracker.GetArucoObjects <ArucoCharucoBoard>(dictionary)) { if (arucoCharucoBoard.ValidTransform) { PlaceArucoObject(arucoCharucoBoard, arucoCharucoBoard.Rvec, arucoCharucoBoard.Tvec, cameraId); } } }
public override void EstimateTransforms(int cameraId, Aruco.Dictionary dictionary) { base.EstimateTransforms(cameraId, dictionary); Std.VectorVec3d rvecs = null, tvecs = null; if (DetectedMarkers[cameraId][dictionary] > 0 && arucoCameraUndistortion != null) { Aruco.EstimatePoseSingleMarkers(MarkerCorners[cameraId][dictionary], estimatePoseMarkerLength, arucoCameraUndistortion.RectifiedCameraMatrices[cameraId], arucoCameraUndistortion.UndistortedDistCoeffs[cameraId], out rvecs, out tvecs); } MarkerRvecs[cameraId][dictionary] = rvecs; MarkerTvecs[cameraId][dictionary] = tvecs; }