OpenCV SURF, сравнивающий дескрипторы - PullRequest
0 голосов
/ 07 февраля 2011

Следующий фрагмент из OpenCV find_obj.cpp, который является демонстрационным примером использования SURF ,


double
compareSURFDescriptors( const float* d1, const float* d2, double best, int length )
{
    double total_cost = 0;
    assert( length % 4 == 0 );
    int i;
    for( i = 0; i  best )
            break;
    }
    return total_cost;
}


Насколько я могу судить, проверка евклидова расстояния, что я не понимаю, почему он делает это в группах по 4?Почему бы не рассчитать все это сразу?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2011

Обычно такие вещи делаются для оптимизации SSE.Регистры SSE имеют длину 128 битов и могут содержать 4 числа с плавающей запятой, поэтому вы можете выполнять 4 вычитания, используя одну инструкцию параллельно.

Еще один плюс: проверять счетчик цикла нужно только после каждого четвертого различия.Это делает код быстрее, даже если компилятор не использует возможность генерировать код SSE.Например, VS2008 не сделал, даже с -O2:

      double t0 = d1[i] - d2[i];
00D91666  fld         dword ptr [edx-0Ch] 
00D91669  fsub        dword ptr [ecx-4] 
        double t1 = d1[i+1] - d2[i+1];
00D9166C  fld         dword ptr [ebx+ecx] 
00D9166F  fsub        dword ptr [ecx] 
        double t2 = d1[i+2] - d2[i+2];
00D91671  fld         dword ptr [edx-4] 
00D91674  fsub        dword ptr [ecx+4] 
        double t3 = d1[i+3] - d2[i+3];
00D91677  fld         dword ptr [edx] 
00D91679  fsub        dword ptr [ecx+8] 
        total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3;
00D9167C  fld         st(2) 
00D9167E  fmulp       st(3),st 
00D91680  fld         st(3) 
00D91682  fmulp       st(4),st 
00D91684  fxch        st(2) 
00D91686  faddp       st(3),st 
00D91688  fmul        st(0),st 
00D9168A  faddp       st(2),st 
00D9168C  fmul        st(0),st 
00D9168E  faddp       st(1),st 
00D91690  faddp       st(2),st 
1 голос
/ 08 февраля 2011

Я думаю, это потому, что для каждого субрегиона мы получаем 4 числа.Всего 4x4x4 субрегиона, составляющие 64 вектора длины.Таким образом, в основном получается разница между 2 субрегионами.

...