예제 #1
0
        public void FindObject_1stTracking()
        {
            // arrange - instantiate tracker
            InstantiateTracker();

            // arrange - load new/current frame
            Image <Gray, byte> currentFrame = new Image <Gray, byte>
                                              (
                Path.Combine(_resourceDir, "violeta_6.jpg")
                                              );

            // define expected - status and new/current bounding box
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.OK;
            IBoundingBox            expectedBB     = new BoundingBox
                                                     (
                new PointF(100, 89),
                new SizeF(70, 40)
                                                     );

            // get actual
            IBoundingBox            actualBB     = _tracker.FindObject(currentFrame);
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // assert
            Assert.AreEqual(expectedStatus, actualStatus);
            float overlap = actualBB.GetOverlap(expectedBB);

            Assert.AreEqual(0.95f, overlap, 0.05f);
        }
예제 #2
0
        public void FindObject_2ReliableShifts()
        {
            // 1.1 arrange - typical case
            ArrangeTypicalCase();

            // 1.2 arrange - change fb error and ncc for each point.
            // Exactly 2 shifts have both fbError <= median(fbError) and ncc >= median(ncc)
            _service.FBErrorsList = new List <List <float> >();
            _service.FBErrorsList.Add(new List <float>()
            {
                0, 0, 0,
                2, 2, 2
            });
            _service.NCCsList = new List <List <float> >();
            _service.NCCsList.Add(new List <float>()
            {
                1, 1, -1,
                -1, -1, 1
            });

            // 2. define expected
            IBoundingBox expectedBB = new BoundingBoxStub(
                new PointF(2, 3.5f),
                new SizeF(6, 2)
                );
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.OK;

            // 3. get actual
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.IsTrue((actualBB as BoundingBoxStub).IsEqualTo(expectedBB as BoundingBoxStub));
            Assert.AreEqual(expectedStatus, actualStatus);
        }
예제 #3
0
        public void FindObject_1ValidShift()
        {
            // 1.1 arrange - typical case
            ArrangeTypicalCase();

            // 1.2 arrange - change how points are tracked forward and backward.
            // Only 1 point is tracked both forward and backward succesfully.
            _LKtracker.ForwardStatusList = new List <byte[]>();
            _LKtracker.ForwardStatusList.Add(new byte[] {
                1, 0, 0, 0,
                0, 0, 0, 0
            });
            _LKtracker.BackwardStatusList = new List <byte[]>();
            _LKtracker.BackwardStatusList.Add(new byte[] {
                1, 0, 0, 0,
                0, 0, 0, 0
            });

            // 2. define expected
            IBoundingBox            expectedBB     = null;
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.NOT_ENOUGH_VALID_SHIFTS;

            // 3. get actual
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.AreEqual(expectedBB, actualBB);
            Assert.AreEqual(expectedStatus, actualStatus);
        }
예제 #4
0
        public void FindObject_1ReliableShift()
        {
            // 1.1 arrange - typical case
            ArrangeTypicalCase();

            // 1.2 arrange - change fb error and ncc for each point.
            // Only one point has both fbError <= median(fbError) and ncc >= median(ncc)
            _service.FBErrorsList = new List <List <float> >();
            _service.FBErrorsList.Add(new List <float>()
            {
                0, 0, 0,
                2, 2, 2
            });
            _service.NCCsList = new List <List <float> >();
            _service.NCCsList.Add(new List <float>()
            {
                1, -1, -1,
                -1, 1, 1
            });

            // 2. define expected
            IBoundingBox            expectedBB     = null;
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.NOT_ENOUGH_RELIABLE_SHIFTS;

            // 3. get actual
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.AreEqual(expectedBB, actualBB);
            Assert.AreEqual(expectedStatus, actualStatus);
        }
예제 #5
0
        public void FindObject_DifferentReliableShifts()
        {
            // 1.1 arrange - typical case
            ArrangeTypicalCase();

            // 1.2 arrange - change fb error and ncc values - we want points 3 and 6 to be reliable
            // points order in lists:             {  1,  2,  3,  6,  7,  8}
            _service.FBErrorsList = new List <List <float> >();
            _service.FBErrorsList.Add(new List <float>()
            {
                0, 0, 0,
                0, 2, 2
            });
            _service.NCCsList = new List <List <float> >();
            _service.NCCsList.Add(new List <float>()
            {
                -1, -1, 1,
                1, 1, 1
            });

            // 2. define expected
            PointF expectedCenter = new PointF(3.5f, 0.5f);
            SizeF  expectedSize   = new SizeF(3, 1);
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.OK;

            // 3. get actual
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.AreEqual(expectedCenter, (actualBB as BoundingBoxStub).CenterStub);
            Assert.AreEqual(expectedSize, (actualBB as BoundingBoxStub).SizeStub);
            Assert.AreEqual(expectedStatus, actualStatus);
        }
예제 #6
0
        public void FindObject_2ValidShifts_Fails()
        {
            // 1.1 arrange - typical case
            ArrangeTypicalCase();

            // 1.2 arrange - change how points are tracked forward and backward.
            // Exactly 2 points are tracked both forward and backward succesfully.
            _LKtracker.ForwardStatusList = new List <byte[]>();
            _LKtracker.ForwardStatusList.Add(new byte[] {
                1, 1, 0, 0,
                0, 0, 0, 0
            });
            _LKtracker.BackwardStatusList = new List <byte[]>();
            _LKtracker.BackwardStatusList.Add(new byte[] {
                1, 1, 0, 0,
                0, 0, 0, 0
            });

            // 1.3 arrange - change fb error and ncc for each point.
            // Exactly 1 shift has both fbError <= median(fbError) and ncc >= median(ncc)
            _service.FBErrorsList = new List <List <float> >();
            _service.FBErrorsList.Add(new List <float>()
            {
                0, 0, 0,
                2, 2, 2
            });
            _service.NCCsList = new List <List <float> >();
            _service.NCCsList.Add(new List <float>()
            {
                1, -1, -1,
                -1, 1, 1
            });

            // 2. define expected
            IBoundingBox            expectedBB     = null;
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.NOT_ENOUGH_RELIABLE_SHIFTS;

            // 3. get actual
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.AreEqual(expectedBB, actualBB);
            Assert.AreEqual(expectedStatus, actualStatus);
        }
예제 #7
0
        public void FindObject_MADTooBig()
        {
            // 1.1 arrange - typical case
            ArrangeTypicalCase();

            // 1.2 arrange - change how points are tracked forward and backward.
            // 4 points are tracked both forward and backward succesfully.
            _LKtracker.ForwardStatusList = new List <byte[]>();
            _LKtracker.ForwardStatusList.Add(new byte[] {
                1, 1, 1, 1,
                0, 0, 0, 0
            });
            _LKtracker.BackwardStatusList = new List <byte[]>();
            _LKtracker.BackwardStatusList.Add(new byte[] {
                1, 1, 1, 1,
                0, 0, 0, 0
            });

            // 1.3 arrange - change fb error for each point.
            // MAD must be bigger that a threshold ( == 10, set in ArrangeTypicalCase()).
            _service.FBErrorsList = new List <List <float> >();
            _service.FBErrorsList.Add(new List <float>()
            {
                0, 0, 21, 21
            });
            _service.NCCsList = new List <List <float> >();
            _service.NCCsList.Add(new List <float>()
            {
                1, 1, 1, 1
            });

            // 2. define expected
            IBoundingBox            expectedBB     = null;
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.MAD_TOO_BIG;

            // 3. get actual
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.AreEqual(expectedBB, actualBB);
            Assert.AreEqual(expectedStatus, actualStatus);
        }
예제 #8
0
        public void FindObject_TypicalCase()
        {
            // 1. arrange
            ArrangeTypicalCase();

            // 2. define expected
            PointF expectedCenter = new PointF(3, 4);
            SizeF  expectedSize   = new SizeF(6, 2);
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.OK;

            // 3. get actual
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.AreEqual(expectedCenter, (actualBB as BoundingBoxStub).CenterStub);
            Assert.AreEqual(expectedSize, (actualBB as BoundingBoxStub).SizeStub);
            Assert.AreEqual(expectedStatus, actualStatus);
        }
예제 #9
0
        public void FindObject_2ndTracking()
        {
            // arrange - instantiate tracker
            InstantiateTracker();

            // arrange - track for the first time
            Image <Gray, byte> currentFrame1 = new Image <Gray, byte>
                                               (
                Path.Combine(_resourceDir, "violeta_6.jpg")
                                               );

            _tracker.FindObject(currentFrame1);

            // arrange - prepare new/current frame for tracking the second time
            Image <Gray, byte> currentFrame2 = new Image <Gray, byte>
                                               (
                Path.Combine(_resourceDir, "violeta_7.jpg")
                                               );

            // define expected - status and new/current bounding box
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.OK;
            float        expectedNccMedian         = 0.9f;
            IBoundingBox expectedBB = new BoundingBox
                                      (
                new PointF(111, 101),
                new SizeF(70, 40)
                                      );

            // get actual
            IBoundingBox            actualBB     = _tracker.FindObject(currentFrame2);
            MedianFlowTrackerStatus actualStatus = _tracker.Status;
            float actualNccMedian = _tracker.NccMedian;

            // assert
            Assert.AreEqual(expectedStatus, actualStatus);
            Assert.AreEqual(expectedNccMedian, actualNccMedian, 0.1f);
            float overlap = actualBB.GetOverlap(expectedBB);

            Assert.AreEqual(0.95f, overlap, 0.05f);
        }
예제 #10
0
        public void FindObject_PostInit()
        {
            // 1.1 arrange - typical case
            ArrangeTypicalCase();

            // 1.2. arrange data for the 2nd frame
            //      1.2.1 bounding box
            PointF bbCenter = new PointF(3, 4);
            SizeF  bbSize   = new SizeF(6, 2);

            PointF[] bbVisiblePoints = new PointF[] {
                new PointF(0, 3), new PointF(2, 3), new PointF(4, 3), new PointF(6, 3),
                new PointF(0, 5), new PointF(2, 5), new PointF(4, 5), new PointF(6, 5)
            };
            IMedianFlowTrackerBoundingBox bb = new MedianFlowTrackerBoundingBoxStub(bbCenter, bbSize, bbVisiblePoints);

            _bb.HardcodedNextBB = (bb as MedianFlowTrackerBoundingBoxStub);

            //      1.2.2 arrange - set forward and backward points.
            //                      All points are tracked both forward and backward succesfully.
            _LKtracker.ForwardPointsList.Add(new PointF[] {
                new PointF(1, 3), new PointF(3, 3), new PointF(5, 3), new PointF(7, 3),
                new PointF(1, 5), new PointF(3, 5), new PointF(5, 5), new PointF(7, 5)
            });
            _LKtracker.BackwardPointsList.Add(new PointF[] {
                new PointF(0, 3), new PointF(2, 3), new PointF(4, 3), new PointF(6, 3),
                new PointF(0, 5), new PointF(2, 5), new PointF(4, 5), new PointF(6, 5)
            });
            _LKtracker.ForwardStatusList.Add(new byte[] {
                1, 1, 1, 1,
                1, 1, 1, 1
            });
            _LKtracker.BackwardStatusList.Add(new byte[] {
                1, 1, 1, 1,
                1, 1, 1, 1
            });

            //      1.2.3 arrange - change fb error for each point.
            //                      Every point should be reliable.
            _service.FBErrorsList.Add(new List <float>()
            {
                0, 0, 0, 0,
                0, 0, 0, 0
            });
            _service.NCCsList.Add(new List <float>()
            {
                1, 1, 1, 1,
                1, 1, 1, 1
            });

            // 1.3. arrange - call tracker the first time
            _tracker.FindObject(new Image <Gray, byte>(_frameSize));

            // 2. define expected
            IBoundingBox expectedBB = new BoundingBoxStub(
                new PointF(4, 4),
                new SizeF(6, 2)
                );
            MedianFlowTrackerStatus expectedStatus = MedianFlowTrackerStatus.OK;

            // 3. get actual - call tracker for the second time
            IBoundingBox            actualBB     = _tracker.FindObject(new Image <Gray, byte>(_frameSize));
            MedianFlowTrackerStatus actualStatus = _tracker.Status;

            // 4. assert
            Assert.AreEqual((expectedBB as BoundingBoxStub).CenterStub, (actualBB as BoundingBoxStub).CenterStub);
            Assert.AreEqual((expectedBB as BoundingBoxStub).SizeStub, (actualBB as BoundingBoxStub).SizeStub);
            Assert.AreEqual(expectedStatus, actualStatus);
        }