Example #1
0
        private void FaceDetect_Click(object sender, EventArgs e)
        {
            if (!sw.IsRunning)
            {
                sw.Reset();
                sw.Start();
            }
            Process.Image = Image.FromFile(filepath, true);
            if (bvis == false)
            {
                bvis = true;
            }
            else
            {
                bvis = false;
            }
            GridOn.GridPaint(bvis, (Bitmap)Process.Image);//绘制网格线
            label3.Text = "网络线划分";
            try {
                Bitmap gray_img  = Knowledge.ToGray(originalimg);    //将原图转化为灰度图
                Bitmap BW        = Knowledge.Thresholding(gray_img); //利用大津法进行二值化处理
                Bitmap detectimg = Knowledge.FaceDetection(BW);      //最后利用算法进行检测
                AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(detectimg);
                Rectangle[] rects       = blobCounter.GetObjectsRectangles();
                Rectangle[] outputrects = new Rectangle[rects.Count()];
                ////object count
                int            minx = 100; int tmp = 0;
                int            rectsCount = rects.Count();
                List <decimal> test       = new List <decimal>();
                for (int c = 0; c < rectsCount; c++)
                {
                    int     p  = rects[c].Width * rects[c].Height;
                    decimal bl = (decimal)rects[c].Height / (decimal)rects[c].Width;

                    int maxx = (gray_img.Width * gray_img.Height) / 2;
                    if (p > minx && (double)bl < 1.8 && (double)bl > 0.8 && p < maxx)
                    {
                        test.Add(bl);
                        outputrects[tmp++] = rects[c];
                    }
                }
                RectanglesMarker marker = new RectanglesMarker(outputrects, Color.Red);
                this.Detected.Image = marker.Apply((Bitmap)Image.FromFile(filepath, true));
                label4.Text         = "检测结果";
                ShowMsg("检测结束!");
            }
            catch (ArgumentException)
            {
                MessageBox.Show("Invalid usage!");
            }

            if (sw.IsRunning)
            {
                sw.Stop();

                string str = sw.Elapsed.ToString();
                timeElpse.Text = string.Empty;
                timeElpse.Text = "运行时间:" + str;
            }
        }
Example #2
0
        private Bitmap FacePicDetect(Bitmap bitmap)
        {
            lock (this)
            {
                //留存原始的照片,如果正在拍照,则保存此未添加人脸识别框的照片
                currentPicture = (Bitmap)bitmap.Clone();

                if (detector == null)
                {
                    //先实例化用于检测人脸的对象detector
                    detector = new HaarObjectDetector(new FaceHaarCascade(), 100)
                    {
                        SearchMode            = ObjectDetectorSearchMode.Single,            //搜索模式
                        ScalingMode           = ObjectDetectorScalingMode.GreaterToSmaller, //缩放模式
                        ScalingFactor         = 1.5f,                                       //在搜索期间重新缩放搜索窗口时要使用的重新缩放因子
                        UseParallelProcessing = true
                    };                                                                      //面部级联对象 + 搜索对象时使用的最小窗口大小
                }

                // 开始对检测区域进行检测并返回结果数组
                Rectangle[] regions = detector.ProcessFrame(bitmap);
                if (regions != null && regions.Length > 0)
                {
                    //人脸标记
                    RectanglesMarker marker = new RectanglesMarker(regions, Color.Orange);
                    regions = null;
                    return(marker.Apply(bitmap));
                }
                regions = null;
                return(bitmap);
            }
        }
Example #3
0
        private void button1_Click(object sender, EventArgs e)
        {
            detector.SearchMode            = (ObjectDetectorSearchMode)cbMode.SelectedValue;
            detector.ScalingMode           = (ObjectDetectorScalingMode)cbScaling.SelectedValue;
            detector.ScalingFactor         = 1.5f;
            detector.MinSize               = new Size(32, 32);
            detector.UseParallelProcessing = cbParallel.Checked;

            Stopwatch sw = Stopwatch.StartNew();

            // prepare grayscale image
            picture = Accord.Imaging.Image.Clone(new Bitmap(pictureBox1.Image), System.Drawing.Imaging.PixelFormat.Format24bppRgb);

            // Process frame to detect objects
            Rectangle[] objects = detector.ProcessFrame(picture);

            sw.Stop();


            if (objects.Length > 0)
            {
                RectanglesMarker marker = new RectanglesMarker(objects, Color.Red);
                pictureBox1.Image = marker.Apply(picture);
            }

            toolStripStatusLabel1.Text = string.Format("Completed detection of {0} objects in {1}.",
                                                       objects.Length, sw.Elapsed);
        }
        /*
         * private async void MainPage_OnLoaded()
         * {
         *  var assembly = Assembly_.GetExecutingAssembly();
         *  using (var stream = assembly.GetManifestResourceStream("FaceDetection.Images.judybats.jpg"))
         *  {
         *      this.ImageView.Source = this.GetImageSourceFromStream(stream);
         *
         *      stream.Seek(0, SeekOrigin.Begin);
         *      this.bitmap = ((Bitmap)Image.FromStream(stream)).Clone(PixelFormat.Format32bppArgb);
         *  }
         * }
         *
         * private void DetectButton_OnClick(object sender, EventArgs e)
         * {
         *  var threshold = 10;// (float)Math.Pow(10.0, this.LogThresholdSlider.Value);
         *  var octaves = 10;// (int)this.OctaveSlider.Value;
         *  var initial = 10;// (int)this.InitialSlider.Value;
         *
         *  // Create a new SURF Features Detector using the given parameters
         *  var surf = new SpeededUpRobustFeaturesDetector(threshold, octaves, initial);
         *
         *  var points = surf.ProcessImage(this.bitmap);
         *
         *  // Create a new AForge's Corner Marker Filter
         *  var features = new FeaturesMarker(points);
         *
         *  // Apply the filter and display it on a picturebox
         *  this.LenaImage.Source = (BitmapSource)features.Apply(bitmap);
         * }
         */

        #endregion

        #region EVENT HANDLERS

        private void OnDetectButtonClicked(object sender, EventArgs args)
        {
            int searchModeIndex, scalingModeIndex;
            ObjectDetectorSearchMode  searchMode;
            ObjectDetectorScalingMode scalingMode;

            if ((searchModeIndex = this.SearchModePicker.SelectedIndex) < 0 ||
                (scalingModeIndex = this.ScalingModePicker.SelectedIndex) < 0 ||
                !Enum.TryParse(this.SearchModePicker.Items[searchModeIndex], out searchMode) ||
                !Enum.TryParse(this.ScalingModePicker.Items[scalingModeIndex], out scalingMode))
            {
                return;
            }

            this.detector.SearchMode            = searchMode;
            this.detector.ScalingMode           = scalingMode;
            this.detector.ScalingFactor         = 1.5f;
            this.detector.UseParallelProcessing = false;

            // Process frame to detect objects
            var objects = this.detector.ProcessFrame(this.bitmap);

            if (objects.Length > 0)
            {
                var marker = new RectanglesMarker(objects, Color.FromArgb(0xff, 0xff, 0x00, 0xff));

                using (var stream = new MemoryStream())
                {
                    marker.Apply(this.bitmap).Save(stream, ImageFormat.Jpeg);
                    this.ImageView.Source = this.GetImageSourceFromStream(stream);
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            detector.SearchMode            = (ObjectDetectorSearchMode)cbMode.SelectedValue;
            detector.ScalingMode           = (ObjectDetectorScalingMode)cbScaling.SelectedValue;
            detector.ScalingFactor         = 1.5f;
            detector.UseParallelProcessing = cbParallel.Checked;
            detector.Suppression           = 2;

            Stopwatch sw = Stopwatch.StartNew();


            // Process frame to detect objects
            Rectangle[] objects = detector.ProcessFrame(picture);


            sw.Stop();


            if (objects.Length > 0)
            {
                RectanglesMarker marker = new RectanglesMarker(objects, Color.Fuchsia);
                pictureBox1.Image = marker.Apply(picture);
            }

            toolStripStatusLabel1.Text = string.Format("Completed detection of {0} objects in {1}.",
                                                       objects.Length, sw.Elapsed);
        }
Example #6
0
        private void btnTrainFace_Click(object sender, EventArgs e)
        {
            try
            {
                detector                       = new HaarObjectDetector(cascade, 30);
                detector.SearchMode            = ObjectDetectorSearchMode.Single;//.NoOverlap;//.Default; //.Average;
                detector.ScalingFactor         = 1.5f;
                detector.ScalingMode           = ObjectDetectorScalingMode.GreaterToSmaller;
                detector.UseParallelProcessing = true;
                detector.Suppression           = 3;

                Bitmap            picture = new Bitmap(pictureBox1.Image);
                Image <Bgr, byte> Frame   = new Image <Bgr, byte>(picture);

                Stopwatch   sw          = Stopwatch.StartNew();
                Rectangle[] faceObjects = detector.ProcessFrame(picture);
                sw.Stop();

                if (faceObjects.Length > 0)
                {
                    RectanglesMarker marker = new RectanglesMarker(faceObjects, Color.Fuchsia);
                    pictureBox1.Image = marker.Apply(picture);

                    //Graphics g = Graphics.FromImage(pictureBox1.Image);
                    foreach (var face in faceObjects)
                    {
                        //g.DrawRectangle(Pens.DeepSkyBlue, face);
                        Frame.Draw(face, new Bgr(Color.Red), 3);
                        Bitmap   c   = Frame.ToBitmap();
                        Bitmap   bmp = new Bitmap(face.Width, face.Height);
                        Graphics gg  = Graphics.FromImage(bmp);
                        gg.DrawImage(c, 0, 0, face, GraphicsUnit.Pixel);
                        pictureBox2.Image = bmp;
                        //bmp.Save("myface(accord) " + DateTime.Now.Second.ToString());
                        gg.Dispose();
                    }
                    //g.Dispose();
                    //label1.Text = "Completed operation!! " + faceObjects.Length.ToString() + " Face detected";
                    MessageBox.Show("Train Face operation successful!!! " + faceObjects.Length.ToString() + " Face detected", "Train face", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    txtFaceId.Text       = genFaceId();
                    txtUsername.Text     = "User" + txtFaceId.Text;
                    btnUpload.Enabled    = false;
                    btnTrainFace.Enabled = false;
                    btnSave.Enabled      = true;
                }
                else
                {
                    MessageBox.Show("Image cannot be trained!!! No face detected in the current image", "Fail to Train face", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message, "Face Detection and Recognition Failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Example #7
0
        private Bitmap FaceFind(Bitmap bmpBitmap)
        {
            HaarObjectDetector faceDetector = new HaarObjectDetector(new FaceHaarCascade(), minSize: 300, searchMode: ObjectDetectorSearchMode.Single);
            RectanglesMarker   faceMarker   = new RectanglesMarker(Color.Red)
            {
                Rectangles = faceDetector.ProcessFrame(bmpBitmap)
            };

            faceMarker.ApplyInPlace(bmpBitmap);
            return(bmpBitmap);
        }
Example #8
0
 private void mixedToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (tracker != null)
     {
         tracking     = false;
         tracker.Mode = CamshiftMode.Mixed;
         tracker.Reset();
         marker = null;
     }
     rGBToolStripMenuItem.Checked   = false;
     hSLToolStripMenuItem.Checked   = false;
     mixedToolStripMenuItem.Checked = true;
 }
Example #9
0
        private Bitmap Detecting(Bitmap _bitmap)
        {
            UnmanagedImage im = UnmanagedImage.FromManagedImage(_bitmap);

            float xscale = im.Width / 160f;
            float yscale = im.Height / 120f;

            ResizeNearestNeighbor resize     = new ResizeNearestNeighbor(160, 120);
            UnmanagedImage        downsample = resize.Apply(im);


            Rectangle[] regions = detector.ProcessFrame(downsample);


            if (regions.Length > 0)
            {
                tracker.Reset();

                // Reduce the face size to avoid tracking background
                Rectangle window = new Rectangle(
                    (int)((regions[0].X + regions[0].Width / 2f) * xscale),
                    (int)((regions[0].Y + regions[0].Height / 2f) * yscale),
                    1, 1);

                window.Inflate(
                    (int)(0.2f * regions[0].Width * xscale),
                    (int)(0.4f * regions[0].Height * yscale));

                this.FaceTracked = window;

                // Initialize tracker
                tracker.SearchWindow = window;
                tracker.ProcessFrame(im);

                marker = new RectanglesMarker(window);
                marker.ApplyInPlace(im);

                // (Bitmap) Helpers.BitmapHelper.ByteArrayToImage(Helpers.RijndaelHelper.EncryptBytes(Helpers.BitmapHelper.ImageToByte(im.ToManagedImage()), "fzafa", "afzd"))

                this.isTracking = true;

                return(im.ToManagedImage());
            }
            else
            {
                this.isDetecting = false;
                return(_bitmap);
            }
        }
Example #10
0
        private void timer1_Tick(object sender, EventArgs e)
        {
            Mat frame = new Mat();

            frame = cap.QueryFrame();
            Image <Bgr, byte>  frameImage     = frame.ToImage <Bgr, byte>();
            Image <Gray, byte> grayFrameImage = frameImage.Convert <Gray, byte>();

            if (frame != null)
            {
                Rectangle[]      faces  = detector.ProcessFrame(grayFrameImage.ToBitmap());
                RectanglesMarker marker = new RectanglesMarker(faces, Color.Fuchsia);
                imageViewer.Image = new Image <Bgr, byte>(marker.Apply(frame.Bitmap));
            }
        }
Example #11
0
        public Bitmap Detect()
        {
            _detector.ScalingFactor         = 1.5f;
            _detector.UseParallelProcessing = true;

            Rectangle[] objects = _detector.ProcessFrame(image);


            if (objects.Length > 0)
            {
                RectanglesMarker marker = new RectanglesMarker(objects, Color.Yellow);
                image = marker.Apply(image);
            }

            return(image);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                detector                       = new HaarObjectDetector(cascade, 30);
                detector.SearchMode            = ObjectDetectorSearchMode.Single;            //.Default;//.NoOverlap;//
                detector.ScalingFactor         = 2.5f;
                detector.ScalingMode           = ObjectDetectorScalingMode.SmallerToGreater; //.GreaterToSmaller;
                detector.UseParallelProcessing = true;
                detector.Suppression           = 3;

                Bitmap            picture = new Bitmap(pictureBox2.Image);
                Image <Bgr, byte> Frame   = new Image <Bgr, byte>(picture);

                Stopwatch sw = Stopwatch.StartNew();

                Rectangle[] faceObjects = detector.ProcessFrame(picture);

                sw.Stop();

                if (faceObjects.Length > 0)
                {
                    RectanglesMarker marker = new RectanglesMarker(faceObjects, Color.Fuchsia);
                    pictureBox2.Image = marker.Apply(picture);
                }
                label1.Text = "Operation Completed!!! " + faceObjects.Length.ToString() + " Face detected";

                Graphics g = Graphics.FromImage(pictureBox2.Image);
                foreach (var face in faceObjects)
                {
                    g.DrawRectangle(Pens.DeepSkyBlue, face);
                    Frame.Draw(face, new Bgr(Color.Red), 3);
                    Bitmap   c   = Frame.ToBitmap();
                    Bitmap   bmp = new Bitmap(face.Width, face.Height);
                    Graphics gg  = Graphics.FromImage(bmp);
                    gg.DrawImage(c, 0, 0, face, GraphicsUnit.Pixel);
                    //pictureBox2.Image = bmp;
                    bmp.Save("myface(accord) " + DateTime.Now.Second.ToString());
                    MessageBox.Show("Face Detected!!!, Face Save as:" + "myface(accord) " + DateTime.Now.Second.ToString(), "Face Detection Successfully", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                //g.Dispose()
            }
            catch (Exception er)
            {
                MessageBox.Show(er.Message, "Face Detection Failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void skindetect_Click(object sender, EventArgs e)
        {
            sw.Reset();
            sw.Start();
            Bitmap img           = (Bitmap)Image.FromFile(filepath, true); //将原图进行导入并进行格式转化
            Bitmap normalizedImg = YCbCr.Lightingconpensate(img);
            Bitmap skin          = YCbCr.SkinDetect1(normalizedImg);       //肤色检测
            Bitmap BWskin        = Knowledge.Thresholding(skin);           //图片二值化
            Bitmap gray_img      = Knowledge.ToGray(img);

            AForge.Imaging.SusanCornersDetector scd = new AForge.Imaging.SusanCornersDetector(); //susan检测子
                                                                                                 //检测人眼部分

            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(BWskin);     //对图片进行检测联通区域
            Rectangle[] rects       = blobCounter.GetObjectsRectangles();
            Rectangle[] outputrects = new Rectangle[rects.Count()];
            ////object count
            int            minx = 150; int tmp = 0;
            int            rectsCount = rects.Count();
            List <decimal> test       = new List <decimal>();

            for (int c = 0; c < rectsCount; c++)
            {
                int     p  = rects[c].Width * rects[c].Height;
                decimal bl = (decimal)rects[c].Height / (decimal)rects[c].Width;

                int maxx = (img.Width * img.Height) / 2;
                if (p > minx && (double)bl < 1.8 && (double)bl > 0.9 && p < maxx)
                {
                    test.Add(bl);
                    outputrects[tmp++] = rects[c];
                }
            }
            RectanglesMarker marker = new RectanglesMarker(outputrects, Color.Red);

            Process2.Image = img;
            Detected.Image = marker.Apply((Bitmap)Image.FromFile(filepath, true));
            sw.Stop();
            string str = sw.Elapsed.ToString();

            timeElpsed.Text = string.Empty;
            timeElpsed.Text = "运行时间:" + str;
        }
Example #14
0
        private Bitmap Tracking(Bitmap _bitmap)
        {
            UnmanagedImage im = UnmanagedImage.FromManagedImage(_bitmap);

            // Track the object
            tracker.ProcessFrame(im);

            // Get the object position
            var obj = tracker.TrackingObject;

            this.FaceTracked = obj.Rectangle;

            marker = new RectanglesMarker(obj.Rectangle);

            if (marker != null)
            {
                marker.ApplyInPlace(im);
            }

            return(im.ToManagedImage());
        }
Example #15
0
        public static string DetectFace(string path)
        {
            GetPicture(path);
            // Process frame to detect objects
            HaarCascade        cascade  = new FaceHaarCascade();
            HaarObjectDetector detector = new HaarObjectDetector(cascade, 30);

            detector.SearchMode    = (ObjectDetectorSearchMode)cbMode;
            detector.ScalingMode   = (ObjectDetectorScalingMode)cbScaling;
            detector.ScalingFactor = 1.5f;

            Stopwatch sw = Stopwatch.StartNew();

            Rectangle[] objects = detector.ProcessFrame(picture);

            sw.Stop();

            if (objects.Length > 0)
            {
                Console.WriteLine("here");
                RectanglesMarker marker = new RectanglesMarker(objects, Color.Fuchsia);
                picture = marker.Apply(picture);
            }
            if (picture != null)
            {
                Console.WriteLine("trying to print picture");

                /*ImageCodecInfo myici = ImageCodecInfo.GetImageEncoders();
                 * int numCodecs = myici.GetLength(0);
                 * Encoder myEncoder = Encoder.Quality;
                 * EncoderParameters param = new EncoderParameters(1);
                 * EncoderParameter param1 = new EncoderParameter(myEncoder, 25L);
                 *
                 * picture.Save(@"output.jpg", myici, param);
                 */

                picture.Save("file.png", ImageFormat.Png);;
            }
            return(path);
        }
Example #16
0
        public static void Main(string[] args)
        {
            var picture = Resource.lena_color;

            HaarCascade cascade  = new FaceHaarCascade();
            var         detector = new HaarObjectDetector(cascade, 30);

            //detector.SearchMode = ObjectDetectorSearchMode.Average;
            //detector.ScalingMode = ObjectDetectorScalingMode.GreaterToSmaller;
            //detector.ScalingFactor = 1.5f;
            //detector.UseParallelProcessing = false;
            //detector.Suppression = 2;

            Rectangle[] objects = detector.ProcessFrame(picture);

            if (objects.Length > 0)
            {
                RectanglesMarker marker = new RectanglesMarker(objects, Color.Fuchsia);
                var markedup            = marker.Apply(picture);
                markedup.Save($"{basedir}{sep}{sep}markedup.jpg");
            }
        }
        private void mytimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            pic1 = this.videoSourcePlayer1.GetCurrentVideoFrame();

            try
            {
                Rectangle[] objects = detector.ProcessFrame(pic1);
                if (objects.Length > 0)
                {
                    RectanglesMarker marker = new RectanglesMarker(objects, Color.Black);
                    pic2 = marker.Apply(pic1);
                    this.detectedFaceimg.Image = pic2;
                }
                else
                {
                    this.detectedFaceimg.Image = pic1;
                }
            }
            catch
            {
                this.detectedFaceimg.Image = pic1;
            }
        }
Example #18
0
        /// <summary>
        /// This method helps to face detection
        /// </summary>
        /// <param name="image">Original image</param>
        /// <returns>Face detection result</returns>
        public static FaceDetectionResult FaceDetection(Bitmap image)
        {
            // Creating an face detection instance
            var result  = new FaceDetectionResult();
            var cascade = new Accord.Vision.Detection.Cascades.FaceHaarCascade();
            // set min size in the picture to detect faces
            var detector = new HaarObjectDetector(cascade, minSize: 100, searchMode: ObjectDetectorSearchMode.NoOverlap);
            var bmp      = Accord.Imaging.Image.Clone(image);
            // execute detection
            var faces = detector.ProcessFrame(bmp);
            // set rectangle color
            var objectMarker = new RectanglesMarker(Color.Red)
            {
                Rectangles = faces
            };
            // apply filter and get a new image
            var resultImage = objectMarker.Apply(image); // overwrite the frame

            result.ImageResult = resultImage;
            // set result parameters
            result.TotalFacesDetected = faces?.Length ?? 0;
            result.Rectangles         = faces;
            return(result);
        }
Example #19
0
        public void DetectFaces()
        {
            detector.SearchMode            = (ObjectDetectorSearchMode)ObjectDetectorSearchMode.NoOverlap;
            detector.ScalingMode           = (ObjectDetectorScalingMode)ObjectDetectorScalingMode.SmallerToGreater;
            detector.ScalingFactor         = 1.5f;
            detector.UseParallelProcessing = true; //cbParallel.Checked;
            detector.Suppression           = 2;

            //Stopwatch sw = Stopwatch.StartNew();

            // Process frame to detect objects
            Rectangle[] objects = detector.ProcessFrame(picture);

            //sw.Stop();

            if (objects.Length > 0)
            {
                RectanglesMarker marker = new RectanglesMarker(objects, Color.Red);
                image.Image = marker.Apply(picture);
            }

            //toolStripStatusLabel1.Text = string.Format("Completed detection of {0} objects in {1}.",
            //    objects.Length, sw.Elapsed);
        }
Example #20
0
        // New frame received by the player
        private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
        {
            if (!detecting && !tracking)
            {
                return;
            }

            lock (this)
            {
                if (detecting)
                {
                    detecting = false;
                    tracking  = false;

                    UnmanagedImage im = UnmanagedImage.FromManagedImage(image);

                    float xscale = image.Width / 160f;
                    float yscale = image.Height / 120f;

                    ResizeNearestNeighbor resize     = new ResizeNearestNeighbor(160, 120);
                    UnmanagedImage        downsample = resize.Apply(im);

                    Rectangle[] regions = detector.ProcessFrame(downsample);

                    if (regions.Length > 0)
                    {
                        tracker.Reset();

                        // Will track the first face found
                        Rectangle face = regions[0];

                        // Reduce the face size to avoid tracking background
                        Rectangle window = new Rectangle(
                            (int)((regions[0].X + regions[0].Width / 2f) * xscale),
                            (int)((regions[0].Y + regions[0].Height / 2f) * yscale),
                            1, 1);

                        window.Inflate(
                            (int)(0.2f * regions[0].Width * xscale),
                            (int)(0.4f * regions[0].Height * yscale));

                        // Initialize tracker
                        tracker.SearchWindow = window;
                        tracker.ProcessFrame(im);

                        marker = new RectanglesMarker(window);
                        marker.ApplyInPlace(im);

                        image = im.ToManagedImage();

                        tracking = true;
                        //detecting = true;
                    }
                    else
                    {
                        detecting = true;
                    }
                }
                else if (tracking)
                {
                    UnmanagedImage im = UnmanagedImage.FromManagedImage(image);

                    // Track the object
                    tracker.ProcessFrame(im);

                    // Get the object position
                    var obj = tracker.TrackingObject;
                    var wnd = tracker.SearchWindow;

                    if (displayBackprojectionToolStripMenuItem.Checked)
                    {
                        var backprojection = tracker.GetBackprojection(PixelFormat.Format24bppRgb);
                        im = UnmanagedImage.FromManagedImage(backprojection);
                    }

                    if (drawObjectAxisToolStripMenuItem.Checked)
                    {
                        LineSegment axis = obj.GetAxis();

                        // Draw X axis
                        Drawing.Line(im, axis.Start.Round(), axis.End.Round(), Color.Red);
                    }


                    if (drawObjectBoxToolStripMenuItem.Checked && drawTrackingWindowToolStripMenuItem.Checked)
                    {
                        marker = new RectanglesMarker(new Rectangle[] { wnd, obj.Rectangle });
                    }
                    else if (drawObjectBoxToolStripMenuItem.Checked)
                    {
                        //InteractionPoints p = new InteractionPoints();
                        //p.setHead(obj.Rectangle);

                        marker = new RectanglesMarker(obj.Rectangle);
                    }
                    else if (drawTrackingWindowToolStripMenuItem.Checked)
                    {
                        marker = new RectanglesMarker(wnd);
                    }
                    else
                    {
                        marker = null;
                    }


                    if (marker != null)
                    {
                        marker.ApplyInPlace(im);
                    }
                    image = im.ToManagedImage();
                }
                else
                {
                    if (marker != null)
                    {
                        image = marker.Apply(image);
                    }
                }
            }
        }
Example #21
0
        // New frame received by the player
        private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
        {
            lock (this)
            {
                if (tracker == null)
                {
                    return;
                }

                if (form != null && !form.IsDisposed)
                {
                    form.Image = image;
                }

                BitmapData data = image.LockBits(new Rectangle(0, 0, image.Width, image.Height),
                                                 ImageLockMode.ReadWrite, image.PixelFormat);

                UnmanagedImage img = new UnmanagedImage(data);

                tracker.ComputeOrientation = showAngle;

                tracker.ProcessFrame(img);

                Rectangle rect = tracker.TrackingObject.Rectangle;

                UnmanagedImage hand = tracker.TrackingObject.Image;


                if (hand != null && (showContour || showFingertips))
                {
                    UnmanagedImage grayhand = Grayscale.CommonAlgorithms.BT709.Apply(hand);

                    blur.ApplyInPlace(grayhand);

                    List <IntPoint> contour = bf.FindContour(grayhand);

                    for (int i = 0; i < contour.Count; i++)
                    {
                        contour[i] += new IntPoint(rect.X, rect.Y);
                    }

                    List <IntPoint> peaks = kcurv.FindPeaks(contour);

                    if (showContour)
                    {
                        cmarker.Points = contour;
                        cmarker.ApplyInPlace(img);
                    }

                    if (showFingertips)
                    {
                        pmarker.Points = peaks;
                        pmarker.ApplyInPlace(img);
                    }
                }

                if (showRectangle)
                {
                    RectanglesMarker marker = new RectanglesMarker(rect);
                    marker.ApplyInPlace(img);
                }

                if (showAngle)
                {
                    LineSegment axis = tracker.TrackingObject.GetAxis(AxisOrientation.Vertical);

                    if (axis != null)
                    {
                        // Draw X axis
                        Drawing.Line(img, axis.Start.Round(), axis.End.Round(), Color.Red);
                    }
                }

                image.UnlockBits(data);
            }
        }
        // New frame received by the player
        private void videoSourcePlayer_NewFrame(object sender, NewFrameEventArgs args)
        {
            var direccion      = "Centro";
            int direccionServo = 2;

            if (!detecting && !tracking)
            {
                return;
            }

            lock (this)
            {
                if (detecting)
                {
                    detecting = false;
                    tracking  = false;

                    UnmanagedImage im = UnmanagedImage.FromManagedImage(args.Frame);

                    float xscale = im.Width / 160f;
                    float yscale = im.Height / 120f;

                    ResizeNearestNeighbor resize     = new ResizeNearestNeighbor(160, 120);
                    UnmanagedImage        downsample = resize.Apply(im);

                    Rectangle[] regions = detector.ProcessFrame(downsample);

                    if (regions.Length > 0)
                    {
                        tracker.Reset();

                        // Will track the first face found
                        Rectangle face = regions[0];

                        // Reduce the face size to avoid tracking background
                        Rectangle window = new Rectangle(
                            (int)((regions[0].X + regions[0].Width / 2f) * xscale),
                            (int)((regions[0].Y + regions[0].Height / 2f) * yscale),
                            1, 1);
                        Console.Write("x:" + (int)((regions[0].X + regions[0].Width / 2f) * xscale));
                        Console.Write("y:" + (int)((regions[0].X + regions[0].Height / 2f) * xscale));
                        window.Inflate(
                            (int)(0.2f * regions[0].Width * xscale),
                            (int)(0.4f * regions[0].Height * yscale));

                        // Initialize tracker
                        tracker.SearchWindow = window;
                        tracker.ProcessFrame(im);

                        marker = new RectanglesMarker(window);
                        marker.ApplyInPlace(im);

                        args.Frame = im.ToManagedImage();

                        tracking = true;
                        //detecting = true;
                    }
                    else
                    {
                        detecting = true;
                    }
                }
                else if (tracking)
                {
                    UnmanagedImage im = UnmanagedImage.FromManagedImage(args.Frame);

                    // Track the object
                    tracker.ProcessFrame(im);

                    // Get the object position
                    var obj = tracker.TrackingObject;
                    var wnd = tracker.SearchWindow;

                    //if (displayBackprojectionToolStripMenuItem.Checked)
                    //{
                    //    var backprojection = tracker.GetBackprojection(PixelFormat.Format24bppRgb);
                    //    im = UnmanagedImage.FromManagedImage(backprojection);
                    //}

                    //if (drawObjectAxisToolStripMenuItem.Checked)
                    //{
                    //    LineSegment axis = obj.GetAxis();

                    //    // Draw X axis
                    //    if (axis != null)
                    //        Drawing.Line(im, axis.Start.Round(), axis.End.Round(), Color.Red);
                    //    else detecting = true;
                    //}
                    if (obj.Rectangle.Width < (args.Frame.Width / 3) * 2)
                    {
                        if (obj.Rectangle.X < args.Frame.Width / 3)
                        {
                            direccion      = "Izquierda";
                            direccionServo = 1;
                        }
                        else if (obj.Rectangle.X > (args.Frame.Width / 3) * 2)
                        {
                            direccion      = "Derecha";
                            direccionServo = 3;
                        }
                    }
                    try
                    {
                        this.Invoke((MethodInvoker) delegate
                        {
                            if (textBox1 != null)
                            {
                                textBox1.Text = obj.Rectangle.X.ToString();
                                textBox2.Text = obj.Rectangle.Y.ToString();
                                label1.Text   = direccion;
                            }
                        });
                        ComunicacionPuertoSerie.Instance.enviarEvento(direccionServo.ToString());
                    }
                    catch (Exception e) { }
                    if (/*drawObjectBoxToolStripMenuItem.Checked && drawTrackingWindowToolStripMenuItem.Checked*/ false)
                    {
                        marker = new RectanglesMarker(new Rectangle[] { wnd, obj.Rectangle });
                    }
                    else if (/*drawObjectBoxToolStripMenuItem.Checked*/ true)
                    {
                        marker = new RectanglesMarker(obj.Rectangle);
                    }
                    else if (/*drawTrackingWindowToolStripMenuItem.Checked*/ true)
                    {
                        marker = new RectanglesMarker(wnd);
                    }
                    else
                    {
                        marker = null;
                    }


                    if (marker != null)
                    {
                        marker.ApplyInPlace(im);
                    }
                    args.Frame = im.ToManagedImage();
                }
                else
                {
                    if (marker != null)
                    {
                        args.Frame = marker.Apply(args.Frame);
                    }
                }
            }
        }
Example #23
0
        public void ProcessFrame()
        {
            string basePath = Path.Combine(NUnit.Framework.TestContext.CurrentContext.TestDirectory, "matching-tracker");

            #region doc_track
            // Let's test the tracker using a sample video from
            // the collection of test videos in the framework:
            TestVideos ds       = new TestVideos(basePath);
            string     fileName = ds["walking.mp4"];

            // Now, let's open the video using FFMPEG:
            var video = new VideoFileReader();
            video.Open(fileName);

            // And then check the contents of one of the frames:
            Bitmap frame = video.ReadVideoFrame(frameIndex: 150);
            frame.Save(Path.Combine(basePath, "walking_frame.png"));

            // Let's register a template for the bike rider in gray shirt
            Rectangle roi = new Rectangle(x: 70, y: 105, width: 28, height: 54);

            // initialization
            var tracker = new MatchingTracker()
            {
                SearchWindow          = roi,
                Threshold             = 0.0, // never reset the tracker in case it gets lost
                RegistrationThreshold = 0.95 // re-register the template if we are 95%
                                             // confident that the tracked object is indeed the object we want to follow
            };

            // Creating bitmaps and locking them is an expensive
            // operation. Instead, let's allocate once and reuse
            BitmapData     bitmapData     = frame.LockBits(ImageLockMode.ReadWrite);
            UnmanagedImage unmanagedImage = new UnmanagedImage(bitmapData);

            // We will create two color markers: one to show the location of the
            // tracked object (red) and another one to show the regions of the image
            // that the tracker is looking at (white).
            RectanglesMarker objectMarker = new RectanglesMarker(Color.Red);
            RectanglesMarker windowMarker = new RectanglesMarker(Color.White);

            // Now, for each frame of the video
            for (int frameIndex = 0; frameIndex < video.FrameCount; frameIndex++)
            {
                // Read the current frame into the bitmap data
                video.ReadVideoFrame(frameIndex, bitmapData);

                if (frameIndex > 150) // wait until the bike rider enters the scene
                {
                    // Feed the frame to the tracker
                    tracker.ProcessFrame(unmanagedImage);

                    // Mark the location of the tracker object in red color
                    objectMarker.SingleRectangle = tracker.TrackingObject.Rectangle;
                    objectMarker.ApplyInPlace(unmanagedImage); // overwrite the frame

                    windowMarker.SingleRectangle = tracker.SearchWindow;
                    windowMarker.ApplyInPlace(unmanagedImage); // overwrite the frame
                }

                // Save it to disk
                frame.Save(Path.Combine(basePath, "frame_{0}.png".Format(frameIndex)));
            }

            frame.UnlockBits(bitmapData);
            #endregion
        }
Example #24
0
        private void videoSourcePlayer1_NewFrame(object sender, ref Bitmap image)
        {
            Invert inv = new Invert();

            inv.ApplyInPlace(image);

            UnmanagedImage ui = UnmanagedImage.FromManagedImage(image);

            pictureBox1.Image = image;


            if (controller.Tracker.TrackingObject == null)
            {
                return;
            }

            if (controller.Tracker.TrackingObject.IsEmpty)
            {
                return;
            }

            var  rect = controller.Tracker.TrackingObject.Rectangle;
            Crop crop = new Crop(rect);

            UnmanagedImage head = crop.Apply(ui);

            var points = new List <IntPoint>()
            {
                new IntPoint(head.Width / 2, head.Height / 2)
            };
            var pps = head.Collect16bppPixelValues(points);

            double mean = Accord.Statistics.Tools.Mean(pps);

            double    cutoff = mean + 15;
            Threshold t      = new Threshold((int)cutoff);
            var       mask   = t.Apply(ui);



            LevelsLinear16bpp levels = new LevelsLinear16bpp();

            levels.InGray  = new IntRange((int)cutoff, 65535);
            levels.OutGray = new IntRange(0, 65535);
            levels.ApplyInPlace(ui);


            var mask8bit = AForge.Imaging.Image.Convert16bppTo8bpp(mask.ToManagedImage());



            BlobCounter bc = new BlobCounter();

            bc.ObjectsOrder = ObjectsOrder.Area;
            bc.ProcessImage(mask8bit);
            var blobs = bc.GetObjectsInformation();

            inv.ApplyInPlace(image);
            Intersect intersect = new Intersect();

            intersect.UnmanagedOverlayImage = mask;
            mask = intersect.Apply(ui);

            List <Rectangle> rects = new List <Rectangle>();

            // Extract the uppermost largest blobs.
            for (int i = 0; i < blobs.Length; i++)
            {
                double dx = (blobs[i].Rectangle.Top - controller.Tracker.TrackingObject.Center.Y);
                double d  = (dx * dx) / controller.Tracker.TrackingObject.Area;
                if (d < 2 && blobs[i].Area > 1000)
                {
                    rects.Add(blobs[i].Rectangle);
                }
            }

            rects.Sort(compare);

            if (rects.Count > 0)
            {
                captureHand(mask, rects[0], pbLeftArm, pbLeftHand);
            }
            if (rects.Count > 1)
            {
                captureHand(mask, rects[1], pbRightArm, pbRightHand);
            }

            RectanglesMarker marker = new RectanglesMarker(rects);

            marker.MarkerColor = Color.White;
            marker.ApplyInPlace(mask8bit);

            image = mask.ToManagedImage();
        }
Example #25
0
        public void ProcessVideo()
        {
            string basePath = Path.Combine(NUnit.Framework.TestContext.CurrentContext.TestDirectory, "detector");

            #region doc_video
            // Let's test the detector using a sample video from
            // the collection of test videos in the framework:
            TestVideos ds       = new TestVideos(basePath);
            string     fileName = ds["crowd.mp4"];

            // In this example, we will be creating a cascade for a Face detector:
            var cascade = new Accord.Vision.Detection.Cascades.FaceHaarCascade();

            // Now, create a new Haar object detector with the cascade:
            var detector = new HaarObjectDetector(cascade, minSize: 25,
                                                  searchMode: ObjectDetectorSearchMode.Average,
                                                  scalingMode: ObjectDetectorScalingMode.SmallerToGreater,
                                                  scaleFactor: 1.1f)
            {
                Suppression = 5 // This should make sure we only report regions as faces if
                                // they have been detected at least 5 times within different cascade scales.
            };

            // Now, let's open the video using FFMPEG:
            var video = new VideoFileReader();
            video.Open(fileName);

            // And then check the contents of one of the frames:
            Bitmap frame = video.ReadVideoFrame(frameIndex: 0);

            // Creating bitmaps and locking them is an expensive
            // operation. Instead, let's allocate once and reuse
            BitmapData     bitmapData     = frame.LockBits(ImageLockMode.ReadWrite);
            UnmanagedImage unmanagedImage = new UnmanagedImage(bitmapData);

            // We will create a color marker to show the faces
            var objectMarker = new RectanglesMarker(Color.Red);

            // This example is going to show two different ways to save results to disk. The
            // first is to save the results frame-by-frame, saving each individual frame as
            // a separate .png file. The second is to save them as a video in .mp4 format.

            // To save results as a movie clip in mp4 format, you can use:
            VideoFileWriter writer = new VideoFileWriter();
            writer.Open(Path.Combine(basePath, "detected_faces.mp4"), frame.Width, frame.Height);

            // Now, for each frame of the video
            for (int frameIndex = 0; frameIndex < video.FrameCount; frameIndex++)
            {
                // Read the current frame into the bitmap data
                video.ReadVideoFrame(frameIndex, bitmapData);

                // Feed the frame to the tracker
                Rectangle[] faces = detector.ProcessFrame(unmanagedImage);

                // Mark the location of the tracker object in red color
                objectMarker.Rectangles = faces;
                objectMarker.ApplyInPlace(unmanagedImage); // overwrite the frame

                // Save it to disk: first saving each frame separately:
                frame.Save(Path.Combine(basePath, "frame_{0}.png".Format(frameIndex)));

                // And then, saving as a .mp4 file:
                writer.WriteVideoFrame(bitmapData);
            }

            // The generated video can be seen at https://1drv.ms/v/s!AoiTwBxoR4OAoLJhPozzixD25XcbiQ
            video.Close();
            writer.Close();
            #endregion
        }