for( j = 0; j < len; j++ )
{
double a = h1[j] - h2[j];
- double b = h1[j] + h2[j];
- if( fabs(b) > FLT_EPSILON )
+ double b = h1[j];
+ if( fabs(b) > DBL_EPSILON )
result += a*a/b;
}
}
CV_Assert( H1.size(i) == H2.size(i) );
const SparseMat *PH1 = &H1, *PH2 = &H2;
- if( PH1->nzcount() > PH2->nzcount() )
+ if( PH1->nzcount() > PH2->nzcount() && method != CV_COMP_CHISQR )
std::swap(PH1, PH2);
SparseMatConstIterator it = PH1->begin();
float v1 = it.value<float>();
const SparseMat::Node* node = it.node();
float v2 = PH2->value<float>(node->idx, (size_t*)&node->hashval);
- if( !v2 )
- result += v1;
- else
- {
- double a = v1 - v2;
- double b = v1 + v2;
- if( b > FLT_EPSILON )
- result += a*a/b;
- }
- }
-
- it = PH2->begin();
- for( i = 0; i < N2; i++, ++it )
- {
- float v2 = it.value<float>();
- const SparseMat::Node* node = it.node();
- if( !PH1->find<float>(node->idx, (size_t*)&node->hashval) )
- result += v2;
+ double a = v1 - v2;
+ double b = v1;
+ if( fabs(b) > DBL_EPSILON )
+ result += a*a/b;
}
}
else if( method == CV_COMP_CORREL )
CvSparseMatIterator iterator;
CvSparseNode *node1, *node2;
- if( mat1->heap->active_count > mat2->heap->active_count )
+ if( mat1->heap->active_count > mat2->heap->active_count && method != CV_COMP_CHISQR )
{
CvSparseMat* t;
CV_SWAP( mat1, mat2, t );
{
double v1 = *(float*)CV_NODE_VAL(mat1,node1);
uchar* node2_data = cvPtrND( mat2, CV_NODE_IDX(mat1,node1), 0, 0, &node1->hashval );
- if( !node2_data )
- result += v1;
- else
- {
- double v2 = *(float*)node2_data;
- double a = v1 - v2;
- double b = v1 + v2;
- if( fabs(b) > DBL_EPSILON )
- result += a*a/b;
- }
- }
-
- for( node2 = cvInitSparseMatIterator( mat2, &iterator );
- node2 != 0; node2 = cvGetNextSparseNode( &iterator ))
- {
- double v2 = *(float*)CV_NODE_VAL(mat2,node2);
- if( !cvPtrND( mat1, CV_NODE_IDX(mat2,node2), 0, 0, &node2->hashval ))
- result += v2;
+ double v2 = node2_data ? *(float*)node2_data : 0.f;
+ double a = v1 - v2;
+ double b = v1;
+ if( fabs(b) > DBL_EPSILON )
+ result += a*a/b;
}
}
else if( method == CV_COMP_CORREL )
double v0 = ptr0[i], v1 = ptr1[i];
result0[CV_COMP_CORREL] += v0*v1;
result0[CV_COMP_INTERSECT] += MIN(v0,v1);
- if( fabs(v0 + v1) > DBL_EPSILON )
- result0[CV_COMP_CHISQR] += (v0 - v1)*(v0 - v1)/(v0 + v1);
+ if( fabs(v0) > DBL_EPSILON )
+ result0[CV_COMP_CHISQR] += (v0 - v1)*(v0 - v1)/v0;
s0 += v0;
s1 += v1;
sq0 += v0*v0;
const int* idx = CV_NODE_IDX(sparse0, node);
double v0 = *(float*)CV_NODE_VAL(sparse0, node);
double v1 = (float)cvGetRealND(sparse1, idx);
-
+
result0[CV_COMP_CORREL] += v0*v1;
result0[CV_COMP_INTERSECT] += MIN(v0,v1);
- if( fabs(v0 + v1) > DBL_EPSILON )
- result0[CV_COMP_CHISQR] += (v0 - v1)*(v0 - v1)/(v0 + v1);
+ if( fabs(v0) > DBL_EPSILON )
+ result0[CV_COMP_CHISQR] += (v0 - v1)*(v0 - v1)/v0;
s0 += v0;
sq0 += v0*v0;
result0[CV_COMP_BHATTACHARYYA] += sqrt(v0*v1);
for( node = cvInitSparseMatIterator( sparse1, &iterator );
node != 0; node = cvGetNextSparseNode( &iterator ) )
{
- const int* idx = CV_NODE_IDX(sparse1, node);
double v1 = *(float*)CV_NODE_VAL(sparse1, node);
- double v0 = (float)cvGetRealND(sparse0, idx);
-
- if( fabs(v0) < DBL_EPSILON )
- result0[CV_COMP_CHISQR] += v1;
s1 += v1;
sq1 += v1*v1;
}