2012-10-24 4 views
2

The program 저는 프레임에서 가장 큰 윤곽을 필터링하고, 빨간색으로 페인트하고, 객체의 중심 좌표를 인쇄하는 윤곽 검출 프로그램을 연구 중입니다. 더 윤곽이 검출되지 않은"NULL 포인터가 전달됩니다"윤곽선을 감지하기 위해

OpenCV Error: Null pointer (NULL array pointer is passed) in unknown function, file ......../array.cpp line 2382 

가 이미 문제의 원인을 검색하여 첫 번째 경우 발견 (다음) 캡처 프레임 (들) : 나는이 프로그램을 디버깅 할 때 때때로, 나는이 오류 메시지를 받았습니다 (윤곽선이 NULL 임), 프로그램이 충돌합니다. 지금까지 적어도 윤곽선이 감지 될 때까지이 프로그램이 오류를 무시하도록하는 해결책을 찾지 못했습니다. 이 문제를 어떻게 막을 수 있을지에 대한 단서가 있습니까?

미리 감사드립니다. 건배

P/S : 윤곽이 감지 된 후 프로그램은 정상적으로 작동합니다. 현재 OpenCV 2.4.2를 사용 중입니다.

+0

에서 수정할 것이다 그러나 당신이 오류가 발생하는 함수를 호출 알고 :

나는이 다음 줄 잘 앉지 않는 것을 생각한다. 그래서 그것을 호출하기 전에 NULL 검사를 추가하십시오. BTW, 일부 코드를 보는 것이 좋을 것입니다. – LSerni

+0

답장을 보내 주셔서 감사합니다. 코드는 게시물의 "프로그램"이라는 단어에 링크되어 있습니다. NULL 검사에 대해 더 설명해 주시겠습니까? 나는 그만 두지 않아. –

+0

나는 내 눈을 검사해야한다. 어쨌든, 나는 대답을 추가했다 :-) – LSerni

답변

1

컨투어를 찾을 수없는 경우 프레임 처리를 잊어 버리는 것이 좋습니다.

cvFindContours(src_gray, storage, &contours, sizeof(CvContour), 
    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0,0)); 
if(contours==NULL) 
    continue; 
+0

OIC. 귀하의 방법은 잘 작동합니다. 감사합니다. –

1
이 코드에서

:

CvSeq* largest_contour = NULL; 
... 
while (current_contour != NULL){ 
    double area = fabs(cvContourArea(current_contour,CV_WHOLE_SEQ, false));  
    if(area > largestArea){ 
     largestArea = area; 
     largest_contour = current_contour; 
    } 
    current_contour = current_contour->h_next; 
} 

... current_contour가 자체 NULL되는 시작하면 당신이 NULL 동일 largest_contour으로 끝낼 수 있으며 contours2로부터 '구원의 은혜'는 없다 (또한 자체 NULL 처리 초기에).

나중에

, contourscontours2으로 "회복"있는 그대로 당신이

After a contour is detected, the program will work just fine

을 눈치 NULL는 중요하지 않습니다하지만 매우 첫 번째 프레임에서 이런 일이 수없는 것.

그러면 largest_contour은 초기 값인 NULL 값을 변경하지 않습니다.

cvMoments(largest_contour, &moments, 1); 

그때

if (largest_contour) 
    cvMoments(largest_contour, &moments, 1); 
else 
    continue; // loop to next frame 
+0

답변 해 주셔서 감사합니다. 이미 제안과 같은'continue' 함수를 시도하고 @RichardSchneider의 제안처럼'if (contours == NULL)'줄을 보았습니다. 그러나이 오류가 있습니다 :'잘못된 플래그 (매개 변수 또는 구조체 필드) (Unregconized 또는 지원되지 않는 배열 유형)' . 또한'cvMoments' 함수가 없어도이 프로그램을 이미 시도했기 때문에'cvMoments'가 그 이유라고 생각하지는 않지만 여전히 오류 메시지가 있습니다. –

+0

어떤 오류가 발생했는지 확실하지 않다면,이 오류를 디버그하는 가장 빠른 방법은'fprintf (stderr, 지금은 % s \ n ","FUNCTION_NAME ")를 호출하는 것입니다; 각 라이브러리 함수 호출. 그런 다음 잘못된 포인터를 사용하는 호출을 확실히 알 수 있습니다. – LSerni

+0

어리석은 저, 이미'잘못된 플래그 '오류 소스를 발견했습니다. 오류는 윤곽과 관련이 없습니다. 이제 프로그램은 잘 작동합니다. 고맙습니다 –

관련 문제