2011-11-02 1 views
-1

약 35-40 프레임을 캡처 한 후 웹캠에서 캡처 한 얼굴을 성공적으로 감지했지만 응용 프로그램이 충돌하고 코드의 관련 부분 만 게시했습니다 _Image은 클래스입니다 내가 구현 했어. 변경 내 코드 조금 AVI 파일을 재생하는 경우35-40 웹캠 프레임을 읽은 후 응용 프로그램이 충돌 함

_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; 
    } 
} 

그러나 나는이 단지 웹캠과 발생, 충돌의이 종류를하지 않습니다. 나는 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

관련 문제