Exemplo n.º 1
0
        public Rectangle  camshift(Image <Bgr, byte> frame, Rectangle trackerbox, Mat HIST)
        {
            Mat HSV = new Mat();

            CvInvoke.CvtColor(frame, HSV, ColorConversion.Bgr2Hsv);

            float[] range    = { 0, 180 };
            int[]   histsize = { 24 };
            int[]   channels = { 0, 0 };
            int[]   Chn      = { 0 };

            Mat dst = new Mat();

            float[] Range = { 0, 180 };

            var vhue = new VectorOfMat(HSV);

            CvInvoke.CalcBackProject(vhue, Chn, HIST, dst, Range, 1);
            Mat element = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(5, 5), new Point(1, 1));//

            CvInvoke.Erode(dst, dst, element, new Point(1, 1), 1, BorderType.Default, new MCvScalar(0, 0, 0));


            Mat DST = new Mat();

            MCvTermCriteria termCrit = new MCvTermCriteria(10, 1);

            try
            {
                RotatedRect result = CvInvoke.CamShift(dst, ref trackerbox, termCrit);
            }
            catch (Exception e) { MessageBox.Show(e.ToString()); }
            tbox = trackerbox;
            return(trackerbox);
        }
Exemplo n.º 2
0
        protected override CamshiftOutput DoProcess(TrackingInput input)
        {
            var output = new CamshiftOutput();
            Image <Gray, byte> grayscaleInput = input.Captured.ToImage <Gray, byte>();

            if (input.Config.StartNewTrack)
            {
                _trackStarted   = false;
                _backProjection = grayscaleInput.Copy();
                var trackingRegion = input.Config.ObjectOfInterest;

                grayscaleInput.ROI = trackingRegion;
                var inputRoiImage = grayscaleInput.Copy();
                grayscaleInput.ROI = Rectangle.Empty;       //clear the roi

                StartNewTrack(input.Config.ObjectOfInterest, grayscaleInput, inputRoiImage, output);
            }

            if (_trackStarted)
            {
                using (VectorOfMat vectorMatGrayscaleInput = new VectorOfMat(grayscaleInput.Mat))
                {
                    CvInvoke.CalcBackProject(vectorMatGrayscaleInput, _channels, _histogram, _backProjection, _ranges, 1);
                }

                output.ObjectOfInterest = CvInvoke.CamShift(_backProjection, ref _rectangleSearchWindow, TermCriteria);
            }

            output.BackProjection = _backProjection;
            return(output);
        }
Exemplo n.º 3
0
        private void button2_Click(object sender, EventArgs e)
        {
            int[] ch = { 0, 0 };
            CvInvoke.MixChannels(hsvImage, hueImage, ch);
            //【2】直方图计算,并归一化
            float[] hue_range = new float[2] {
                0.00f, 180.00f
            };
            Mat hist = new Mat(hueImage.Size, Emgu.CV.CvEnum.DepthType.Cv8U, 1);

            int[] channels = new int[1] {
                0
            };
            int[] histSize = new int[1] {
                Math.Max(g_bins, 2)
            };
            float[] ranges = new float[2] {
                0, 180
            };
            CvInvoke.CalcHist(hueImage, channels, null, hist, histSize, ranges, true);
            CvInvoke.Normalize(hist, hist, 0, 255, NormType.MinMax, DepthType.Default, null);
            //【3】计算反向投影
            Mat backproj = new Mat();

            CvInvoke.CalcBackProject(hueImage, channels, hist, backproj, ranges, 1);
            //【4】显示反向投影
            imageBox2.Image = backproj;
            //【5】绘制直方图
            Image <Gray, float> img = new Image <Gray, float>(hist.Bitmap);

            float[] data = new float[img.Data.Length];
            for (int i = 0; i < img.Data.Length; i++)
            {
                data[i] = img.Data[i, 0, 0];
            }
            float max = data[0];

            //获取最大值
            for (int i = 1; i < data.Length; i++)
            {
                if (data[i] > max)
                {
                    max = data[i];
                }
            }
            Image <Bgr, byte> image = new Image <Bgr, byte>(300, 300, new Bgr(0, 0, 0));

            for (int i = 0; i < data.Length; i++)
            {
                data[i] = data[i] * 256 / max;
                image.Draw(new LineSegment2DF(new PointF(i + 20, 255), new PointF(i + 21, 255 - data[i])), new Bgr(255, 255, 255), 2);
            }
            imageBox3.Image = image;
        }
Exemplo n.º 4
0
        static void RunMeanshiftDemo()
        {
            VideoCapture video = new VideoCapture("mleko.mp4");  // mleko.mp4
            //VideoCapture video = new VideoCapture("mouthwash.avi");  // mouthwash.avi
            var firstFrame = new Mat();

            video.Read(firstFrame);
            int x = 290, y = 230, width = 100, height = 15; // mleko.mp4
            //int x = 300, y = 305, width = 100, height = 115; // mouthwash.avi
            var roi = new Mat(firstFrame, new Rectangle(x, y, width, height));

            ShowHueEmphasizedImage(roi);

            CvInvoke.Imshow("Roi", roi);
            var roiHsv = new Mat();

            CvInvoke.CvtColor(roi, roiHsv, ColorConversion.Bgr2Hsv);
            var histogram = new Mat();

            CvInvoke.CalcHist(new VectorOfMat(new Mat[] { roiHsv }), new int[] { 0 }, null, histogram, new int[] { 180 }, new float[] { 0, 180 }, false);
            CvInvoke.Normalize(histogram, histogram, 0, 255, NormType.MinMax);

            show2DHueHistogram(histogram);

            var nextFrame      = new Mat();
            var nextFrameHsv   = new Mat();
            var mask           = new Mat();
            var trackingWindow = new Rectangle(x, y, width, height);

            while (true)
            {
                video.Read(nextFrame);
                if (nextFrame.IsEmpty)
                {
                    break;
                }
                CvInvoke.CvtColor(nextFrame, nextFrameHsv, ColorConversion.Bgr2Hsv);
                CvInvoke.CalcBackProject(new VectorOfMat(new Mat[] { nextFrameHsv }), new int[] { 0 }, histogram, mask, new float[] { 0, 180 }, 1);
                CvInvoke.Imshow("mask", mask);
                CvInvoke.MeanShift(mask, ref trackingWindow, new MCvTermCriteria(10, 1));
                CvInvoke.Rectangle(nextFrame, trackingWindow, new MCvScalar(0, 255, 0), 2);
                CvInvoke.Imshow("nextFrame", nextFrame);
                CvInvoke.WaitKey(60);
            }
            Console.WriteLine("Koniec filmu.");
            CvInvoke.WaitKey();
        }
Exemplo n.º 5
0
        public void tracking(Mat hist_roi)
        {
            using (var nextframe = cap.QueryFrame().ToImage <Bgr, Byte>())
            {
                if (nextframe != null)
                {
                    float[] range    = { 0, 180 };
                    int[]   histsize = { 180 };
                    int[]   channels = { 0, 0 };
                    int[]   Chn      = { 0 };
                    //Rectangle  ret = new Rectangle();
                    //ret = nextframe.Mat;

                    Rectangle trackwindow = new Rectangle(rectx, recty, rectw, recth);
                    Mat       hsv         = new Mat();
                    Mat       hist        = new DenseHistogram(16, new RangeF(0, 16));
                    CvInvoke.CvtColor(nextframe, hsv, ColorConversion.Bgr2Hsv);//hsv
                    Mat mask = new Mat();
                    CvInvoke.InRange(hsv, new ScalarArray(new MCvScalar(0, 60, 32)), new ScalarArray(new MCvScalar(180, 256, 255)), mask);
                    Mat hue = new Mat();
                    hue.Create(hsv.Rows, hsv.Cols, hsv.Depth, 0);
                    //CvInvoke.MixChannels()
                    int[] chn  = { 0, 0 };
                    var   vhue = new VectorOfMat(hue);
                    var   vhsv = new VectorOfMat(hsv);

                    //var vhsv = new VectorOfMat(hsv);
                    CvInvoke.MixChannels(vhsv, vhue, chn);


                    Mat     dst   = new Mat();
                    float[] Range = { 0, 180, 0, 255 };
                    CvInvoke.CalcBackProject(vhue, Chn, hist_roi, dst, Range, 1);
                    Size s = new Size(5, 5);
                    //  CvInvoke.GetStructuringElement(ElementShape.Ellipse,s);
                    CvInvoke.Threshold(dst, dst, 50, 255, 0);
                    imageBox1.Image = dst;
                    //  MCvTermCriteria termcriteria = new MCvTermCriteria(TermCritType.Eps | TermCritType.Iter, 10, 1);
                    MCvTermCriteria termCrit  = new MCvTermCriteria(10, 0.1);
                    RotatedRect     result    = CvInvoke.CamShift(dst, ref trackerbox, termCrit);
                    var             grayframe = nextframe.Convert <Gray, byte>();
                    grayframe.ROI = trackerbox;
                    var grayface  = grayframe.Copy().Mat;
                    var faces     = haar.DetectMultiScale(grayface, 1.1, 10, Size.Empty);
                    int totalface = faces.Length;


                    RectangleF ret = trackerbox;


                    // PointF[] PTS = CvInvoke.BoxPoints(ret);
                    // Point[] pts = new Point[10];
                    //for (int x = 0; x < PTS.Length; x++)
                    // {
                    //   pts[x] = Point.Round(PTS[x]);
                    CvInvoke.CvtColor(dst, nextframe, ColorConversion.Gray2Bgr);
                    //CvInvoke.Polylines(nextframe, pts, true, new MCvScalar(255, 0));
                    // if (totalface == 1)
                    //   {
                    MCvScalar color = new MCvScalar(0, 0, 255);
                    CvInvoke.Ellipse(nextframe, ret, color, 3, LineType.AntiAlias);
                    //  }
                }
                imageBox1.Image = nextframe;
            }    //while loop end*/
        }
Exemplo n.º 6
0
        private void backProjectionToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                if (pictureBox1.Image == null)
                {
                    return;
                }

                var img = new Bitmap(pictureBox1.Image)
                          .ToImage <Gray, byte>();

                Image <Gray, byte> img1   = null;
                OpenFileDialog     dialog = new OpenFileDialog();
                if (dialog.ShowDialog() == DialogResult.OK)
                {
                    img1 = new Image <Gray, byte>(dialog.FileName);
                }

                Mat hist  = new Mat();
                Mat hist1 = new Mat();

                float[] ranges   = new float[] { 0, 256 };
                int[]   channel  = { 0 };
                int[]   histSize = { 256 };

                VectorOfMat ms = new VectorOfMat();
                ms.Push(img);

                VectorOfMat ms1 = new VectorOfMat();
                ms1.Push(img1);


                CvInvoke.CalcHist(ms, channel, null, hist, histSize, ranges, false);
                CvInvoke.CalcHist(ms1, channel, null, hist1, histSize, ranges, false);

                CvInvoke.Normalize(hist, hist);
                CvInvoke.Normalize(hist1, hist1);


                Mat proj = new Mat();
                CvInvoke.CalcBackProject(ms, channel, hist, proj, ranges);


                HistogramViewer viewer = new HistogramViewer();
                viewer.Text     = "Image Histogram";
                viewer.ShowIcon = false;
                viewer.HistogramCtrl.AddHistogram("Image1 Histogram", Color.Blue, hist, 256, ranges);
                viewer.HistogramCtrl.Refresh();
                viewer.Show();

                HistogramViewer viewer1 = new HistogramViewer();
                viewer1.Text     = "Image Histogram";
                viewer1.ShowIcon = false;
                viewer1.HistogramCtrl.AddHistogram("Image2 Histogram", Color.Blue, hist1, 256, ranges);
                viewer1.HistogramCtrl.Refresh();
                viewer1.Show();



                pictureBox1.Image = proj.ToBitmap();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }