private Dictionary<int, List<MarkerStructure>> MarkerTracker(OpenCvSharp.Mat frame, int video_idx, int frame_number)
        {
            if (frame.Empty())
                return null;

            using (var detector = new Aruco.Net.MarkerDetector())
            {
                Dictionary<int, List<MarkerStructure>> MarkerDict = new Dictionary<int, List<MarkerStructure>>();

                var cameraMatrix = new OpenCV.Net.Mat(3, 3, OpenCV.Net.Depth.F32, 1);
                var distortion = new OpenCV.Net.Mat(1, 4, OpenCV.Net.Depth.F32, 1);

                detector.ThresholdMethod = ThresholdMethod.AdaptiveThreshold;
                detector.Param1 = 7.0;
                detector.Param2 = 7.0;
                detector.MinSize = 0.04f;
                detector.MaxSize = 0.5f;
                detector.CornerRefinement = CornerRefinementMethod.Lines;

                // Detect markers in a sequence of camera images.
                var markerSize = 10;
                var image2 = 
                    new OpenCV.Net.Mat(new OpenCV.Net.Size(frame.Width, frame.Height), 
                    (OpenCV.Net.Depth)frame.Depth(), frame.Channels(), frame.Data);

                try {
                    var detectedMarkers = detector.Detect(image2, cameraMatrix, distortion, markerSize);
                    foreach (var marker in detectedMarkers)
                    {
                        //event trigger
                        List<MarkerStructure> tmp = new List<MarkerStructure>();
                        if (!MarkerDict.TryGetValue(marker.Id, out tmp))
                        {
                            if (tmp != null)
                            {
                                tmp.Add(new MarkerStructure(marker.Id, video_idx, frame_number,
                                    new OpenCV.Net.Point2f(marker.Center.X - (marker.Size / 2), marker.Center.Y - (marker.Size / 2)),
                                    new OpenCV.Net.Size((int)marker.Size, (int)marker.Size)));
                                MarkerDict[marker.Id] = tmp;
                            }
                            else
                            {
                                List<MarkerStructure> tmp2 = new List<MarkerStructure>();
                                tmp2.Add(new MarkerStructure(marker.Id, video_idx, frame_number,
                                    new OpenCV.Net.Point2f(marker.Center.X - (marker.Size / 2), marker.Center.Y - (marker.Size / 2)),
                                    new OpenCV.Net.Size((int)marker.Size, (int)marker.Size)));
                                MarkerDict[marker.Id] = tmp2;
                            }
                        }
                        else
                        {
                            List<MarkerStructure> new_list = new List<MarkerStructure>();
                            new_list.Add(new MarkerStructure(marker.Id, video_idx, frame_number,
                                new OpenCV.Net.Point2f(marker.Center.X - (marker.Size / 2), marker.Center.Y - (marker.Size / 2)),
                                new OpenCV.Net.Size((int)marker.Size, (int)marker.Size)));
                            MarkerDict.Add(marker.Id, new_list);
                        }
                    }
                } catch(Exception)
                {
                }

                return MarkerDict;
            }
        }
        private Dictionary <int, List <MarkerStructure> > MarkerTracker(OpenCvSharp.Mat frame, int frame_number)
        {
            if (frame.Empty())
            {
                return(null);
            }

            using (var detector = new Aruco.Net.MarkerDetector())
            {
                Dictionary <int, List <MarkerStructure> > MarkerDict = new Dictionary <int, List <MarkerStructure> >();

                var cameraMatrix = new OpenCV.Net.Mat(3, 3, OpenCV.Net.Depth.F32, 1);
                var distortion   = new OpenCV.Net.Mat(1, 4, OpenCV.Net.Depth.F32, 1);

                detector.ThresholdMethod  = ThresholdMethod.AdaptiveThreshold;
                detector.Param1           = 7.0;
                detector.Param2           = 7.0;
                detector.MinSize          = 0.04f;
                detector.MaxSize          = 0.5f;
                detector.CornerRefinement = CornerRefinementMethod.Lines;

                // Detect markers in a sequence of camera images.
                var markerSize = 10;
                var image2     =
                    new OpenCV.Net.Mat(new OpenCV.Net.Size(frame.Width, frame.Height),
                                       (OpenCV.Net.Depth)frame.Depth(), frame.Channels(), frame.Data);

                try {
                    var detectedMarkers = detector.Detect(image2, cameraMatrix, distortion, markerSize);
                    foreach (var marker in detectedMarkers)
                    {
                        //event trigger
                        List <MarkerStructure> tmp = new List <MarkerStructure>();
                        if (!MarkerDict.TryGetValue(marker.Id, out tmp))
                        {
                            if (tmp != null)
                            {
                                tmp.Add(new MarkerStructure(marker.Id, frame_number,
                                                            new OpenCV.Net.Point2f(marker.Center.X - (marker.Size / 2), marker.Center.Y - (marker.Size / 2)),
                                                            new OpenCV.Net.Size((int)marker.Size, (int)marker.Size)));
                                MarkerDict[marker.Id] = tmp;
                            }
                            else
                            {
                                List <MarkerStructure> tmp2 = new List <MarkerStructure>();
                                tmp2.Add(new MarkerStructure(marker.Id, frame_number,
                                                             new OpenCV.Net.Point2f(marker.Center.X - (marker.Size / 2), marker.Center.Y - (marker.Size / 2)),
                                                             new OpenCV.Net.Size((int)marker.Size, (int)marker.Size)));
                                MarkerDict[marker.Id] = tmp2;
                            }
                        }
                        else
                        {
                            List <MarkerStructure> new_list = new List <MarkerStructure>();
                            new_list.Add(new MarkerStructure(marker.Id, frame_number,
                                                             new OpenCV.Net.Point2f(marker.Center.X - (marker.Size / 2), marker.Center.Y - (marker.Size / 2)),
                                                             new OpenCV.Net.Size((int)marker.Size, (int)marker.Size)));
                            MarkerDict.Add(marker.Id, new_list);
                        }
                    }
                } catch (Exception)
                {
                }

                return(MarkerDict);
            }
        }