// Update is called once per frame void Update() { if (webCamTextureToMatHelper.IsPlaying() && webCamTextureToMatHelper.DidUpdateThisFrame()) { Mat rgbaMat = webCamTextureToMatHelper.GetMat(); Imgproc.cvtColor(rgbaMat, rgbMat, Imgproc.COLOR_RGBA2RGB); // detect markers. Aruco.detectMarkers(rgbMat, dictionary, corners, ids, detectorParams, rejectedCorners, camMatrix, distCoeffs); // refine marker detection. if (refineMarkerDetection && (markerType == MarkerType.GridBoard || markerType == MarkerType.ChArUcoBoard)) { switch (markerType) { case MarkerType.GridBoard: Aruco.refineDetectedMarkers(rgbMat, gridBoard, corners, ids, rejectedCorners, camMatrix, distCoeffs, 10f, 3f, true, recoveredIdxs, detectorParams); break; case MarkerType.ChArUcoBoard: Aruco.refineDetectedMarkers(rgbMat, charucoBoard, corners, ids, rejectedCorners, camMatrix, distCoeffs, 10f, 3f, true, recoveredIdxs, detectorParams); break; } } // if at least one marker detected if (ids.total() > 0) { if (markerType != MarkerType.ChArUcoDiamondMarker) { if (markerType == MarkerType.ChArUcoBoard) { Aruco.interpolateCornersCharuco(corners, ids, rgbMat, charucoBoard, charucoCorners, charucoIds, camMatrix, distCoeffs, charucoMinMarkers); // draw markers. Aruco.drawDetectedMarkers(rgbMat, corners, ids, new Scalar(0, 255, 0)); if (charucoIds.total() > 0) { Aruco.drawDetectedCornersCharuco(rgbMat, charucoCorners, charucoIds, new Scalar(0, 0, 255)); } } else { // draw markers. Aruco.drawDetectedMarkers(rgbMat, corners, ids, new Scalar(0, 255, 0)); } // estimate pose. if (applyEstimationPose) { switch (markerType) { default: case MarkerType.CanonicalMarker: EstimatePoseCanonicalMarker(rgbMat); break; case MarkerType.GridBoard: EstimatePoseGridBoard(rgbMat); break; case MarkerType.ChArUcoBoard: EstimatePoseChArUcoBoard(rgbMat); break; } } } else { // detect diamond markers. Aruco.detectCharucoDiamond(rgbMat, corners, ids, diamondSquareLength / diamondMarkerLength, diamondCorners, diamondIds, camMatrix, distCoeffs); // draw markers. Aruco.drawDetectedMarkers(rgbMat, corners, ids, new Scalar(0, 255, 0)); // draw diamond markers. Aruco.drawDetectedDiamonds(rgbMat, diamondCorners, diamondIds, new Scalar(0, 0, 255)); // estimate pose. if (applyEstimationPose) { EstimatePoseChArUcoDiamondMarker(rgbMat); } } } if (showRejectedCorners && rejectedCorners.Count > 0) { Aruco.drawDetectedMarkers(rgbMat, rejectedCorners, new Mat(), new Scalar(255, 0, 0)); } // Imgproc.putText (rgbaMat, "W:" + rgbaMat.width () + " H:" + rgbaMat.height () + " SO:" + Screen.orientation, new Point (5, rgbaMat.rows () - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar (255, 255, 255, 255), 2, Imgproc.LINE_AA, false); Utils.fastMatToTexture2D(rgbMat, texture); } }