コード例 #1
0
ファイル: VidLoc.cs プロジェクト: gzhangx/netcvreco
        public static DiffVect CompDiff(Mat input, Mat comp, BreakDiffDebugReporter reporter)
        {
            var processor = new ShiftVecProcessor(input, comp);
            var vect      = processor.GetAllDiffVect();

            if (reporter != null)
            {
                reporter.ReportStepChanges(processor, vect);
            }
            return(vect);
        }
コード例 #2
0
ファイル: VidLoc.cs プロジェクト: gzhangx/netcvreco
        public static void breakAndDiff(Mat m1, Mat m2, BreakDiffDebugReporter reporter)
        {
            var curProcessor = new ShiftVecProcessor(m1, m2);
            //Mat res = ShiftVecDector.BreakAndNearMatches(m1, m2);
            var vect = curProcessor.GetAllDiffVect();


            Mat res = curProcessor.ShowAllStepChange(vect);

            reporter.Report(res, vect);
        }
コード例 #3
0
ファイル: VidLoc.cs プロジェクト: gzhangx/netcvreco
 public void CamTracking(Mat curImg, VidLoc.RealTimeTrackLoc realTimeTrack, PreVidStream vidProvider, IDriver driver, BreakDiffDebugReporter debugReporter)
 {
     VidLoc.CamTracking(curImg, realTimeTrack, vidProvider, driver, debugReporter);
 }
コード例 #4
0
ファイル: VidLoc.cs プロジェクト: gzhangx/netcvreco
        public static void CamTracking(Mat curImg, VidLoc.RealTimeTrackLoc realTimeTrack, PreVidStream vidProvider, IDriver driver, BreakDiffDebugReporter debugReporter)
        {
            //realTimeTrack.CurPos = image1Ind;
            realTimeTrack.LookAfterReset();
            if (!realTimeTrack.ShouldStop())
            {
                int origImageInd = realTimeTrack.CurPos;
                debugReporter.ReportInProcessing(true);
                VidLoc.FindObjectDown(vidProvider, curImg, realTimeTrack, debugReporter);
                debugReporter.ReportInProcessing(false);

                //var lookBackCount = 0;
                //while (realTimeTrack.diff < 0.5 && lookBackCount < 3)
                //{
                //    driver.Stop();
                //    realTimeTrack.LongLook();
                //    VidLoc.FindObjectDown(vidProvider, curImg, realTimeTrack, debugReporter);
                //    //info.Text = text = $"Tracked vid at ${image1Ind} cam at ${image2Ind} next point ${realTimeTrack.NextPos} ${realTimeTrack.vect}  ===> diff {realTimeTrack.diff} LB {lookBackCount}";
                //    //Console.WriteLine(text);
                //    lookBackCount++;
                //}

                vidProvider.Pos = origImageInd;
            }
            driver.Track(realTimeTrack);
            //if (debugReporter.DebugMode)
            //{
            //Mat m1 = vidProvider.GetCurMat();
            //breakAndDiff(m1, curImg, debugReporter);
            //}
        }
コード例 #5
0
ファイル: VidLoc.cs プロジェクト: gzhangx/netcvreco
        public static void FindObjectDown(PreVidStream stream, Mat curr, RealTimeTrackLoc prms, BreakDiffDebugReporter reporter)
        {
            const int LookBack = 2;
            int       from     = prms.CurPos - LookBack;
            int       to       = from + prms.LookAfter + LookBack;

            if (to == 0 || to > stream.Total)
            {
                to = stream.Total;
            }
            if (from < 0)
            {
                from = 0;
            }
            var             skipAvgs  = prms.CurPos >= LookBack ? LookBack : LookBack - prms.CurPos;
            List <DiffVect> processed = new List <DiffVect>();

            //double dxT = 0, dyT = 0;
            //int numD = 0;
            for (int pos = from; pos < to; pos++)
            {
                var loc = FindInRage(stream, curr, 1, pos, pos + 1);
                processed.Add(loc);
            }

            if (processed[2].Vector.Diff > 0.5)
            {
                for (var i = 0; i < LookBack; i++)
                {
                    processed.RemoveAt(0);
                }
            }
            //processed.OrderByDescending(x => x.Vector.Diff).Take(3);

            prms.DebugAllLooks = processed;
            var sorted = SortProcessDiffVects(processed).Take(5);
            var curMax = sorted.FirstOrDefault();

            if (curMax == null || curMax.VidPos >= stream.Total - 1)
            {
                Console.WriteLine($"max not found from={from} to={to} total={stream.Total}");
                return;
            }
            //Console.WriteLine($"max at {curMax.Pos} {curMax.diff.ToString("0.00")}");
            prms.NextPos = curMax.VidPos;
            prms.diff    = curMax.Vector.Diff;
            prms.vect    = curMax.Vector;

            stream.Pos = curMax.VidPos;
            var diff = CompDiff(curr, stream.GetCurMat(), reporter);
            //var nextVect = stream.Vectors[curMax.VidPos];  //orig way
            var nextVect = new DiffVector(sorted.Average(x => x.Vector.X), sorted.Average(y => y.Vector.Y), sorted.Average(d => d.Vector.Diff));

            //diff: negative if need to turn left
            //vect: positive if need to turn left
            prms.vect = new DiffVector(nextVect.X + (diff.Vector.X / 10.0), nextVect.Y + diff.Vector.Y, diff.Vector.Diff);

            reporter.InfoReport($"===> {(prms.vect.X>0?"L":"R")} ({prms.vect}) nextX {nextVect.X} diffX {diff.Vector.X} pos {curMax.VidPos}", true);

            prms.diffVect = diff;
            prms.nextVect = nextVect;
        }
コード例 #6
0
        public void CamTracking(Mat curImg, VidLoc.RealTimeTrackLoc realTimeTrack, PreVidStream vidProvider, IDriver driver, BreakDiffDebugReporter debugReporter)
        {
            debugReporter.ReportInProcessing(true);
            results       = haar.Detect(curImg);
            result.Width  = 0;
            result.Height = 0;
            if (results != null && results.Length > 0)
            {
                results = results.OrderByDescending(r => r.Width * r.Height).ToArray();
                result  = results[0];
            }
            debugReporter.ReportInProcessing(false);
            realTimeTrack.CurPos = 0;
            DiffVect vect = new DiffVect();

            vect.Vector = realTimeTrack.vect;
            debugReporter.ReportStepChanges(new StepChangeReporter(curImg, results, result), vect);
            if (result.Width == 0)
            {
                //debugReporter.InfoReport($"NA");
                driver.Stop();
            }
            else
            {
                double diff = (curImg.Width / 2) - ((result.X + result.Width) / 2);
                //debugReporter.InfoReport($"{(diff > 0? "L":"R") } diff {diff.ToString("0.0")} imw ${((result.X + result.Width) / 2)}");
                realTimeTrack.vect = new DiffVector(diff, 0, 0);
                driver.Track(realTimeTrack);
            }
        }