2010-03-29 4 views
2

현재 화상 처리 응용 프로그램을 작성 중입니다. 응용 프로그램은 웹캠에서 이미지를 캡처 한 다음 일부 처리를 수행합니다. 앱이 실시간으로 응답해야합니다 (이상적으로 각 요청을 처리하려면 < 50ms). 내가 가지고있는 코드에 대해 약간의 타이밍 테스트를 해왔고, 매우 흥미로운 것을 발견했습니다 (아래 참조).성능 테스트 결과가 혼란 스럽습니다.

clearLog(); 
log("Log cleared"); 

camera.QueryFrame(); 
camera.QueryFrame(); 
log("Camera buffer cleared"); 

Sensor s = t.val; 
log("Sx: " + S.X + " Sy: " + S.Y); 

Image<Bgr, Byte> cameraImage = camera.QueryFrame(); 
log("Camera output acuired for processing"); 

처리 시작부터 시간이 표시 될 때마다 log이 표시됩니다.

[3 ms]Log cleared 
[41 ms]Camera buffer cleared 
[41 ms]Sx: 589 Sy: 414 
[112 ms]Camera output acuired for processing 

타이밍은 StopWatchSystem.Diagonostics에서를 사용하여 계산된다 : 여기 내 로그 출력이다. 위에 표시된 시간은 누적입니다. 따라서 Log Clear는 3ms가 걸렸습니다. 그리고 "Camera Buffer cleared"(41-3 = 38ms)가 사용되었습니다. 1

질문 나는 같은 방법으로 두 번 호출 할 때이 ~ 40ms로를에서 실행하기 때문에, 이것은 약간 흥미와이 더 오래 걸렸다 다음에 (~ 70ms가) 한 번 호출 될 때.

값을 할당하면 실제로 그렇게 오래 걸리지 않을 수 있습니까? 2

질문은 또한 상기 기록 된 각각의 단계에 대한 타이밍은 수시로 변화한다. 일부 단계의 값은 때로는 0ms로 낮고 때로는 100ms까지 높습니다. 대부분의 숫자는 비교적 일관성있는 것으로 보입니다.

CPU가 다른 프로세스에 의해 사용 되었기 때문일 수 있습니다. (다른 이유로 인 경우 알려 주시기 바랍니다.)

이 기능을 실행할 때 가장 우선 순위가 높은지 확인하는 방법이 있습니까? 따라서 속도 테스트 결과가 지속적으로 낮아질 것입니다 (시간 기준).

편집

나는 위의 두 개의 빈 쿼리 프레임을 제거 할 수있는 코드를 변경, 그래서 코드는 이제 :

clearLog(); 
log("Log cleared"); 

Sensor s = t.val; 
log("Sx: " + S.X + " Sy: " + S.Y); 

Image<Bgr, Byte> cameraImage = camera.QueryFrame(); 
log("Camera output acuired for processing"); 

타이밍 결과는 지금 :

[2 ms]Log cleared 
[3 ms]Sx: 589 Sy: 414 
[5 ms]Camera output acuired for processing 

다음 단계는 이제 더 오래 걸립니다 (때로는 다음 단계가 20-30ms 후에 점프하는 반면, 다음 단계는 이전에 거의 순간적이었습니다). 나는 이것이 CPU 스케줄링 때문이라고 추측하고있다. 이 코드를 통해 CPU가 실행되는 동안 다른 일을하도록 CPU가 예약되지 않도록 할 수 있습니까?

+0

'camera.QueryFrame()'은 실제로'Image '을 반환합니까? 그렇지 않으면 여분의 시간이 걸리는 숨겨진 생성자가 실행 중일 수 있습니다. – Gorpik

+0

@Gorpik : camera.QueryFrame()은 이미지를 반환하지 않습니다. Aishwar

답변

0

소스가 없다면 "가능한 것"이라고 말하는 것이 거의 불가능합니다.

스톱워치가 저해상도 모드에있는 경우 타이밍을 까다롭게 만드는 한 가지 점이 있습니다. 실제로 임의의 측정 (즉, 부적절한 세분화없이 수 밀리 초)을 생성 할 수 있는지 확인하기 위해 몇 개의 루프를 작성하는 것이 좋습니다.

프로필러를 사용해 보셨습니까?그 시간에 다른 프로세스가 무엇을하고 있는지에 대한 질문에 대답 할 수 있습니다.

+0

@Eamon : StopWatch에서 IsHighResolution 속성을 확인했습니다. 이 속성은 true입니다. 따라서 고해상도 모드로 실행됩니다. 빈도 값은 1948291입니다. – Aishwar

1

카메라가 묻는 순간 카메라가 실제로 프레임을 얻지는 않지만 항상 그렇습니다. 그런 다음 이미지 데이터를 요구하고 충분히 신선하면 데이터가 즉시 반환됩니다. 그러나 불행하고 데이터가 오래되면 새로운 이미지 수집을 기다리게됩니다. 카메라가 25fps를 수행하면 50ms 지연이 발생할 수 있습니다 (실제 광자 수집뿐만 아니라 데이터 전송도).

카메라를 더 낮은 해상도로 설정하면 프레임 속도가 올라갈 수 있으므로 지연 시간이 단축됩니까?