// detects Aruco markers in the frame
        unsafe public static UDetectMarkersData UDetectMarkers(Color32[] texture, int width, int height)
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();
            VectorIntMarshaller           markerIds = new VectorIntMarshaller();
            DoubleVectorPoint2FMarshaller markerCornerMarshaller      = new DoubleVectorPoint2FMarshaller();
            DoubleVectorPoint2FMarshaller rejectedCandidateMarshaller = new DoubleVectorPoint2FMarshaller();


            fixed(Color32 *texP = texture)
            {
                DetectMarkers(
                    texP,
                    width,
                    height,
                    markerIds.NativeDataPointer,
                    markerCornerMarshaller.NativeDataPointer,
                    rejectedCandidateMarshaller.NativeDataPointer
                    );
            }

            UDetectMarkersData markerData = new UDetectMarkersData(
                (int[])markerIds.GetMangedObject(),
                (List <List <Vector2> >)markerCornerMarshaller.GetMangedObject(),
                (List <List <Vector2> >)rejectedCandidateMarshaller.GetMangedObject(),
                markerIds.NativeDataPointer,
                markerCornerMarshaller.NativeDataPointer,
                rejectedCandidateMarshaller.NativeDataPointer
                );

            watch.Stop();
            var elapsedMs = watch.ElapsedMilliseconds;

            return(markerData);
        }
        public unsafe static (UDetectMarkersData, UBoardMarkerPoseEstimationDataEuler) UEstimateCharucoBoardPose(Color32[] texture, int width, int height, CharucoBoardParameters boardParameters, IntPtr cameraMatrix, IntPtr distCoeffs)
        {
            int   cornersH     = 3;
            int   cornersW     = 4;
            float markerLength = 0.045f;
            float squareLength = 0.06f;
            // marshallers
            Vec3dMarshaller     tvecMarshaller = new Vec3dMarshaller();
            Vec3dMarshaller     rvecMarshaller = new Vec3dMarshaller();
            MatDoubleMarshaller eulerAngles    = new MatDoubleMarshaller();
            // marker pointers
            VectorIntMarshaller           markerIds = new VectorIntMarshaller();
            DoubleVectorPoint2FMarshaller markerCornerMarshaller      = new DoubleVectorPoint2FMarshaller();
            DoubleVectorPoint2FMarshaller rejectedCandidateMarshaller = new DoubleVectorPoint2FMarshaller();

            estimateCharucoBoardPosePerfMarker.Begin();
            fixed(Color32 *texP = texture)
            {
                EstimateCharucoBoardPose(
                    texP,
                    width,
                    height,
                    // markerLength,
                    // squareLength,
                    // cornersW,
                    // cornersH,
                    boardParameters.markerLength,
                    boardParameters.squareLength,
                    boardParameters.squaresW,
                    boardParameters.squaresH,
                    markerIds.NativeDataPointer,
                    markerCornerMarshaller.NativeDataPointer,
                    rejectedCandidateMarshaller.NativeDataPointer,
                    cameraMatrix,
                    distCoeffs,
                    rvecMarshaller.NativeDataPointer,
                    tvecMarshaller.NativeDataPointer,
                    eulerAngles.NativeDataPointer
                    );
            }

            estimateCharucoBoardPosePerfMarker.End();

            UDetectMarkersData markerData = new UDetectMarkersData(
                (int[])markerIds.GetMangedObject(),
                (List <List <Vector2> >)markerCornerMarshaller.GetMangedObject(),
                (List <List <Vector2> >)rejectedCandidateMarshaller.GetMangedObject(),
                markerIds.NativeDataPointer,
                markerCornerMarshaller.NativeDataPointer,
                rejectedCandidateMarshaller.NativeDataPointer
                );

            UBoardMarkerPoseEstimationDataEuler PoseEstimateData = new UBoardMarkerPoseEstimationDataEuler(
                (Vec3d)rvecMarshaller.GetMangedObject(),
                (Vec3d)tvecMarshaller.GetMangedObject(),
                (double[][])eulerAngles.GetMangedObject()
                );

            return(markerData : markerData, PoseEstimateData : PoseEstimateData);
        }
        public static USingleMarkerPoseEstimationData UEstimateSingleMarkerPose(DoubleVectorPoint2FMarshaller markerCorners, int markerLenght, IntPtr cameraMatrix, IntPtr distCoeffs)
        {
            float markerLength          = 0.045f;
            VectorVec3dMarshaller rvecs = new VectorVec3dMarshaller();
            VectorVec3dMarshaller tvecs = new VectorVec3dMarshaller();

            EstimateSingleMarkerPose(
                markerLength,
                markerCorners.NativeDataPointer,
                cameraMatrix,
                distCoeffs,
                rvecs.NativeDataPointer,
                tvecs.NativeDataPointer
                );


            USingleMarkerPoseEstimationData PoseEstimateData = new USingleMarkerPoseEstimationData(
                (List <Vec3d>)rvecs.GetMangedObject(),
                (List <Vec3d>)tvecs.GetMangedObject(),
                rvecs.NativeDataPointer,
                tvecs.NativeDataPointer
                );

            return(PoseEstimateData);
        }
 void Start()
 {
     _webCamTexture        = GetComponentInParent <InitWebCamera>().GetCamera();
     _ARRootTransform      = GameObject.FindWithTag("ARRoot").transform;
     allCharucoIds         = new DoubleVectorIntMarshaller();
     allCharucoCorners     = new DoubleVectorPoint2FMarshaller();
     numOfSuccessfulFrames = 0;
 }
Exemplo n.º 5
0
    void Start()
    {
        // setup for android platforms
        #if UNITY_ANDROID
        runningOnAndroid = true;
        numOfFrames      = 40;
        #endif
        // setup for windows platforms
        #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
        runningOnAndroid = false;
        numOfFrames      = 20;
        #endif

        _webCamTexture = GetComponentInParent <InitWebCamera>().GetCamera();

        allCharucoIds         = new DoubleVectorIntMarshaller();
        allCharucoCorners     = new DoubleVectorPoint2FMarshaller();
        numOfSuccessfulFrames = 0;
    }
Exemplo n.º 6
0
        // find calibrates camera with collected data found by UFindCharucoBoardCorners method
        unsafe public static UCameraCalibrationData UCalibrateCameraCharuco(int width, int height, CharucoBoardParameters boardParameters, DoubleVectorIntMarshaller allCharucoIds, DoubleVectorPoint2FMarshaller allCharucoCorners)
        {
            MatDoubleMarshaller distCoeffs   = new MatDoubleMarshaller();
            MatDoubleMarshaller cameraMatrix = new MatDoubleMarshaller();

            double reProjectionError = CalibrateCameraCharuco(
                height,
                width,
                boardParameters.squaresW,
                boardParameters.squaresH,
                boardParameters.squareLength,
                boardParameters.markerLength,
                allCharucoIds.NativeDataPointer,
                allCharucoCorners.NativeDataPointer,
                cameraMatrix.NativeDataPointer,
                distCoeffs.NativeDataPointer
                );


            UCameraCalibrationData calibrationData = new UCameraCalibrationData(
                distCoeffs,
                cameraMatrix,
                reProjectionError
                );

            return(calibrationData);
        }
Exemplo n.º 7
0
        // find charuco board corners in frame with given board parameters and imbues marshaller objects with information found
        unsafe public static bool UFindCharucoBoardCorners(Color32[] texture, int width, int height, CharucoBoardParameters boardParameters, DoubleVectorIntMarshaller allCharucoIds, DoubleVectorPoint2FMarshaller allCharucoCorners)
        {
            bool   foundBoard        = false;
            IntPtr foundBoardMarkers = CreateBooleanPointer();

            fixed(Color32 *texP = texture)
            {
                DetectCharucoBoard(
                    texP,
                    width,
                    height,
                    boardParameters.squaresW,
                    boardParameters.squaresH,
                    boardParameters.squareLength,
                    boardParameters.markerLength,
                    foundBoardMarkers,
                    allCharucoIds.NativeDataPointer,
                    allCharucoCorners.NativeDataPointer
                    );
            }

            if (Marshal.ReadByte(foundBoardMarkers, 0) > 0)
            {
                foundBoard = true;
            }

            DeleteBooleanPointer(foundBoardMarkers);

            return(foundBoard);
        }
Exemplo n.º 8
0
        // public static UCameraCalibrationData UStaticCalibrateCameraData()
        // {

        //     MatDoubleMarshaller distCoeffs = new MatDoubleMarshaller();
        //     MatDoubleMarshaller cameraMatrix = new MatDoubleMarshaller();

        //     StaticCameraCalibData(
        //         cameraMatrix.NativeDataPointer,
        //         distCoeffs.NativeDataPointer,
        //         true
        //     );

        //     UCameraCalibrationData calibrationData = new UCameraCalibrationData(
        //         distCoeffs,
        //         cameraMatrix
        //     );

        //     return calibrationData;
        // }

        // unsafe public static UCameraCalibrationData UCalibrateCamera(Color32[] texture, int width, int height, DoubleVectorIntMarshaller allCharucoIds, DoubleVectorPoint2FMarshaller allCharucoCorners)
        // {

        //     var watch = System.Diagnostics.Stopwatch.StartNew();

        //     // IntPtr distCoeffs = OpenCVMarshal.CreateMatPointer();
        //     MatDoubleMarshaller distCoeffs = new MatDoubleMarshaller();
        //     // IntPtr cameraMatrix = OpenCVMarshal.CreateMatPointer();
        //     MatDoubleMarshaller cameraMatrix = new MatDoubleMarshaller();

        //     fixed (Color32* texP = texture)
        //     {
        //         CalibrateCamera(
        //             texP,
        //             width,
        //             height,
        //             allCharucoIds.NativeDataPointer,
        //             allCharucoCorners.NativeDataPointer,
        //             cameraMatrix.NativeDataPointer,
        //             distCoeffs.NativeDataPointer
        //         );
        //     }


        //     UCameraCalibrationData calibrationData = new UCameraCalibrationData(
        //         distCoeffs,
        //         cameraMatrix
        //     );

        //     watch.Stop();
        //     var elapsedMs = watch.ElapsedMilliseconds;

        //     return calibrationData;
        // }
        unsafe public static UCameraCalibrationData UCalibrateCameraCharuco(int width, int height, CharucoBoardParameters boardParameters, DoubleVectorIntMarshaller allCharucoIds, DoubleVectorPoint2FMarshaller allCharucoCorners)
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();
            // IntPtr distCoeffs = OpenCVMarshal.CreateMatPointer();
            MatDoubleMarshaller distCoeffs = new MatDoubleMarshaller();
            // IntPtr cameraMatrix = OpenCVMarshal.CreateMatPointer();
            MatDoubleMarshaller cameraMatrix = new MatDoubleMarshaller();

            double reProjectionError = CalibrateCameraCharuco(
                height,
                width,
                boardParameters.squaresW,
                boardParameters.squaresH,
                boardParameters.squareLength,
                boardParameters.markerLength,
                allCharucoIds.NativeDataPointer,
                allCharucoCorners.NativeDataPointer,
                cameraMatrix.NativeDataPointer,
                distCoeffs.NativeDataPointer
                );


            UCameraCalibrationData calibrationData = new UCameraCalibrationData(
                distCoeffs,
                cameraMatrix,
                reProjectionError
                );

            watch.Stop();
            var elapsedMs = watch.ElapsedMilliseconds;

            return(calibrationData);
        }
Exemplo n.º 9
0
        unsafe public static bool UFindCharucoBoardCorners(Color32[] texture, int width, int height, CharucoBoardParameters boardParameters, DoubleVectorIntMarshaller allCharucoIds, DoubleVectorPoint2FMarshaller allCharucoCorners)
        {
            var watch = System.Diagnostics.Stopwatch.StartNew();

            int    cornersH          = 9;
            int    cornersW          = 6;
            float  squareLength      = 0.025f;
            float  markersLength     = 0.0125f;
            bool   foundBoard        = false;
            IntPtr foundBoardMarkers = CreateBooleanPointer();

            fixed(Color32 *texP = texture)
            {
                DetectCharucoBoard(
                    texP,
                    width,
                    height,
                    boardParameters.squaresW,
                    boardParameters.squaresH,
                    boardParameters.squareLength,
                    boardParameters.markerLength,
                    foundBoardMarkers,
                    allCharucoIds.NativeDataPointer,
                    allCharucoCorners.NativeDataPointer
                    );
            }

            watch.Stop();
            var elapsedMs = watch.ElapsedMilliseconds;

            if (Marshal.ReadByte(foundBoardMarkers, 0) > 0)
            {
                foundBoard = true;
            }

            DeleteBooleanPointer(foundBoardMarkers);

            return(foundBoard);
        }