2011-02-07 8 views
0

を比較すると、SURFを使用するためのデモですOpenCVの find_obj.cppからである限り、私は理解していないものを、ユークリッド距離を確認し、それを伝えることができるようOpenCVのSURFスニペットをFolowingディスクリプタ

 

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のグループでそれをやっているのですか?一度に全部を計算してみませんか?

答えて

3

通常、このようなことはSSE最適化を可能にするために行われます。 SSEレジスタの長さは128ビットで、4つの浮動小数点数を含むことができるため、4つの減算を1つの命令で並列に実行できます。

もう1つのメリット:ループカウンタは、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

私はそれがそれぞれの小地域に対して4つの数字を得るからだと思います。 64ビットの長さのベクトルを作る完全に4x4x4の小領域。したがって、基本的に2つのサブリージョンの違いが得られます。

関連する問題