Как да изчистите кадри на историята след извършено проследяване в поточно видео от живота?

Как да изчистите всички кадри, които са обработени чрез проследяване? защото сега в приложението ми продължава да увеличава броя на кадрите, консумира много памет и кара компютъра ми да замръзва.

Благодаря ти.

РЕДАКТИРАНЕ

Започнете проследяване с алгоритъм за разпределително превключване с 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, който вече е обработен?


person okibhayo    schedule 11.02.2014    source източник
comment
Можете по-ефективно да използвате израз като using(Image‹Gray,byte› myImage = new Image‹Gray,byte›(_capture.Queryframe().toBitmap())){.....} това автоматично ще извика метод dispose() за изображението, но моля, актуализирайте въпроса си с кода, който причинява проблеми, така че да може да бъде адресиран по-ефективно, благодаря   -  person Chris    schedule 12.02.2014
comment
Вече актуализирам с кода си, можете ли да коригирате това, което трябва да направя, за да изхвърля и изчистя откритата рамка? @Крис   -  person okibhayo    schedule 12.02.2014


Отговори (2)


извикайте метода Dispose(), когато изображенията вече са обработени. Това ще освободи неуправляваната IplImage структура, която консумира паметта.

person Evans    schedule 11.02.2014

Точно това, от което се нуждаете, е внедрено в: https://github.com/dajuric/accord-net-extensions

проверете бърз шаблон за съвпадение на проба, проба на филтър за частици (ръчно проследяване). Класът, който е подходящ за съхраняване на история, се нарича История.

person dajuric    schedule 18.08.2014