0

これはコードです

CvMemStorage *mem123 = cvCreateMemStorage(0);
CvSeq* ptr123;CvRect face_rect123;
CvHaarClassifierCascade* cascade123 = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt2.xml" );    //detects the face if it's frontal
void HeadDetection(IplImage* frame,CvRect* face){
    ptr123=cvHaarDetectObjects(frame,cascade123,mem123,1.2,2,CV_HAAR_DO_CANNY_PRUNING);
    if(!ptr123){return ;}
    if(!(ptr123->total)){return ;}
    face_rect123=*(CvRect*)cvGetSeqElem( ptr123, 0 );   //CvRect face_rect holds the position of Rectangle
    face->height=face_rect123.height;
    face->width=face_rect123.width;
    face->x=face_rect123.x;
    face->y=face_rect123.y;
    return ;
}//detects the position of head and it is fed in CvRect*face as rectangle
int main(){
    IplImage* oldframe=cvCreateImage(cvSize(640,480),8,3);
    CvCapture* capture=cvCaptureFromCAM(CV_CAP_ANY);
    CvRect a;a.height=0;a.width=0;a.x=0;a.y=0;
    while(1){

        oldframe=cvQueryFrame(capture); //real frame captured of size 640x480
        cvFlip(oldframe,oldframe,1);
        cvResize(oldframe,frame);   //frame scaled down 4 times 
        HeadDetection(frame,&a);
        cvShowImage("frame",frame);
        cvWaitKey(1);
    }
}

ここで「HeadDetection(frame、&a);」の場合 コメントがあり、タスクマネージャーを使用すると、angledetection.exe(私のプロジェクトの名前)が20188 Kbのメモリを消費していることがわかります(メモリリークは発生していません)。

ただし、タスクマネージャーがメモリリークが発生していることを示しているとコメントしない場合(約300Kb / s)

64ビットWindows7ビットOS(コア2デュオ)でVS2010を使用しています。

このコードは、OpenCV 2.1のhaar検出によって顔を検出し、正方形の四隅を取得しようとしています。

不明な点がある場合はお問い合わせください。:-)

前もって感謝します。

4

1 に答える 1

1

を呼び出すと、オブジェクトへのポインターを取得していますcvHaarDetectObjects

しかし、解放することはありません ( ptr123が指すオブジェクト)。

また、face_rect123は解放されません。

ところで、コードのリファクタリングを検討し、変数により良い名前を付ける必要があります。

于 2012-06-22T07:17:13.527 に答える