예제 #1
0
파일: Disparity.cs 프로젝트: KFlaga/Cam3D
 public static Disparity CreateFromNode(XmlNode node)
 {
     Disparity disp = new Disparity()
     {
         DX = int.Parse(node.Attributes["dx"].Value),
         DY = int.Parse(node.Attributes["dy"].Value),
         SubDX = int.Parse(node.Attributes["subdx"].Value),
         SubDY = int.Parse(node.Attributes["subdy"].Value),
         Cost = double.Parse(node.Attributes["cost"].Value),
         Confidence = double.Parse(node.Attributes["confidence"].Value),
         Flags = ParseDisparityFlags(node.Attributes["flags"].Value)
     };
     return disp;
 }
        public override void StoreDisparity(Disparity disp)
        {
            _dispForPixel.Add(disp);

            if(_minCost > disp.Cost)
            {
                _min2Cost = _minCost;
                _min2Idx = _minIdx;
                _minCost = disp.Cost;
                _minIdx = _dispForPixel.Count - 1;
            }
            else if(_min2Cost > disp.Cost)
            {
                _min2Cost = disp.Cost;
                _min2Idx = _dispForPixel.Count - 1;
            }
        }
예제 #3
0
 public void Set(int y, int x, Disparity d)
 {
     Disparities[y, x] = d;
 }
예제 #4
0
 public int Compare(Disparity x, Disparity y)
 {
     return x.DX < y.DX ? 1 : (x.DX > y.DX ? -1 : 0);
 }
예제 #5
0
 public override void StoreDisparity(Disparity disp)
 {
     _dispForPixel[_idx] = disp;
     ++_idx;
 }
예제 #6
0
        public DisparityMap FilterMap(DisparityMap map)
        {
            DisparityMap filtered = new DisparityMap(map.RowCount, map.ColumnCount);

            Disparity[] window = new Disparity[9];
            int middle = 4;

            int invalidCount = 0;
            Disparity invalidDisparity = new Disparity()
            {
                SubDX = 1e12,
                SubDY = 1e12,
                Flags = (int)DisparityFlags.Invalid
            };
            for(int r = 1; r < map.RowCount - 1; ++r)
            {
                for(int c = 1; c < map.ColumnCount - 1; ++c)
                {
                    int n = 0;
                    invalidCount = 0;
                    for(int y = -1; y <= 1; ++y)
                    {
                        for(int x = -1; x <= 1; ++x)
                        {
                            if((map[r + y, c - 1].Flags & (int)DisparityFlags.Invalid) != 0)
                            {
                                window[n] = invalidDisparity;
                                ++invalidCount;
                            }
                            else
                                window[n] = map[r + y, c - 1];
                            ++n;
                        }
                    }

                    Array.Sort(window, (d1, d2) =>
                    {
                        double r1 = (d1.SubDX * d1.SubDX + d1.SubDY * d1.SubDY);
                        double r2 = (d2.SubDX * d2.SubDX + d2.SubDY * d2.SubDY);
                        return r1 < r2 ? 1 : r1 > r2 ? -1 : 0;
                    });
                    // Set value of image to be median of window
                    filtered.Set(r, c - 1, (Disparity)window[middle + (invalidCount >> 2)].Clone()); // For each 2 invalid cells move middle by 1 pos
                                 // c - 1 to negate some strange horizontal shift
                }
            }

            for(int r = 0; r < map.RowCount; ++r)
            {
                filtered.Set(r, 0, (Disparity)map[r, 0].Clone());
                filtered.Set(r, map.ColumnCount - 2, (Disparity)map[r, map.ColumnCount - 2].Clone());
                filtered.Set(r, map.ColumnCount - 1, (Disparity)map[r, map.ColumnCount - 1].Clone());
            }

            for(int c = 0; c < map.ColumnCount; ++c)
            {
                filtered.Set(0, c, (Disparity)map[0, c].Clone());
                filtered.Set(map.RowCount - 1, c, (Disparity)map[map.RowCount - 1, c].Clone());
            }

            return filtered;
        }
예제 #7
0
 public abstract void StoreDisparity(Disparity disp);