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); }
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); }
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; }
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(); }
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*/ }
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); } }