0

OpenCVでCを使用して「写真」処理アプリケーションを実行しています。私のコンピューターは、ウェブカメラを使用して周囲を常に調査します。動きを検出すると、現在のWebカメラ画像をファイルに書き込みます(通知)。これが私がコードを書いた方法ですが、それは非常に遅いです、私は通知をするのが苦手です....コードに関していくつかの良いアドバイスをください。

#include <stdio.h>  
#include "cv.h"
#include "highgui.h"
#include <dos.h>
#include <conio.h>


CvCapture   *capture;
int key;

IplImage *oldFrame;
IplImage *currentFrame;
IplImage *res;

int f=0,x,y,idx,idy;

int currentFrame_width, currentFrame_height;
int oldFrame_width, oldFrame_height;
int res_width, res_height;

int main( int argc, char** argv )
{   
    while( key != 'q' ) 
    {

           capture = cvCaptureFromCAM( 0 );
           if( !capture ) return 1;
           key = cvWaitKey( 1 );
           cvNamedWindow( "FrameController", CV_WINDOW_AUTOSIZE );

           if(f==0){

                    oldFrame = cvQueryFrame( capture );
                    cvShowImage( "FrameController", oldFrame );
                    f=1;
           }
           else{    
                    CvMemStorage* storage = cvCreateMemStorage(0);
                    currentFrame = cvQueryFrame( capture );
                    for  ( x=0;x<currentFrame->width;x++) 
                    { 
                      for ( y=0;y<currentFrame->height;y++) 
                      { 
                           idx = y*currentFrame->widthStep + currentFrame->nChannels*x; 
                           idy = y*oldFrame->widthStep + oldFrame->nChannels*x; 
                      }
                    }
                    uchar R= (uchar) currentFrame->imageData [idx+0];   
                    uchar G = (uchar) currentFrame->imageData [idx+1]; 
                    uchar B = (uchar) currentFrame->imageData [idx+2]; 
                    uchar R1= (uchar) oldFrame->imageData [idy+0];   
                    uchar G1 = (uchar) oldFrame->imageData [idy+1]; 
                    uchar B1 = (uchar) oldFrame->imageData [idy+2]; 

                    if(!((R==R1) || (G==G1) || (B==B1))){

                      f=0;
                      CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "C:\\OpenCV2.1\\data\\haarcascades\\haarcascade_frontalface_alt2.xml" );
                       double scale = 1.3;
                                         static CvScalar colors[] = {CV_RGB(rand()&255, rand()&255, rand()&255 )};


                                         cvClearMemStorage( storage );
                                         CvSeq* objects = cvHaarDetectObjects( currentFrame, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 ));
                                         CvRect* r;


                                          for( int i = 0; i < (objects ? objects->total : 0 ); i++ ){
                                                r = ( CvRect* )cvGetSeqElem( objects, i );
                                                cvRectangle( currentFrame, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ),
                                                colors[i%8]);
                                                cvShowImage( "FrameController", currentFrame );
                                          } 
                        }
           }
    }


    cvDestroyWindow( "FrameController" );   
    cvReleaseCapture( &capture );
    cvReleaseImage( &currentFrame);
    cvReleaseImage( &oldFrame);
    return 0;
}
4

1 に答える 1

0

whileループ内で不要な初期化を行っているようです。例えば

capture = cvCaptureFromCAM( 0 ); << is that necessary to be in the loop?
cvNamedWindow( "FrameController", CV_WINDOW_AUTOSIZE ); << this?


for  ( x=0;x<currentFrame->width;x++) 
                    { 
                      for ( y=0;y<currentFrame->height;y++) 
                      { 
                           idx = y*currentFrame->widthStep + currentFrame->nChannels*x; 
                           idy = y*oldFrame->widthStep + oldFrame->nChannels*x; 
                      }
                    } << that's a loop over the WHOLE IMAGE that does NOTHING.

ストレージは何に使用されますか?

それがコードのクリーンアップに少し役立つことを願っています。

于 2013-01-15T20:39:58.180 に答える