Как да изчистите всички кадри, които са обработени чрез проследяване? защото сега в приложението ми продължава да увеличава броя на кадрите, консумира много памет и кара компютъра ми да замръзва.
Благодаря ти.
РЕДАКТИРАНЕ
Започнете проследяване с алгоритъм за разпределително превключване с 3 метода, актуализиране на изображението за нюанс, проследяване на ръцете и проследяване на ръка. 1. конвертирайте изображението в hsv, вземете цвета на канала на нюанса, направете хистограма за канала на нюанса 2. направете обратна проекция 3. направете camshift-->meanshift алгоритъм
public void HandTracker(Image<Bgr, Byte> ImageFrame, Rectangle currentrect) { hsv = Emgu.CV.CvInvoke.cvCreateImage(new Size(ImageFrame.Width, ImageFrame.Height), IPL_DEPTH.IPL_DEPTH_8U, 3); hue = Emgu.CV.CvInvoke.cvCreateImage(new Size(ImageFrame.Width, ImageFrame.Height), IPL_DEPTH.IPL_DEPTH_8U, 1); mask = Emgu.CV.CvInvoke.cvCreateImage(new Size(ImageFrame.Width, ImageFrame.Height), IPL_DEPTH.IPL_DEPTH_8U, 1); backproject = Emgu.CV.CvInvoke.cvCreateImage(new Size(ImageFrame.Width, ImageFrame.Height), IPL_DEPTH.IPL_DEPTH_8U, 1); histogram = new DenseHistogram(30, new RangeF(0, 180)); previoushand = currentrect; UpdateHueImage(ImageFrame); //show how many frame detected frame = frame + 1; label_1.Text = frame.ToString(); float vmax = 0; float vmin = 0; float scale = 0; x = new IntPtr[1] { hue }; Emgu.CV.CvInvoke.cvSetImageROI(hue, currentrect); Emgu.CV.CvInvoke.cvSetImageROI(mask, currentrect); Emgu.CV.CvInvoke.cvCalcHist(x, histogram, false, mask); Emgu.CV.CvInvoke.cvGetMinMaxHistValue(histogram, ref vmin, ref vmax, null, null); if (vmax != 0) { scale = 255 / vmax; } Emgu.CV.CvInvoke.cvConvertScale(histogram.MCvHistogram.bins, histogram.MCvHistogram.bins, scale, 0); Emgu.CV.CvInvoke.cvResetImageROI(hue); Emgu.CV.CvInvoke.cvResetImageROI(mask); //if (ImageFrame != null) ImageFrame.Dispose(); Debug.WriteLine("hand tracker done!"); } public Rectangle TrackHand(Image<Bgr, Byte> ImageFrame) { MCvConnectedComp components = new MCvConnectedComp(); UpdateHueImage(ImageFrame); //show how many frame detected frame = frame + 1; label_2.Text = frame.ToString(); IntPtr[] x = { hue }; Emgu.CV.CvInvoke.cvCalcBackProject(x, backproject, histogram); Emgu.CV.CvInvoke.cvAnd(backproject, mask, backproject, IntPtr.Zero); Emgu.CV.CvInvoke.cvCamShift(backproject, previoushand, new MCvTermCriteria(10, 1), out components, out handcomp); previoushand = components.rect; ImageFrame.Draw(previoushand, new Bgr(Color.Black), 2); Debug.WriteLine("Track hand done!"); return currenthand; } private void UpdateHueImage(Image<Bgr, Byte> currentrect) { Emgu.CV.CvInvoke.cvCvtColor(currentrect, hsv, COLOR_CONVERSION.CV_BGR2HSV); int vmin = 65; int vmax = 256; int smin = 55; Emgu.CV.CvInvoke.cvInRangeS(hsv, new MCvScalar(0, smin, Math.Min(vmin, vmax), 0), new MCvScalar(180, 256, Math.Max(vmin, vmax), 0), mask); Emgu.CV.CvInvoke.cvSplit(hsv, hue, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); Debug.WriteLine("UpdateHueImage done!"); }
Това е моят код за проследяване на разпределителния предавък, открих, че консумира твърде много памет и компютърът ми замръзва след откриване на 800++ кадъра. Как да изтрия кеша ImageFrame, който вече е обработен?