예제 #1
0
        //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);
        }
예제 #2
0
        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)),
            });
        }
예제 #3
0
        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);
        }
예제 #4
0
        public static int[] GetRoadMeanTest()
        {
            Mat mean        = CvInvoke.Imread("roadmean.png");
            var data        = RoadDetector.GetMatData(mean);
            int maxAdjBdiff = 0;
            int maxAdjGdiff = 0;
            int maxAdjRdiff = 0;


            int maxBGdiff = 0;
            int maxGRdiff = 0;
            int maxBRdiff = 0;

            int   ROWLEN = mean.Rows * mean.ElementSize;
            float totalB = 0;
            float totalG = 0;
            float totalR = 0;
            int   maxB   = 0;
            int   maxG   = 0;
            int   maxR   = 0;

            int[] colorCount = new int[255];
            for (int i = 3; i < data.Length - ROWLEN; i += mean.ElementSize)
            {
                var b = data[i];
                var g = data[i + 1];
                var r = data[i + 2];

                var pi = i - mean.ElementSize;
                var pb = data[pi];
                var pg = data[pi + 1];
                var pr = data[pi + 2];

                var bi = i + ROWLEN;

                totalB += b;
                totalG += g;
                totalR += r;
                if (b > maxB)
                {
                    maxB = b;
                }
                if (g > maxG)
                {
                    maxG = g;
                }
                if (r > maxR)
                {
                    maxR = r;
                }

                var bgdiff = Math.Abs(b - g);
                var grdiff = Math.Abs(r - g);
                var brdiff = Math.Abs(b - r);
                if (bgdiff > maxBGdiff)
                {
                    maxBGdiff = bgdiff;
                }
                if (grdiff > maxGRdiff)
                {
                    maxGRdiff = grdiff;
                }
                if (brdiff > maxBRdiff)
                {
                    maxBRdiff = brdiff;
                }

                var bpdiff = Math.Abs(b - pb);
                if (bpdiff > maxAdjBdiff)
                {
                    maxAdjBdiff = bpdiff;
                }

                var gpdiff = Math.Abs(g - pg);
                if (gpdiff > maxAdjGdiff)
                {
                    maxAdjGdiff = gpdiff;
                }
                var rpdiff = Math.Abs(r - pr);
                if (rpdiff > maxAdjRdiff)
                {
                    maxAdjRdiff = rpdiff;
                }
                colorCount[(b + g + r) / 3]++;
            }


            int  peakPos = 0;
            int  peakVal = 0;
            long total   = 0;

            for (var i = 0; i < colorCount.Length; i++)
            {
                var cur = colorCount[i];
                total += cur;
                if (cur > peakVal)
                {
                    peakVal = cur;
                    peakPos = i;
                }
            }
            int peakSpread = colorCount[peakPos];

            Console.WriteLine("peak spread at " + peakPos + " is " + peakSpread + " " + (peakSpread * 1.0 / total));
            for (var i = 1; i < 20; i++)
            {
                if (peakPos + i < colorCount.Length)
                {
                    peakSpread += colorCount[peakPos + i];
                }
                if (peakPos - i >= 0)
                {
                    peakSpread += colorCount[peakPos - i];
                }
                Console.WriteLine("peak spread at " + i + " is " + peakSpread + " " + (peakSpread * 1.0 / total));
            }
            return(colorCount);
        }