Speedup of arcLength

By my tests, this version of cv::arcLength is almost 10% faster than the
one using a buffer it replaces.
This commit is contained in:
Matteo Piovanelli 2015-10-14 13:37:48 -07:00
parent 37ce3b8cfe
commit 216baf5b11

View File

@ -301,9 +301,7 @@ double cv::arcLength( InputArray _curve, bool is_closed )
CV_Assert( count >= 0 && (depth == CV_32F || depth == CV_32S));
double perimeter = 0;
int i, j = 0;
const int N = 16;
float buf[N];
int i;
if( count <= 1 )
return 0.;
@ -319,15 +317,8 @@ double cv::arcLength( InputArray _curve, bool is_closed )
{
Point2f p = is_float ? ptf[i] : Point2f((float)pti[i].x,(float)pti[i].y);
float dx = p.x - prev.x, dy = p.y - prev.y;
buf[j] = dx*dx + dy*dy;
perimeter += sqrtf(dx*dx + dy*dy);
if( ++j == N || i == count-1 )
{
Mat bufmat(1, j, CV_32F, buf);
sqrt(bufmat, bufmat);
for( ; j > 0; j-- )
perimeter += buf[j-1];
}
prev = p;
}