c# - Failed to allocate bytes in OpenCV -
i using emgu.cv extract frames video files , extract faces every frame, problem application runs out of memory after while. think release memory , dispose every object create. here method, optimization, ideas appreciated.
public list<fileitem> extractfacesfromimage(fileitem selectedframe, string outputfolderpath, int minneighbors, double scalefactor, int widthincrement = 80, int heightincrement = 102) { lock (lockobj) { _currentframe = new image<bgr, byte>(selectedframe.path); _gray = _currentframe.convert<gray, byte>(); var result = new list<fileitem>(); using (_face = new haarcascade(_xmlfilepath)) { if (_gray != null) { var facesdetected = _gray.detecthaarcascade(_face, scalefactor, minneighbors,emgu.cv.cvenum.haar_detection_type.do_rough_search,new size(20, 20)); (int index = 0; index < facesdetected[0].length; index++) { var imgname = saveextractedface(outputfolderpath, facesdetected, index, widthincrement, heightincrement); result.add(new fileitem { isselected = true, path = imgname, name = path.getfilenamewithoutextension(imgname) }); } disposeobject(_gray); disposeobject(_currentframe); } homecoming result; } } } private void disposeobject(idisposable disposable) { if (disposable != null) { disposable.dispose(); disposable = null; } } private string saveextractedface(string outputfolderpath, mcvavgcomp[][] facesdetected, int index, int widthincrement, int heightincrement) { var f = facesdetected[0][index]; var croprectangle = getnewrectangle(f.rect, _currentframe.width, _currentframe.height, widthincrement, heightincrement); _tempimage = _currentframe.copy(croprectangle); string imgname = outputfolderpath + "\\" + uniquenamemanager.generate() + ".jpg"; _tempimage.save(imgname); disposeobject(_tempimage); homecoming imgname; }
please seek run code, , not utilize global or general variable.
public list<fileitem> extractfacesfromimage(fileitem selectedframe, string outputfolderpath, int minneighbors, double scalefactor, int widthincrement = 80, int heightincrement = 102) { lock (lockobj) { var currentframe = new image<bgr, byte>(selectedframe.path); var grayness = _currentframe.convert<gray, byte>(); var result = new list<fileitem>(); using (_face = new haarcascade(_xmlfilepath)) { if (gray != null) { var facesdetected = gray.detecthaarcascade(_face, scalefactor, minneighbors,emgu.cv.cvenum.haar_detection_type.do_rough_search,new size(20, 20)); (int index = 0; index < facesdetected[0].length; index++) { var imgname = saveextractedface(outputfolderpath, facesdetected, index, widthincrement, heightincrement); result.add(new fileitem { isselected = true, path = imgname, name = path.getfilenamewithoutextension(imgname) }); } } homecoming result; } } } private string saveextractedface(string outputfolderpath, mcvavgcomp[][] facesdetected, int index, int widthincrement, int heightincrement) { var f = facesdetected[0][index]; var croprectangle = getnewrectangle(f.rect, _currentframe.width, _currentframe.height, widthincrement, heightincrement); _tempimage = _currentframe.copy(croprectangle); string imgname = outputfolderpath + "\\" + uniquenamemanager.generate() + ".jpg"; _tempimage.save(imgname); disposeobject(_tempimage); homecoming imgname; } c# opencv memory-management memory-leaks emgucv
No comments:
Post a Comment