2013-10-11 2 views
4

나는 정확히 내가 원하는 것을 제공하지만 옵티컬 플로우를 계산하기 위해 createOptFlow_DualTVL1()을 사용하고 있지만 매우 느립니다. 조금 더 빠르게 할 수있는 방법이 있습니까? 아니면 처리 시간을 줄여도 동일한 결과를 얻을 수있는 다른 광학 흐름 함수가 있습니까? calcOpticalFlowFarneback(), cvGoodFeaturesToTrack()을 사용했지만 품질이 좋지 않습니다. 도와주세요. 옵티컬 플로우 가속화 (createOptFlow_DualTVL1)

아래는 내가 계산을 빠르게하기 위해 createOptFlow_DualTVL1()

Ptr<DenseOpticalFlow> tvl1 = createOptFlow_DualTVL1(); 
tvl1->calc(Previous_Gray_Frame, Current_Gray_Frame, Optical_Flow); 

답변

9

을 적용하는 방법입니다 미리 감사합니다, 당신은 계산의 총 수가마다 실행 줄일 필요가있다. 이것은 명백한 것처럼 보이지만 그 목표를 달성하기위한 수많은 전략이 혼란 스러울 수 있습니다. 그래서, 여기에 몇 가지 제안은 다음과 같습니다

  1. 이 이미지 (입력 데이터)의 크기를 줄입니다. 특히 각 크기에 따라 크기를 2로 나누고 흐름을 계산 한 다음 선형 보간을 사용하여 전체 크기의 흐름을 계산해야합니다. 응용 프로그램이 매우 높은 정확도를 필요로하지 않는 한,이 솔루션은 수용 가능해야하며 엄청난 속도 향상을 제공합니다.

  2. 축척 당 (매개 변수 : warps)의 수를 줄입니다. 이렇게하면 약간의 정확도가 떨어지지 만 매우 어려운 동작 패턴 (예 : 모든 이미지 픽셀이 다른 방향으로 움직이는 경우 또는 이미지 내부에서 매우 빠른 동작이있는 경우)을 제외하고 결과는 여전히 받아 들일 수 있습니다. 알고리즘은 이미지 피라미드에서 레벨 당 최소화 절차 warps 번을 실행하므로 warps의 작은 변화가 눈에 띄는 속도 향상을 제공합니다.

  3. 이미지 피라미드 (매개 변수 : scales)의 레벨 수를 줄입니다. 이것은 정확도에 중요한 영향을 미칠 수 있으므로 조심하고 많은 것을 실험 해보십시오. 레벨 사이의 좋은 (정확한) 스케일 인자는 0.8이므로 레벨의 수를 적절히 계산해야한다는 것이 문서에서 발견되었습니다. 0.8 이전에는 옵티컬 플로 실험의 표준이 0.5의 배율 인수 였으므로이 값까지 내려 가려고 할 수 있습니다.

  4. 수렴 속도 : L1 최소화를위한 내부 절차는 이론상 1/8 (0.125) 시간 간격 (파라미터 : tau)까지 안정하지만, 실제로 1/4 (0.25) 값은 여전히 ​​알려져있다. 작업.

+0

덕분에 sansuiso하지만 난 단지 나를 수) (creatOptFlow_DualTVL1이 매개 변수를 조정하는 곳이 표시되지 않는 경우에만이 인수 tvl1-> CALC (Previous_Gray_Frame, Current_Gray_Frame, Optical_Flow); 아니면 당신의 다른 기능을 추천 해 주시겠습니까? – Dave

+0

이 매개 변수는 cv :: createOptFlow ...를 호출 할 때 생성되는 struct의 멤버입니다. 예 : tvl1-> theta = 0.125; – sansuiso

+2

도와 주셔서 감사합니다. 일부 수정안을 추가 할 수 있습니다 : tvl1-> getDouble ("theta"); // 값을 얻으려면 tvl1-> set ("theta", 0.125); // 값을 설정하려면 – Dave