/// <summary> /// Basic marker detection /// </summary> /// <param name="image">input image</param> /// <param name="dictionary">indicates the type of markers that will be searched</param> /// <param name="corners">vector of detected marker corners. /// For each marker, its four corners are provided. For N detected markers, /// the dimensions of this array is Nx4.The order of the corners is clockwise.</param> /// <param name="ids">vector of identifiers of the detected markers. The identifier is of type int. /// For N detected markers, the size of ids is also N. The identifiers have the same order than the markers in the imgPoints array.</param> /// <param name="parameters">marker detection parameters</param> /// <param name="rejectedImgPoints">contains the imgPoints of those squares whose inner code has not a /// correct codification.Useful for debugging purposes.</param> public static void DetectMarkers(InputArray image, Dictionary dictionary, out Point2f[][] corners, out int[] ids, DetectorParameters parameters, out Point2f[][] rejectedImgPoints) { if (image == null) { throw new ArgumentNullException(nameof(image)); } if (dictionary.ObjectPtr == null) { throw new ArgumentException($"{nameof(dictionary)} is disposed", nameof(dictionary)); } if (parameters.ObjectPtr == null) { throw new ArgumentException($"{nameof(parameters)} is disposed", nameof(parameters)); } using (var cornersVec = new VectorOfVectorPoint2f()) using (var idsVec = new VectorOfInt32()) using (var rejectedImgPointsVec = new VectorOfVectorPoint2f()) { NativeMethods.aruco_detectMarkers( image.CvPtr, dictionary.ObjectPtr.CvPtr, cornersVec.CvPtr, idsVec.CvPtr, parameters.ObjectPtr.CvPtr, rejectedImgPointsVec.CvPtr); corners = cornersVec.ToArray(); ids = idsVec.ToArray(); rejectedImgPoints = rejectedImgPointsVec.ToArray(); } GC.KeepAlive(image); GC.KeepAlive(dictionary); GC.KeepAlive(parameters); }
/// <summary> /// Trains a Facemark algorithm using the given dataset. /// </summary> /// <param name="image">Input image.</param> /// <param name="faces">Output of the function which represent region of interest of the detected faces. Each face is stored in cv::Rect container.</param> /// <param name="landmarks">The detected landmark points for each faces.</param> /// <returns></returns> public virtual bool Fit( InputArray image, InputArray faces, out Point2f[][] landmarks) { ThrowIfDisposed(); if (image == null) { throw new ArgumentNullException(nameof(image)); } if (faces == null) { throw new ArgumentNullException(nameof(faces)); } image.ThrowIfDisposed(); faces.ThrowIfDisposed(); int ret; using (var landmarx = new VectorOfVectorPoint2f()) { NativeMethods.HandleException( NativeMethods.face_Facemark_fit(ptr, image.CvPtr, faces.CvPtr, landmarx.CvPtr, out ret)); landmarks = landmarx.ToArray(); } GC.KeepAlive(this); GC.KeepAlive(image); return(ret != 0); }
/// <summary> /// Detect ChArUco Diamond markers. /// </summary> /// <param name="image">input image necessary for corner subpixel.</param> /// <param name="markerCorners">list of detected marker corners from detectMarkers function.</param> /// <param name="markerIds">list of marker ids in markerCorners.</param> /// <param name="squareMarkerLengthRate">rate between square and marker length: squareMarkerLengthRate = squareLength/markerLength. The real units are not necessary.</param> /// <param name="diamondCorners">output list of detected diamond corners (4 corners per diamond). The order is the same than in marker corners: top left, top right, bottom right and bottom left. Similar format than the corners returned by detectMarkers (e.g std::vector<std::vector<cv::Point2f>>).</param> /// <param name="diamondIds">ids of the diamonds in diamondCorners. The id of each diamond is in fact of type Vec4i, so each diamond has 4 ids, which are the ids of the aruco markers composing the diamond.</param> /// <param name="cameraMatrix">Optional camera calibration matrix.</param> /// <param name="distCoeffs">Optional camera distortion coefficients.</param> public static void DetectCharucoDiamond(InputArray image, Point2f[][] markerCorners, IEnumerable <int> markerIds, float squareMarkerLengthRate, out Point2f[][] diamondCorners, out Vec4i[] diamondIds, InputArray?cameraMatrix = null, InputArray?distCoeffs = null) { if (image == null) { throw new ArgumentNullException(nameof(image)); } if (markerCorners == null) { throw new ArgumentNullException(nameof(markerCorners)); } if (markerIds == null) { throw new ArgumentNullException(nameof(markerIds)); } if (cameraMatrix == null && distCoeffs != null) { throw new ArgumentNullException(nameof(cameraMatrix)); } if (cameraMatrix != null && distCoeffs == null) { throw new ArgumentNullException(nameof(distCoeffs)); } image.ThrowIfDisposed(); cameraMatrix?.ThrowIfDisposed(); distCoeffs?.ThrowIfDisposed(); using var markerCornersAddress = new ArrayAddress2 <Point2f>(markerCorners); using var markerIdsVec = new VectorOfInt32(markerIds); using var diamondCornersVec = new VectorOfVectorPoint2f(); using var diamondIdsVec = new VectorOfVec4i(); NativeMethods.HandleException( NativeMethods.aruco_detectCharucoDiamond( image.CvPtr, markerCornersAddress.GetPointer(), markerCornersAddress.GetDim1Length(), markerCornersAddress.GetDim2Lengths(), markerIdsVec.CvPtr, squareMarkerLengthRate, diamondCornersVec.CvPtr, diamondIdsVec.CvPtr, cameraMatrix?.CvPtr ?? IntPtr.Zero, distCoeffs?.CvPtr ?? IntPtr.Zero)); diamondCorners = diamondCornersVec.ToArray(); diamondIds = diamondIdsVec.ToArray(); GC.KeepAlive(image); if (cameraMatrix != null) { GC.KeepAlive(cameraMatrix); } if (distCoeffs != null) { GC.KeepAlive(distCoeffs); } }
/// <summary> /// /// </summary> /// <param name="idx"></param> /// <param name="facetList"></param> /// <param name="facetCenters"></param> public void GetVoronoiFacetList(IEnumerable<int> idx, out Point2f[][] facetList, out Point2f[] facetCenters) { if (disposed) throw new ObjectDisposedException("Subdiv2D", ""); IntPtr facetListPtr, facetCentersPtr; if (idx == null) { NativeMethods.imgproc_Subdiv2D_getVoronoiFacetList(ptr, IntPtr.Zero, 0, out facetListPtr, out facetCentersPtr); } else { int[] idxArray = EnumerableEx.ToArray(idx); NativeMethods.imgproc_Subdiv2D_getVoronoiFacetList(ptr, idxArray, idxArray.Length, out facetListPtr, out facetCentersPtr); } using (VectorOfVectorPoint2f facetListVec = new VectorOfVectorPoint2f(facetListPtr)) { facetList = facetListVec.ToArray(); } using (VectorOfPoint2f facetCentersVec = new VectorOfPoint2f(facetCentersPtr)) { facetCenters = facetCentersVec.ToArray(); } }