2011-11-02 86 views
-1

我已經成功地檢測從網絡攝像頭捕捉的面,但是,我已經發布的我的代碼唯一相關的部分捕獲約35-40幀,應用程序崩潰後,_Image是一類我已經實施。應用程序崩潰網絡攝像頭幀

_Image *Obj; 
CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY); 
if (!capture) 
{ 
    fprintf(stderr, "\n\n---ERROR: capture is NULL---\n"); 
} 
IplImage * frame = cvQueryFrame(capture); 
// Show the image captured from the camera in the window and repeat 
while (1) 
{ 
    frame = cvQueryFrame(capture); 
    if (!frame) { 
      fprintf(stderr, "ERROR: Webcam frame is null...Unexpected Error - Exiting");  
      getchar(); 
      exit(0); 
    } 
    Obj = new _Image(frame); 
    if(Obj==0) 
    { 
     fprintf(stderr, "\nERROR: Out of Memory!!\n"); 
     cvReleaseImage(&frame); 
     cvDestroyAllWindows(); 
     // Release the capture device 
     cvReleaseCapture(&capture); 
         exit(0); 
    } 
    flag = Obj->detect_face_in_image(); 
    if(flag!=0) 
    { 
     Obj->add_frame_name(); 
     Obj->webcam_reader(*Obj); 
    } 
     // Do not release the frame! 
    delete Obj; 
    cvNamedWindow("WEBCAM", CV_WINDOW_AUTOSIZE); 
    cvShowImage ("WEBCAM", frame); 
    if ((cvWaitKey(10)) == 27) 
    { 
        cvReleaseImage(&frame); 
     cvDestroyAllWindows(); 
     // Release the capture device 
     cvReleaseCapture(&capture); 
         break; 
    } 
} 

但是我沒有得到這樣的崩潰,如果改變我的代碼有點播放AVI文件,這僅與網絡攝像頭髮生。我得到了Windows XP send or dont send error report,崩潰前沒有具體的錯誤信息。

+0

你不提什麼樣的* *崩潰,你正目睹(訪問衝突,堆棧溢出,等...),也沒有下落,在此代碼發生崩潰。你在調試器中看到了什麼? – Johnsyweb

+0

該程序剛剛崩潰,就像你有時從任務管理器中結束任務一樣......沒有具體的方法來找出確切的原因......我應該如何在這裏使用調試器? –

+0

@Johnsyweb - 當我刪除'刪除Obj'的問題得到解決,但不會導致內存泄漏,如何對付這個? –

回答

1

這是不可能的,只要代碼是不完整的,給你的原因。

你傳入* obj轉換爲Obj-> webcam_reader() - 爲什麼呢,如果obj已經爲這個指針傳遞。

根據webcam_reader是如何定義的,你可能在這點上做的OBJ複印件(如果你不按引用傳遞)。如果無法安全地複製該對象,則可能會出現問題。如果您沒有實現複製構造函數,但在該類中使用手動分配的動態內存,則可能會出現這種情況。在這種情況下,只有一個指針被複制和釋放兩次。

至於說,人們只能推測的原因。

0

變化

cvWaitKey(10); 

cvWaitKey(25); 

也許

cvWaitKey(35); 
+0

這個修復程序會是什麼? – Johnsyweb

+0

網絡攝像頭有可能因爲您想要訪問幀比它能夠捕獲更快而崩潰。這可能不是解決方案,而是一個簡單的檢查。 – Sam

+0

但看着代碼,它也似乎是一個可能的錯誤是泄漏,或者你試圖釋放一個受保護的內存。請記住,捕獲對象總是返回一個指向同一個內存塊的指針,其中新的幀由編解碼器(視頻)或驅動程序(攝像頭)複製,並且不能由您的應用程序釋放 – Sam