2013-01-14 33 views
0

我正在使用C與OpenCV進行「照片」處理應用程序。 我的電腦將使用其 網絡攝像頭不斷調查周圍環境。當它檢測到移動時,它會將當前的 網絡攝像頭圖像寫入文件(通知)。 這是我編寫代碼的方式,但速度非常慢,我不擅長通知....你能給我一些關於代碼的好建議嗎?入侵者檢測器 - OpenCv - C

#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; 
} 
+0

既然你的代碼有效,你應該在http://codereview.stackexchange.com上發佈。 – Joe

+0

第一次迭代時'key'會有什麼價值?將會創建多少次「FrameController」窗口? – HonkyTonk

回答

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. 

什麼是存儲使用?

希望能幫助你清理你的代碼。