2012-02-28 3 views
1

뭔가가 발생하기까지 기다리는 방법이 있습니다 (루프 동안) 또는 동그라미 감지를하기 전에 10 초 동안 기다렸지 만 비디오를 계속 표시하십시오. while 루프와 함께 시도했지만 조건이 충족되지 않으면 코드가 cvShow \ iamge()를 얻지 못하여 프레임이 표시되지 않습니다.비디오가있는 opencv 동그라미 감지

답변

1

예, 이 가능하지만 스레드를 사용해야합니다. 전역 변수 bool exec_circle_detection = false;을 선언하고 두 번째 스레드를 시작하십시오. 이 스레드에서 sleep(10)으로 전화를 걸어 10 초 동안 기다린 다음 exec_circle_detection을 으로 변경하십시오.

루프를 잡는 루프의 주 스레드에서 부울 변수가 true로 설정되어 있는지 확인하고, 그렇지 않은 경우 프레임을 처리하지 않습니다. 한 번 10 초마다, 당신은 사용자 정의 처리를 실행 한 후 false로 exec_circle_detection을 변경해야합니다 원 감지를 할 계획이라면

char key = 0; 
while (key != 27) // ESC 
{  
    frame = cvQueryFrame(capture); 
    if (!frame) 
    { 
     fprintf(stderr, "!!! cvQueryFrame failed!\n"); 
     break; 
    } 

    if (exec_circle_detection) 
    { 
     // execute custom processing 
    } 

    // Display processed frame 
    cvShowImage("result", frame); 

    // Exit when user press ESC 
    key = cvWaitKey(10); 
} 

:이 부분은 (C)에 다음과 같이 보일 것입니다. 보조 스레드에서 while 루프가 exec_circle_detection이 10 초마다 true로 변경되도록 코드를 조정하십시오.

+0

고맙습니다. 나는 원 감지를 할 계획이고, 다음 10 초 동안 비디오를 보여 주기만하면 프로그램이 아무 것도하지 않기를 바란다. 다음 코드 줄로 돌아갑니다. –

+0

굉장하고, 내 대답을 upvote하거나 근처에있는 확인란을 클릭하여 귀하의 질문에 공식 답변으로 그것을 선택하십시오. 아니면 둘 다 : – karlphillip

+0

아마도 복잡한 질문. 내 코드에서 원을 감지하는 부분이 있습니다. 나는 10 초를 세고 서클을 탐지하고 코드의 다음 라인을 실행하지 않고 비디오를 표시하기를 원한다. ??? –

0

X 프레임마다 간단히 감지를 실행할 수 있습니다. 코드에 프레임 카운터를 추가하고 감지가 실행될 때 0으로 다시 시작한 다음 캡처 된 각 새 프레임에서 1 씩 증가시키고 카운터가 300 일 때 감지를 수행하면 비디오가 30 fps으로 표시됩니다. 각 감지 사이에 10 초 지연이 있습니다.

+0

응용 프로그램이 다른 유형의 카메라에서만 작동하도록되어 있다면 어떻게 될까요? 더 신뢰할 수있는 솔루션은 나의 대답에서 설명한 타이밍 메커니즘을 사용하는 것입니다. – karlphillip