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; } }
public void Set(int y, int x, Disparity d) { Disparities[y, x] = d; }
public int Compare(Disparity x, Disparity y) { return x.DX < y.DX ? 1 : (x.DX > y.DX ? -1 : 0); }
public override void StoreDisparity(Disparity disp) { _dispForPixel[_idx] = disp; ++_idx; }
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; }
public abstract void StoreDisparity(Disparity disp);