Esempio n. 1
0
        public void RankPicture(string filename)
        {
            var    bitmap    = new ColorsBitmap <ColorRgb>(filename);
            double totalDist = 0;

            foreach (var circle in Query.Circles)
            {
                if (circle.X >= bitmap.Width || circle.Y >= bitmap.Height)
                {
                    // this happens, but why?? how could this error happen?
                    // are the data mixed up in some way?

                    return;
                }

                var targetPoint = circle.FindMeantPixel(bitmap);
                var targetColor = bitmap.GetPixel(targetPoint.X, targetPoint.Y);

                var distX = circle.X - targetPoint.X;
                var distY = circle.Y - targetPoint.Y;

                // TODO: make use of ALL methods in the delegate, not just the last one
                var lastRmDist = rmDistances(circle.Color, targetColor, distX, distY);
                totalDist += lastRmDist;
            }

            double avgDist = totalDist / Query.Circles.Length;

            ranks.TryAdd(Path.GetFileName(filename), avgDist);
        }
Esempio n. 2
0
            public void Draw <T>(Bitmap bitmapToDraw, ColorsBitmap <T> bitmapToSearchTarget, bool showRadius, bool showTarget, bool showOrderOfCircles) where T : Color3d, new()
            {
                var g = Graphics.FromImage(bitmapToDraw);

                foreach (Circle c in Circles)
                {
                    if (showTarget)
                    {
                        var target = c.FindMeantPixel(bitmapToSearchTarget);

                        var pen2 = new Pen(Color.LightSkyBlue, 3);
                        g.DrawLine(pen2, c.X, c.Y, target.X, target.Y);
                    }

                    var pen = new Pen((Color)c.Color.ConvertToRgb(), 5);
                    g.DrawEllipse(pen, c.X - 5, c.Y - 5, 10, 10);

                    if (showOrderOfCircles)
                    {
                        var brush = Brushes.Coral;
                        var font  = new Font(FontFamily.GenericSansSerif, 6, FontStyle.Bold);
                        g.DrawString(c.EntryOrder.ToString(), font, brush, c.X, c.Y);
                    }

                    if (showRadius)
                    {
                        var pen2 = new Pen(Color.GreenYellow, 1);
                        g.DrawEllipse(pen2, c.X - SearchDiameter / 2, c.Y - SearchDiameter / 2, SearchDiameter, SearchDiameter);
                    }
                }
            }
Esempio n. 3
0
        /// <param name="frame"></param>
        /// <param name="MaxAllowedDistance">Maximum distance of colors in one cluster. If 0, default value will be used.</param>
        public ColorClusterer(ColorsBitmap <T> image, int MaxAllowedDistance = 0)
        {
            this.image = image.GetRgbBitmap();

            if (MaxAllowedDistance > 0)
            {
                this.MaxAllowedDistance = MaxAllowedDistance;
            }
        }
        private void _annotatePicture <T>() where T : Color3d, new()
        {
            var bitmapForDrawing   = (Bitmap)MainPictureBox.Image;
            var bitmapForSearching = new ColorsBitmap <T>(new Bitmap(MainPictureBox.Image));

            var p = new Picture(Program.DbConn);

            p.Load(CurrentPicturePath, circleFilter);

            foreach (var ans in p.Answers)
            {
                ans.Draw(
                    bitmapToDraw: bitmapForDrawing,
                    bitmapToSearchTarget: bitmapForSearching,
                    showRadius: checkBoxShowRadius.Checked,
                    showTarget: checkBoxTarget.Checked,
                    showOrderOfCircles: checkBoxNumbers.Checked
                    );
            }
        }
Esempio n. 5
0
                public Point FindMeantPixel <T>(ColorsBitmap <T> bitmap) where T : Color3d, new()
                {
                    int beginX = Math.Max(0, X - SearchDiameter / 2);
                    int beginY = Math.Max(0, Y - SearchDiameter / 2);

                    Point  closestPoint         = new Point(X, Y);
                    double closestColorDistance = Color.Get4dDistanceL2(bitmap.GetAveragePixel(X, Y), 0);

                    for (int iX = 0; iX < SearchDiameter; iX++)
                    {
                        for (int iY = 0; iY < SearchDiameter; iY++)
                        {
                            int currentPointX = beginX + iX;
                            int currentPointY = beginY + iY;

                            if (currentPointX < 0 || currentPointY < 0 || currentPointX >= bitmap.Width || currentPointY >= bitmap.Height)
                            {
                                continue;
                            }

                            int distFromPoint = (int)Math.Sqrt((X - currentPointX) * (X - currentPointX) + (Y - currentPointY) * (Y - currentPointY));

                            if (distFromPoint <= SearchDiameter / 2)
                            {
                                var    pixel     = bitmap.GetAveragePixel(currentPointX, currentPointY);
                                double colorDist = Color.Get4dDistanceL2(pixel, distFromPoint);

                                if (colorDist > MinimumColorDist && colorDist < closestColorDistance)
                                {
                                    closestColorDistance = colorDist;
                                    closestPoint         = new Point(currentPointX, currentPointY);
                                }
                            }
                        }
                    }

                    return(closestPoint);
                }