//Not good public static void ReduceColor(Mat mat, int div = 64) { var data = RoadDetector.GetMatData(mat); for (int i = 0; i < data.Length; i++) { data[i] = (byte)(data[i] / div * div); } RoadDetector.SetMatData(mat, data); }
public static RoadStruc FilterRoadByMean(Mat mat) { var data = RoadDetector.GetMatData(mat); const int SPACING = 100; int xspaceEnd = mat.Cols - SPACING; int ystart = 400; int yspacingNoe2 = 2; bool[,] spacing = new bool[yspacingNoe2, (xspaceEnd / SPACING) + 1]; int aty = 0; for (var y = ystart; y < ystart + (yspacingNoe2 * SPACING); y += SPACING, aty++) { for (var x = 0; x < xspaceEnd; x += SPACING) { spacing[aty, x / SPACING] = GetRoadMean(data, mat, x, y, SPACING, SPACING); } } int middle = xspaceEnd / SPACING / 2; int[] leftX = new int[2]; int[] rightX = new int[2]; for (int y = 0; y < yspacingNoe2; y++) { if (spacing[y, middle]) { int left = middle; while (left >= 1 && spacing[y, left - 1]) { left--; } leftX[y] = left; int right = middle; while (right <= spacing.GetUpperBound(1) - 1 && spacing[y, right + 1]) { right++; } rightX[y] = right; } } RoadDetector.SetMatData(mat, data); Func <int, int> tran = x => x + (SPACING / 2); return(new RoadStruc { leftStart = new System.Drawing.Point(tran(leftX[0] * 100), tran(ystart)), leftEnd = new System.Drawing.Point(tran(leftX[1] * 100), tran(ystart + SPACING)), rightStart = new System.Drawing.Point(tran(rightX[0] * 100), tran(ystart)), rightEnd = new System.Drawing.Point(tran(rightX[1] * 100), tran(ystart + SPACING)), }); }
public static void FilterRoadByColor(Mat mat) { var data = RoadDetector.GetMatData(mat); int pos = 0; //const int TOODARK = 120; for (var y = 0; y < mat.Rows; y++) { for (var x = 0; x < mat.Cols; x++) { var b = data[pos]; var g = data[pos + 1]; var r = data[pos + 2]; var gbdiff = g - b; var grdiff = g - r; var gbdiffabs = Math.Abs(gbdiff); var grdiffabs = Math.Abs(grdiff); if (gbdiff > MAXGDIFF && grdiff > MAXGDIFF) { data[pos] = data[pos + 1] = data[pos + 2] = 0; data[pos + 1] = 255; } else if (g > MAXTOP && b > MAXTOP && r > MAXTOP) { data[pos] = data[pos + 1] = data[pos + 2] = 255; } else if (gbdiffabs < MAXDIFF && grdiffabs < MAXDIFF) { data[pos] = data[pos + 1] = data[pos + 2] = GRAY; } pos += mat.ElementSize; } } RoadDetector.SetMatData(mat, data); }