コード例 #1
0
ファイル: CV.cs プロジェクト: twoentartian/TDPS2017
        public static CannyTextureAnalysisResult AutoCannyTextureAnalysis(Image <Gray, Byte> argImage, double[] threshold1, double[] threshold2, int factorBetweenMinAndMax = 3)
        {
            Image <Gray, Byte>         cannyImg = new Image <Gray, byte>(argImage.Size);
            CannyTextureAnalysisResult bestCannyTextureAnalysisResult = null;
            double bestCannyTextureAnalysisResultValue = 0;

            foreach (var singleThresholdValue1 in threshold1)
            {
                foreach (var singleThresholdValue2 in threshold2)
                {
                    cannyImg = argImage.Canny(singleThresholdValue1, singleThresholdValue2);
                    CannyTextureAnalysisResult tempCannyTextureAnalysisResult = new CannyTextureAnalysisResult(cannyImg, string.Format("Threshold1/2 = {0:D} {1:D}", (int)singleThresholdValue1, (int)singleThresholdValue2));
                    float sum = 0, min = tempCannyTextureAnalysisResult.Data[0], max = min;
                    foreach (var i in tempCannyTextureAnalysisResult.Data)
                    {
                        sum += i;
                        if (i > max)
                        {
                            max = i;
                        }
                        if (i < min)
                        {
                            min = i;
                        }
                    }
                    double ave = (double)sum / tempCannyTextureAnalysisResult.Data.Length;

                    if (max / ave > factorBetweenMinAndMax && factorBetweenMinAndMax != 0)
                    {
                        return(tempCannyTextureAnalysisResult);
                    }
                    if (max / ave > bestCannyTextureAnalysisResultValue)
                    {
                        bestCannyTextureAnalysisResultValue = max / ave;
                        bestCannyTextureAnalysisResult      = tempCannyTextureAnalysisResult;
                    }
                }
            }

            if (bestCannyTextureAnalysisResult == null)
            {
                throw new LogicErrorException();
            }
            return(bestCannyTextureAnalysisResult);
        }
コード例 #2
0
        public static void Debug1()
        {
            string debugPath = Environment.CurrentDirectory + Path.DirectorySeparatorChar + "DEBUG" + Path.DirectorySeparatorChar + "DEBUG3.jpg";
            //LbpTextureAnalysisResult textureResult = Cv.LbpTextureAnalysis(debugPath);
            Image <Rgb, Byte> rawImage = new Image <Rgb, byte>(debugPath);
            Image <Rgb, Byte> rawimage = rawImage.Resize(480, 240, Inter.Linear);

            double[] threshold1 = new double[]
            {
                200
            };
            double[] threshold2 = new double[]
            {
                200, 300, 400
            };
            CannyTextureAnalysisResult textureAnalysisResult = Cv.AutoCannyTextureAnalysis(rawimage, threshold1, threshold2, 0);
            ZedGraphForm tempZedGraphForm = new ZedGraphForm(textureAnalysisResult.Data);

            tempZedGraphForm.Show();
            MessageBox.Show(textureAnalysisResult.Info);
            //ShowImg(textureAnalysisResult.Img);
        }
コード例 #3
0
ファイル: FormMain.cs プロジェクト: twoentartian/TDPS2017
        private void buttonSample_Click(object sender, EventArgs e)
        {
            /*
             * Image tempImage = videoSourcePlayer.GetCurrentVideoFrame();
             * string tempPath = _tempFileManager.AddTempFile(tempImage);
             * TextureAnalysisResult textureResult = Cv.TextureAnalysis(tempPath);
             * FindCuttingPointResult cuttingPointResult = Cv.FindCuttingPoint(textureResult, Cv.FindCuttingPointMode.MaximumMethod);
             * Bitmap resultImage = textureResult.img.Resize(pictureBox.Width, pictureBox.Height, Inter.Linear, true).Bitmap;
             *
             * Bitmap newBitmap = new Bitmap(resultImage.Width, resultImage.Height);
             * Graphics g = Graphics.FromImage(newBitmap);
             * g.DrawImage(resultImage, 0, 0);
             * for (int i = 0; i < cuttingPointResult.Edges.Count; i++)
             * {
             *      float location = (float)cuttingPointResult.Edges[i] / cuttingPointResult.Accuracy * newBitmap.Width;
             *      g.DrawLine(new Pen(Color.Red, 4), location, 0 * newBitmap.Height, location, 1 * newBitmap.Height);
             * }
             * g.Dispose();
             *
             * pictureBox.Image = newBitmap;
             */
            string            tempPath = VideoSourceDevice.GetCurrentPicturePath();
            Image <Rgb, Byte> rawImage = new Image <Rgb, byte>(tempPath);

            double[] threshold1 = new double[]
            {
                200
            };
            double[] threshold2 = new double[]
            {
                200, 300, 400
            };
            CannyTextureAnalysisResult textureAnalysisResult = Cv.AutoCannyTextureAnalysis(rawImage, threshold1, threshold2, 0);
            ZedGraphForm tempZedGraphForm = new ZedGraphForm(textureAnalysisResult.Data);

            tempZedGraphForm.Show();
            MessageBox.Show(textureAnalysisResult.Info);
        }
コード例 #4
0
        private void buttonSample_Click(object sender, EventArgs e)
        {
            Image <Rgb, Byte> rawImage;
            string            tempPath = VideoSourceDevice.GetCurrentPicturePath();

            try
            {
                rawImage = new Image <Rgb, byte>(tempPath);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
                return;
            }

            double[] threshold1 = new double[]
            {
                200
            };
            double[] threshold2 = new double[]
            {
                200, 300, 400
            };
            CannyTextureAnalysisResult textureAnalysisResult = Cv.AutoCannyTextureAnalysis(rawImage, threshold1, threshold2, 0);
            float diff = textureAnalysisResult.Diff;

            /*
             * ZedGraphForm tempGraphForm = new ZedGraphForm(textureAnalysisResult.Data);
             * tempGraphForm.Show();
             */
            Debug.ShowImg(textureAnalysisResult.Img);

            textBoxConsole.AppendText("Center: " + textureAnalysisResult.Center + Environment.NewLine);

            // if center is close to 0.5, it means the car direction is nearly towards the path.
            float threadhold = 0.05f;

            if (Math.Abs(diff) > threadhold)
            {
                if (diff > threadhold)
                {
                    if (_previousDiff < -threadhold)
                    {
                        Arduino.GetInstance().Send(MotorDirection.Forward, 35, MotorDirection.Backward, 35, 200);
                    }
                    else
                    {
                        Arduino.GetInstance().Send(MotorDirection.Forward, 75, MotorDirection.Backward, 75, 200);
                    }
                }
                else if (diff < -threadhold)
                {
                    if (_previousDiff > threadhold)
                    {
                        Arduino.GetInstance().Send(MotorDirection.Backward, 35, MotorDirection.Forward, 35, 200);
                    }
                    else
                    {
                        Arduino.GetInstance().Send(MotorDirection.Backward, 75, MotorDirection.Forward, 75, 200);
                    }
                }
            }
            else
            {
                Arduino.GetInstance().Send(MotorDirection.Forward, 75, MotorDirection.Forward, 75, 200);
            }
            _previousDiff = diff;
        }
コード例 #5
0
        private static void G1T1Loop()
        {
            Image <Rgb, Byte> rawImage;
            string            tempPath = VideoSourceDevice.GetCurrentPicturePath();

            try
            {
                rawImage = new Image <Rgb, byte>(tempPath);
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
                return;
            }

            double[] threshold1 = new double[]
            {
                200
            };
            double[] threshold2 = new double[]
            {
                200, 300, 400
            };
            CannyTextureAnalysisResult textureAnalysisResult = Cv.AutoCannyTextureAnalysis(rawImage, threshold1, threshold2, 0);
            float center = textureAnalysisResult.Center;
            float diff   = textureAnalysisResult.Diff;

            // if center is close to 0.5, it means the car direction is nearly towards the path.
            float threadhold = 0.02f;

            if (Math.Abs(diff) > threadhold)
            {
                if (diff > threadhold)
                {
                    if (_previousDiff < -threadhold)
                    {
                        Arduino.GetInstance().Send(MotorDirection.Forward, 35, MotorDirection.Backward, 35, 200);
                    }
                    else
                    {
                        Arduino.GetInstance().Send(MotorDirection.Forward, 75, MotorDirection.Backward, 75, 200);
                    }
                }
                else if (diff < -threadhold)
                {
                    if (_previousDiff > threadhold)
                    {
                        Arduino.GetInstance().Send(MotorDirection.Backward, 35, MotorDirection.Forward, 35, 200);
                    }
                    else
                    {
                        Arduino.GetInstance().Send(MotorDirection.Backward, 75, MotorDirection.Forward, 75, 200);
                    }
                }
            }
            else
            {
                Arduino.GetInstance().Send(MotorDirection.Forward, 75, MotorDirection.Forward, 75, 200);
            }
            _previousDiff = diff;
        }