1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // Intel License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2000, Intel Corporation, all rights reserved. 14 // Third party copyrights are property of their respective owners. 15 // 16 // Redistribution and use in source and binary forms, with or without modification, 17 // are permitted provided that the following conditions are met: 18 // 19 // * Redistribution's of source code must retain the above copyright notice, 20 // this list of conditions and the following disclaimer. 21 // 22 // * Redistribution's in binary form must reproduce the above copyright notice, 23 // this list of conditions and the following disclaimer in the documentation 24 // and/or other materials provided with the distribution. 25 // 26 // * The name of Intel Corporation may not be used to endorse or promote products 27 // derived from this software without specific prior written permission. 28 // 29 // This software is provided by the copyright holders and contributors "as is" and 30 // any express or implied warranties, including, but not limited to, the implied 31 // warranties of merchantability and fitness for a particular purpose are disclaimed. 32 // In no event shall the Intel Corporation or contributors be liable for any direct, 33 // indirect, incidental, special, exemplary, or consequential damages 34 // (including, but not limited to, procurement of substitute goods or services; 35 // loss of use, data, or profits; or business interruption) however caused 36 // and on any theory of liability, whether in contract, strict liability, 37 // or tort (including negligence or otherwise) arising in any way out of 38 // the use of this software, even if advised of the possibility of such damage. 39 // 40 //M*/ 41 42 #include "_cxcore.h" 43 44 #ifdef HAVE_CONFIG_H 45 #include <cvconfig.h> 46 #endif 47 48 #define ICV_MATH_BLOCK_SIZE 256 49 50 #define _CV_SQRT_MAGIC 0xbe6f0000 51 52 #define _CV_SQRT_MAGIC_DBL CV_BIG_UINT(0xbfcd460000000000) 53 54 #define _CV_ATAN_CF0 (-15.8131890796f) 55 #define _CV_ATAN_CF1 (61.0941945596f) 56 #define _CV_ATAN_CF2 0.f /*(-0.140500406322f)*/ 57 58 static const float icvAtanTab[8] = { 0.f + _CV_ATAN_CF2, 90.f - _CV_ATAN_CF2, 59 180.f - _CV_ATAN_CF2, 90.f + _CV_ATAN_CF2, 60 360.f - _CV_ATAN_CF2, 270.f + _CV_ATAN_CF2, 61 180.f + _CV_ATAN_CF2, 270.f - _CV_ATAN_CF2 62 }; 63 64 static const int icvAtanSign[8] = 65 { 0, 0x80000000, 0x80000000, 0, 0x80000000, 0, 0, 0x80000000 }; 66 67 CV_IMPL float 68 cvFastArctan( float y, float x ) 69 { 70 Cv32suf _x, _y; 71 int ix, iy, ygx, idx; 72 double z; 73 74 _x.f = x; _y.f = y; 75 ix = _x.i; iy = _y.i; 76 idx = (ix < 0) * 2 + (iy < 0) * 4; 77 78 ix &= 0x7fffffff; 79 iy &= 0x7fffffff; 80 81 ygx = (iy <= ix) - 1; 82 idx -= ygx; 83 84 idx &= ((ix == 0) - 1) | ((iy == 0) - 1); 85 86 /* swap ix and iy if ix < iy */ 87 ix ^= iy & ygx; 88 iy ^= ix & ygx; 89 ix ^= iy & ygx; 90 91 _y.i = iy ^ icvAtanSign[idx]; 92 93 /* ix = ix != 0 ? ix : 1.f */ 94 _x.i = ((ix ^ CV_1F) & ((ix == 0) - 1)) ^ CV_1F; 95 96 z = _y.f / _x.f; 97 return (float)((_CV_ATAN_CF0*fabs(z) + _CV_ATAN_CF1)*z + icvAtanTab[idx]); 98 } 99 100 101 IPCVAPI_IMPL( CvStatus, icvFastArctan_32f, 102 (const float *__y, const float *__x, float *angle, int len ), (__y, __x, angle, len) ) 103 { 104 int i = 0; 105 const int *y = (const int*)__y, *x = (const int*)__x; 106 107 if( !(y && x && angle && len >= 0) ) 108 return CV_BADFACTOR_ERR; 109 110 /* unrolled by 4 loop */ 111 for( ; i <= len - 4; i += 4 ) 112 { 113 int j, idx[4]; 114 float xf[4], yf[4]; 115 double d = 1.; 116 117 /* calc numerators and denominators */ 118 for( j = 0; j < 4; j++ ) 119 { 120 int ix = x[i + j], iy = y[i + j]; 121 int ygx, k = (ix < 0) * 2 + (iy < 0) * 4; 122 Cv32suf _x, _y; 123 124 ix &= 0x7fffffff; 125 iy &= 0x7fffffff; 126 127 ygx = (iy <= ix) - 1; 128 k -= ygx; 129 130 k &= ((ix == 0) - 1) | ((iy == 0) - 1); 131 132 /* swap ix and iy if ix < iy */ 133 ix ^= iy & ygx; 134 iy ^= ix & ygx; 135 ix ^= iy & ygx; 136 137 _y.i = iy ^ icvAtanSign[k]; 138 139 /* ix = ix != 0 ? ix : 1.f */ 140 _x.i = ((ix ^ CV_1F) & ((ix == 0) - 1)) ^ CV_1F; 141 idx[j] = k; 142 yf[j] = _y.f; 143 d *= (xf[j] = _x.f); 144 } 145 146 d = 1. / d; 147 148 { 149 double b = xf[2] * xf[3], a = xf[0] * xf[1]; 150 151 float z0 = (float) (yf[0] * xf[1] * b * d); 152 float z1 = (float) (yf[1] * xf[0] * b * d); 153 float z2 = (float) (yf[2] * xf[3] * a * d); 154 float z3 = (float) (yf[3] * xf[2] * a * d); 155 156 z0 = (float)((_CV_ATAN_CF0*fabs(z0) + _CV_ATAN_CF1)*z0 + icvAtanTab[idx[0]]); 157 z1 = (float)((_CV_ATAN_CF0*fabs(z1) + _CV_ATAN_CF1)*z1 + icvAtanTab[idx[1]]); 158 z2 = (float)((_CV_ATAN_CF0*fabs(z2) + _CV_ATAN_CF1)*z2 + icvAtanTab[idx[2]]); 159 z3 = (float)((_CV_ATAN_CF0*fabs(z3) + _CV_ATAN_CF1)*z3 + icvAtanTab[idx[3]]); 160 161 angle[i] = z0; 162 angle[i+1] = z1; 163 angle[i+2] = z2; 164 angle[i+3] = z3; 165 } 166 } 167 168 /* process the rest */ 169 for( ; i < len; i++ ) 170 angle[i] = cvFastArctan( __y[i], __x[i] ); 171 172 return CV_OK; 173 } 174 175 176 /* ************************************************************************** *\ 177 Fast cube root by Ken Turkowski 178 (http://www.worldserver.com/turk/computergraphics/papers.html) 179 \* ************************************************************************** */ 180 CV_IMPL float cvCbrt( float value ) 181 { 182 float fr; 183 Cv32suf v, m; 184 int ix, s; 185 int ex, shx; 186 187 v.f = value; 188 ix = v.i & 0x7fffffff; 189 s = v.i & 0x80000000; 190 ex = (ix >> 23) - 127; 191 shx = ex % 3; 192 shx -= shx >= 0 ? 3 : 0; 193 ex = (ex - shx) / 3; /* exponent of cube root */ 194 v.i = (ix & ((1<<23)-1)) | ((shx + 127)<<23); 195 fr = v.f; 196 197 /* 0.125 <= fr < 1.0 */ 198 /* Use quartic rational polynomial with error < 2^(-24) */ 199 fr = (float)(((((45.2548339756803022511987494 * fr + 200 192.2798368355061050458134625) * fr + 201 119.1654824285581628956914143) * fr + 202 13.43250139086239872172837314) * fr + 203 0.1636161226585754240958355063)/ 204 ((((14.80884093219134573786480845 * fr + 205 151.9714051044435648658557668) * fr + 206 168.5254414101568283957668343) * fr + 207 33.9905941350215598754191872) * fr + 208 1.0)); 209 210 /* fr *= 2^ex * sign */ 211 m.f = value; 212 v.f = fr; 213 v.i = (v.i + (ex << 23) + s) & (m.i*2 != 0 ? -1 : 0); 214 return v.f; 215 } 216 217 //static const double _0_5 = 0.5, _1_5 = 1.5; 218 219 IPCVAPI_IMPL( CvStatus, icvInvSqrt_32f, (const float *src, float *dst, int len), (src, dst, len) ) 220 { 221 int i = 0; 222 223 if( !(src && dst && len >= 0) ) 224 return CV_BADFACTOR_ERR; 225 226 for( ; i < len; i++ ) 227 dst[i] = (float)(1.f/sqrt(src[i])); 228 229 return CV_OK; 230 } 231 232 233 IPCVAPI_IMPL( CvStatus, icvSqrt_32f, (const float *src, float *dst, int len), (src, dst, len) ) 234 { 235 int i = 0; 236 237 if( !(src && dst && len >= 0) ) 238 return CV_BADFACTOR_ERR; 239 240 for( ; i < len; i++ ) 241 dst[i] = (float)sqrt(src[i]); 242 243 return CV_OK; 244 } 245 246 247 IPCVAPI_IMPL( CvStatus, icvSqrt_64f, (const double *src, double *dst, int len), (src, dst, len) ) 248 { 249 int i = 0; 250 251 if( !(src && dst && len >= 0) ) 252 return CV_BADFACTOR_ERR; 253 254 for( ; i < len; i++ ) 255 dst[i] = sqrt(src[i]); 256 257 return CV_OK; 258 } 259 260 261 IPCVAPI_IMPL( CvStatus, icvInvSqrt_64f, (const double *src, double *dst, int len), (src, dst, len) ) 262 { 263 int i = 0; 264 265 if( !(src && dst && len >= 0) ) 266 return CV_BADFACTOR_ERR; 267 268 for( ; i < len; i++ ) 269 dst[i] = 1./sqrt(src[i]); 270 271 return CV_OK; 272 } 273 274 275 #define ICV_DEF_SQR_MAGNITUDE_FUNC(flavor, arrtype, magtype)\ 276 static CvStatus CV_STDCALL \ 277 icvSqrMagnitude_##flavor(const arrtype* x, const arrtype* y,\ 278 magtype* mag, int len) \ 279 { \ 280 int i; \ 281 \ 282 for( i = 0; i <= len - 4; i += 4 ) \ 283 { \ 284 magtype x0 = (magtype)x[i], y0 = (magtype)y[i]; \ 285 magtype x1 = (magtype)x[i+1], y1 = (magtype)y[i+1]; \ 286 \ 287 x0 = x0*x0 + y0*y0; \ 288 x1 = x1*x1 + y1*y1; \ 289 mag[i] = x0; \ 290 mag[i+1] = x1; \ 291 x0 = (magtype)x[i+2], y0 = (magtype)y[i+2]; \ 292 x1 = (magtype)x[i+3], y1 = (magtype)y[i+3]; \ 293 x0 = x0*x0 + y0*y0; \ 294 x1 = x1*x1 + y1*y1; \ 295 mag[i+2] = x0; \ 296 mag[i+3] = x1; \ 297 } \ 298 \ 299 for( ; i < len; i++ ) \ 300 { \ 301 magtype x0 = (magtype)x[i], y0 = (magtype)y[i]; \ 302 mag[i] = x0*x0 + y0*y0; \ 303 } \ 304 \ 305 return CV_OK; \ 306 } 307 308 309 ICV_DEF_SQR_MAGNITUDE_FUNC( 32f, float, float ) 310 ICV_DEF_SQR_MAGNITUDE_FUNC( 64f, double, double ) 311 312 /****************************************************************************************\ 313 * Cartezian -> Polar * 314 \****************************************************************************************/ 315 316 CV_IMPL void 317 cvCartToPolar( const CvArr* xarr, const CvArr* yarr, 318 CvArr* magarr, CvArr* anglearr, 319 int angle_in_degrees ) 320 { 321 CV_FUNCNAME( "cvCartToPolar" ); 322 323 __BEGIN__; 324 325 float* mag_buffer = 0; 326 float* x_buffer = 0; 327 float* y_buffer = 0; 328 int block_size = 0; 329 CvMat xstub, *xmat = (CvMat*)xarr; 330 CvMat ystub, *ymat = (CvMat*)yarr; 331 CvMat magstub, *mag = (CvMat*)magarr; 332 CvMat anglestub, *angle = (CvMat*)anglearr; 333 int coi1 = 0, coi2 = 0, coi3 = 0, coi4 = 0; 334 int depth; 335 CvSize size; 336 int x, y; 337 int cont_flag = CV_MAT_CONT_FLAG; 338 339 if( !CV_IS_MAT(xmat)) 340 CV_CALL( xmat = cvGetMat( xmat, &xstub, &coi1 )); 341 342 if( !CV_IS_MAT(ymat)) 343 CV_CALL( ymat = cvGetMat( ymat, &ystub, &coi2 )); 344 345 if( !CV_ARE_TYPES_EQ( xmat, ymat ) ) 346 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 347 348 if( !CV_ARE_SIZES_EQ( xmat, ymat ) ) 349 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 350 351 depth = CV_MAT_DEPTH( xmat->type ); 352 if( depth < CV_32F ) 353 CV_ERROR( CV_StsUnsupportedFormat, "" ); 354 355 if( mag ) 356 { 357 CV_CALL( mag = cvGetMat( mag, &magstub, &coi3 )); 358 359 if( !CV_ARE_TYPES_EQ( mag, xmat ) ) 360 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 361 362 if( !CV_ARE_SIZES_EQ( mag, xmat ) ) 363 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 364 cont_flag = mag->type; 365 } 366 367 if( angle ) 368 { 369 CV_CALL( angle = cvGetMat( angle, &anglestub, &coi4 )); 370 371 if( !CV_ARE_TYPES_EQ( angle, xmat ) ) 372 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 373 374 if( !CV_ARE_SIZES_EQ( angle, xmat ) ) 375 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 376 cont_flag &= angle->type; 377 } 378 379 if( coi1 != 0 || coi2 != 0 || coi3 != 0 || coi4 != 0 ) 380 CV_ERROR( CV_BadCOI, "" ); 381 382 size = cvGetMatSize(xmat); 383 size.width *= CV_MAT_CN(xmat->type); 384 385 if( CV_IS_MAT_CONT( xmat->type & ymat->type & cont_flag )) 386 { 387 size.width *= size.height; 388 size.height = 1; 389 } 390 391 block_size = MIN( size.width, ICV_MATH_BLOCK_SIZE ); 392 if( depth == CV_64F && angle ) 393 { 394 x_buffer = (float*)cvStackAlloc( block_size*sizeof(float)); 395 y_buffer = (float*)cvStackAlloc( block_size*sizeof(float)); 396 } 397 else if( depth == CV_32F && mag ) 398 { 399 mag_buffer = (float*)cvStackAlloc( block_size*sizeof(float)); 400 } 401 402 if( depth == CV_32F ) 403 { 404 for( y = 0; y < size.height; y++ ) 405 { 406 float* x_data = (float*)(xmat->data.ptr + xmat->step*y); 407 float* y_data = (float*)(ymat->data.ptr + ymat->step*y); 408 float* mag_data = mag ? (float*)(mag->data.ptr + mag->step*y) : 0; 409 float* angle_data = angle ? (float*)(angle->data.ptr + angle->step*y) : 0; 410 411 for( x = 0; x < size.width; x += block_size ) 412 { 413 int len = MIN( size.width - x, block_size ); 414 415 if( mag ) 416 icvSqrMagnitude_32f( x_data + x, y_data + x, mag_buffer, len ); 417 418 if( angle ) 419 { 420 icvFastArctan_32f( y_data + x, x_data + x, angle_data + x, len ); 421 if( !angle_in_degrees ) 422 icvScale_32f( angle_data + x, angle_data + x, 423 len, (float)(CV_PI/180.), 0 ); 424 } 425 426 if( mag ) 427 icvSqrt_32f( mag_buffer, mag_data + x, len ); 428 } 429 } 430 } 431 else 432 { 433 for( y = 0; y < size.height; y++ ) 434 { 435 double* x_data = (double*)(xmat->data.ptr + xmat->step*y); 436 double* y_data = (double*)(ymat->data.ptr + ymat->step*y); 437 double* mag_data = mag ? (double*)(mag->data.ptr + mag->step*y) : 0; 438 double* angle_data = angle ? (double*)(angle->data.ptr + angle->step*y) : 0; 439 440 for( x = 0; x < size.width; x += block_size ) 441 { 442 int len = MIN( size.width - x, block_size ); 443 444 if( angle ) 445 { 446 icvCvt_64f32f( x_data + x, x_buffer, len ); 447 icvCvt_64f32f( y_data + x, y_buffer, len ); 448 } 449 450 if( mag ) 451 { 452 icvSqrMagnitude_64f( x_data + x, y_data + x, mag_data + x, len ); 453 icvSqrt_64f( mag_data + x, mag_data + x, len ); 454 } 455 456 if( angle ) 457 { 458 icvFastArctan_32f( y_buffer, x_buffer, x_buffer, len ); 459 if( !angle_in_degrees ) 460 icvScale_32f( x_buffer, x_buffer, len, (float)(CV_PI/180.), 0 ); 461 icvCvt_32f64f( x_buffer, angle_data + x, len ); 462 } 463 } 464 } 465 } 466 467 __END__; 468 } 469 470 471 /****************************************************************************************\ 472 * Polar -> Cartezian * 473 \****************************************************************************************/ 474 475 static CvStatus CV_STDCALL 476 icvSinCos_32f( const float *angle,float *sinval, float* cosval, 477 int len, int angle_in_degrees ) 478 { 479 const int N = 64; 480 481 static const double sin_table[] = 482 { 483 0.00000000000000000000, 0.09801714032956060400, 484 0.19509032201612825000, 0.29028467725446233000, 485 0.38268343236508978000, 0.47139673682599764000, 486 0.55557023301960218000, 0.63439328416364549000, 487 0.70710678118654746000, 0.77301045336273699000, 488 0.83146961230254524000, 0.88192126434835494000, 489 0.92387953251128674000, 0.95694033573220894000, 490 0.98078528040323043000, 0.99518472667219682000, 491 1.00000000000000000000, 0.99518472667219693000, 492 0.98078528040323043000, 0.95694033573220894000, 493 0.92387953251128674000, 0.88192126434835505000, 494 0.83146961230254546000, 0.77301045336273710000, 495 0.70710678118654757000, 0.63439328416364549000, 496 0.55557023301960218000, 0.47139673682599786000, 497 0.38268343236508989000, 0.29028467725446239000, 498 0.19509032201612861000, 0.09801714032956082600, 499 0.00000000000000012246, -0.09801714032956059000, 500 -0.19509032201612836000, -0.29028467725446211000, 501 -0.38268343236508967000, -0.47139673682599764000, 502 -0.55557023301960196000, -0.63439328416364527000, 503 -0.70710678118654746000, -0.77301045336273666000, 504 -0.83146961230254524000, -0.88192126434835494000, 505 -0.92387953251128652000, -0.95694033573220882000, 506 -0.98078528040323032000, -0.99518472667219693000, 507 -1.00000000000000000000, -0.99518472667219693000, 508 -0.98078528040323043000, -0.95694033573220894000, 509 -0.92387953251128663000, -0.88192126434835505000, 510 -0.83146961230254546000, -0.77301045336273688000, 511 -0.70710678118654768000, -0.63439328416364593000, 512 -0.55557023301960218000, -0.47139673682599792000, 513 -0.38268343236509039000, -0.29028467725446250000, 514 -0.19509032201612872000, -0.09801714032956050600, 515 }; 516 517 static const double k2 = (2*CV_PI)/N; 518 519 static const double sin_a0 = -0.166630293345647*k2*k2*k2; 520 static const double sin_a2 = k2; 521 522 static const double cos_a0 = -0.499818138450326*k2*k2; 523 /*static const double cos_a2 = 1;*/ 524 525 double k1; 526 int i; 527 528 if( !angle_in_degrees ) 529 k1 = N/(2*CV_PI); 530 else 531 k1 = N/360.; 532 533 for( i = 0; i < len; i++ ) 534 { 535 double t = angle[i]*k1; 536 int it = cvRound(t); 537 t -= it; 538 int sin_idx = it & (N - 1); 539 int cos_idx = (N/4 - sin_idx) & (N - 1); 540 541 double sin_b = (sin_a0*t*t + sin_a2)*t; 542 double cos_b = cos_a0*t*t + 1; 543 544 double sin_a = sin_table[sin_idx]; 545 double cos_a = sin_table[cos_idx]; 546 547 double sin_val = sin_a*cos_b + cos_a*sin_b; 548 double cos_val = cos_a*cos_b - sin_a*sin_b; 549 550 sinval[i] = (float)sin_val; 551 cosval[i] = (float)cos_val; 552 } 553 554 return CV_OK; 555 } 556 557 558 CV_IMPL void 559 cvPolarToCart( const CvArr* magarr, const CvArr* anglearr, 560 CvArr* xarr, CvArr* yarr, int angle_in_degrees ) 561 { 562 CV_FUNCNAME( "cvPolarToCart" ); 563 564 __BEGIN__; 565 566 float* x_buffer = 0; 567 float* y_buffer = 0; 568 int block_size = 0; 569 CvMat xstub, *xmat = (CvMat*)xarr; 570 CvMat ystub, *ymat = (CvMat*)yarr; 571 CvMat magstub, *mag = (CvMat*)magarr; 572 CvMat anglestub, *angle = (CvMat*)anglearr; 573 int coi1 = 0, coi2 = 0, coi3 = 0, coi4 = 0; 574 int depth; 575 CvSize size; 576 int x, y; 577 int cont_flag; 578 579 if( !CV_IS_MAT(angle)) 580 CV_CALL( angle = cvGetMat( angle, &anglestub, &coi4 )); 581 582 depth = CV_MAT_DEPTH( angle->type ); 583 if( depth < CV_32F ) 584 CV_ERROR( CV_StsUnsupportedFormat, "" ); 585 cont_flag = angle->type; 586 587 if( mag ) 588 { 589 if( !CV_IS_MAT(mag)) 590 CV_CALL( mag = cvGetMat( mag, &magstub, &coi3 )); 591 592 if( !CV_ARE_TYPES_EQ( angle, mag ) ) 593 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 594 595 if( !CV_ARE_SIZES_EQ( angle, mag ) ) 596 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 597 598 cont_flag &= mag->type; 599 } 600 601 if( xmat ) 602 { 603 if( !CV_IS_MAT(xmat)) 604 CV_CALL( xmat = cvGetMat( xmat, &xstub, &coi1 )); 605 606 if( !CV_ARE_TYPES_EQ( angle, xmat ) ) 607 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 608 609 if( !CV_ARE_SIZES_EQ( angle, xmat ) ) 610 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 611 612 cont_flag &= xmat->type; 613 } 614 615 if( ymat ) 616 { 617 if( !CV_IS_MAT(ymat)) 618 CV_CALL( ymat = cvGetMat( ymat, &ystub, &coi2 )); 619 620 if( !CV_ARE_TYPES_EQ( angle, ymat ) ) 621 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 622 623 if( !CV_ARE_SIZES_EQ( angle, ymat ) ) 624 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 625 626 cont_flag &= ymat->type; 627 } 628 629 if( coi1 != 0 || coi2 != 0 || coi3 != 0 || coi4 != 0 ) 630 CV_ERROR( CV_BadCOI, "" ); 631 632 size = cvGetMatSize(angle); 633 size.width *= CV_MAT_CN(angle->type); 634 635 if( CV_IS_MAT_CONT( cont_flag )) 636 { 637 size.width *= size.height; 638 size.height = 1; 639 } 640 641 block_size = MIN( size.width, ICV_MATH_BLOCK_SIZE ); 642 x_buffer = (float*)cvStackAlloc( block_size*sizeof(float)); 643 y_buffer = (float*)cvStackAlloc( block_size*sizeof(float)); 644 645 if( depth == CV_32F ) 646 { 647 for( y = 0; y < size.height; y++ ) 648 { 649 float* x_data = (float*)(xmat ? xmat->data.ptr + xmat->step*y : 0); 650 float* y_data = (float*)(ymat ? ymat->data.ptr + ymat->step*y : 0); 651 float* mag_data = (float*)(mag ? mag->data.ptr + mag->step*y : 0); 652 float* angle_data = (float*)(angle->data.ptr + angle->step*y); 653 654 for( x = 0; x < size.width; x += block_size ) 655 { 656 int i, len = MIN( size.width - x, block_size ); 657 658 icvSinCos_32f( angle_data+x, y_buffer, x_buffer, len, angle_in_degrees ); 659 660 for( i = 0; i < len; i++ ) 661 { 662 float tx = x_buffer[i]; 663 float ty = y_buffer[i]; 664 665 if( mag_data ) 666 { 667 float magval = mag_data[x+i]; 668 tx *= magval; 669 ty *= magval; 670 } 671 672 if( xmat ) 673 x_data[x+i] = tx; 674 if( ymat ) 675 y_data[x+i] = ty; 676 } 677 } 678 } 679 } 680 else 681 { 682 for( y = 0; y < size.height; y++ ) 683 { 684 double* x_data = (double*)(xmat ? xmat->data.ptr + xmat->step*y : 0); 685 double* y_data = (double*)(ymat ? ymat->data.ptr + ymat->step*y : 0); 686 double* mag_data = (double*)(mag ? mag->data.ptr + mag->step*y : 0); 687 double* angle_data = (double*)(angle->data.ptr + angle->step*y); 688 double C = angle_in_degrees ? CV_PI/180. : 1; 689 690 for( x = 0; x < size.width; x++ ) 691 { 692 double phi = angle_data[x]*C; 693 double magval = mag_data ? mag_data[x] : 1.; 694 if( xmat ) 695 x_data[x] = cos(phi)*magval; 696 if( ymat ) 697 y_data[x] = sin(phi)*magval; 698 } 699 } 700 } 701 702 __END__; 703 } 704 705 /****************************************************************************************\ 706 * E X P * 707 \****************************************************************************************/ 708 709 typedef union 710 { 711 struct { 712 #if ( defined( WORDS_BIGENDIAN ) && !defined( OPENCV_UNIVERSAL_BUILD ) ) || defined( __BIG_ENDIAN__ ) 713 int hi; 714 int lo; 715 #else 716 int lo; 717 int hi; 718 #endif 719 } i; 720 double d; 721 } 722 DBLINT; 723 724 #define EXPTAB_SCALE 6 725 #define EXPTAB_MASK ((1 << EXPTAB_SCALE) - 1) 726 727 #define EXPPOLY_32F_A0 .9670371139572337719125840413672004409288e-2 728 729 static const double icvExpTab[] = { 730 1.0 * EXPPOLY_32F_A0, 731 1.0108892860517004600204097905619 * EXPPOLY_32F_A0, 732 1.0218971486541166782344801347833 * EXPPOLY_32F_A0, 733 1.0330248790212284225001082839705 * EXPPOLY_32F_A0, 734 1.0442737824274138403219664787399 * EXPPOLY_32F_A0, 735 1.0556451783605571588083413251529 * EXPPOLY_32F_A0, 736 1.0671404006768236181695211209928 * EXPPOLY_32F_A0, 737 1.0787607977571197937406800374385 * EXPPOLY_32F_A0, 738 1.0905077326652576592070106557607 * EXPPOLY_32F_A0, 739 1.1023825833078409435564142094256 * EXPPOLY_32F_A0, 740 1.1143867425958925363088129569196 * EXPPOLY_32F_A0, 741 1.126521618608241899794798643787 * EXPPOLY_32F_A0, 742 1.1387886347566916537038302838415 * EXPPOLY_32F_A0, 743 1.151189229952982705817759635202 * EXPPOLY_32F_A0, 744 1.1637248587775775138135735990922 * EXPPOLY_32F_A0, 745 1.1763969916502812762846457284838 * EXPPOLY_32F_A0, 746 1.1892071150027210667174999705605 * EXPPOLY_32F_A0, 747 1.2021567314527031420963969574978 * EXPPOLY_32F_A0, 748 1.2152473599804688781165202513388 * EXPPOLY_32F_A0, 749 1.2284805361068700056940089577928 * EXPPOLY_32F_A0, 750 1.2418578120734840485936774687266 * EXPPOLY_32F_A0, 751 1.2553807570246910895793906574423 * EXPPOLY_32F_A0, 752 1.2690509571917332225544190810323 * EXPPOLY_32F_A0, 753 1.2828700160787782807266697810215 * EXPPOLY_32F_A0, 754 1.2968395546510096659337541177925 * EXPPOLY_32F_A0, 755 1.3109612115247643419229917863308 * EXPPOLY_32F_A0, 756 1.3252366431597412946295370954987 * EXPPOLY_32F_A0, 757 1.3396675240533030053600306697244 * EXPPOLY_32F_A0, 758 1.3542555469368927282980147401407 * EXPPOLY_32F_A0, 759 1.3690024229745906119296011329822 * EXPPOLY_32F_A0, 760 1.3839098819638319548726595272652 * EXPPOLY_32F_A0, 761 1.3989796725383111402095281367152 * EXPPOLY_32F_A0, 762 1.4142135623730950488016887242097 * EXPPOLY_32F_A0, 763 1.4296133383919700112350657782751 * EXPPOLY_32F_A0, 764 1.4451808069770466200370062414717 * EXPPOLY_32F_A0, 765 1.4609177941806469886513028903106 * EXPPOLY_32F_A0, 766 1.476826145939499311386907480374 * EXPPOLY_32F_A0, 767 1.4929077282912648492006435314867 * EXPPOLY_32F_A0, 768 1.5091644275934227397660195510332 * EXPPOLY_32F_A0, 769 1.5255981507445383068512536895169 * EXPPOLY_32F_A0, 770 1.5422108254079408236122918620907 * EXPPOLY_32F_A0, 771 1.5590044002378369670337280894749 * EXPPOLY_32F_A0, 772 1.5759808451078864864552701601819 * EXPPOLY_32F_A0, 773 1.5931421513422668979372486431191 * EXPPOLY_32F_A0, 774 1.6104903319492543081795206673574 * EXPPOLY_32F_A0, 775 1.628027421857347766848218522014 * EXPPOLY_32F_A0, 776 1.6457554781539648445187567247258 * EXPPOLY_32F_A0, 777 1.6636765803267364350463364569764 * EXPPOLY_32F_A0, 778 1.6817928305074290860622509524664 * EXPPOLY_32F_A0, 779 1.7001063537185234695013625734975 * EXPPOLY_32F_A0, 780 1.7186192981224779156293443764563 * EXPPOLY_32F_A0, 781 1.7373338352737062489942020818722 * EXPPOLY_32F_A0, 782 1.7562521603732994831121606193753 * EXPPOLY_32F_A0, 783 1.7753764925265212525505592001993 * EXPPOLY_32F_A0, 784 1.7947090750031071864277032421278 * EXPPOLY_32F_A0, 785 1.8142521755003987562498346003623 * EXPPOLY_32F_A0, 786 1.8340080864093424634870831895883 * EXPPOLY_32F_A0, 787 1.8539791250833855683924530703377 * EXPPOLY_32F_A0, 788 1.8741676341102999013299989499544 * EXPPOLY_32F_A0, 789 1.8945759815869656413402186534269 * EXPPOLY_32F_A0, 790 1.9152065613971472938726112702958 * EXPPOLY_32F_A0, 791 1.9360617934922944505980559045667 * EXPPOLY_32F_A0, 792 1.9571441241754002690183222516269 * EXPPOLY_32F_A0, 793 1.9784560263879509682582499181312 * EXPPOLY_32F_A0, 794 }; 795 796 static const double exp_prescale = 1.4426950408889634073599246810019 * (1 << EXPTAB_SCALE); 797 static const double exp_postscale = 1./(1 << EXPTAB_SCALE); 798 static const double exp_max_val = 3000.*(1 << EXPTAB_SCALE); // log10(DBL_MAX) < 3000 799 800 IPCVAPI_IMPL( CvStatus, icvExp_32f, ( const float *_x, float *y, int n ), (_x, y, n) ) 801 { 802 static const double 803 EXPPOLY_32F_A4 = 1.000000000000002438532970795181890933776 / EXPPOLY_32F_A0, 804 EXPPOLY_32F_A3 = .6931471805521448196800669615864773144641 / EXPPOLY_32F_A0, 805 EXPPOLY_32F_A2 = .2402265109513301490103372422686535526573 / EXPPOLY_32F_A0, 806 EXPPOLY_32F_A1 = .5550339366753125211915322047004666939128e-1 / EXPPOLY_32F_A0; 807 808 #undef EXPPOLY 809 #define EXPPOLY(x) \ 810 (((((x) + EXPPOLY_32F_A1)*(x) + EXPPOLY_32F_A2)*(x) + EXPPOLY_32F_A3)*(x) + EXPPOLY_32F_A4) 811 812 int i = 0; 813 DBLINT buf[4]; 814 const Cv32suf* x = (const Cv32suf*)_x; 815 816 if( !x || !y ) 817 return CV_NULLPTR_ERR; 818 if( n <= 0 ) 819 return CV_BADSIZE_ERR; 820 821 buf[0].i.lo = buf[1].i.lo = buf[2].i.lo = buf[3].i.lo = 0; 822 823 for( ; i <= n - 4; i += 4 ) 824 { 825 double x0 = x[i].f * exp_prescale; 826 double x1 = x[i + 1].f * exp_prescale; 827 double x2 = x[i + 2].f * exp_prescale; 828 double x3 = x[i + 3].f * exp_prescale; 829 int val0, val1, val2, val3, t; 830 831 if( ((x[i].i >> 23) & 255) > 127 + 10 ) 832 x0 = x[i].i < 0 ? -exp_max_val : exp_max_val; 833 834 if( ((x[i+1].i >> 23) & 255) > 127 + 10 ) 835 x1 = x[i+1].i < 0 ? -exp_max_val : exp_max_val; 836 837 if( ((x[i+2].i >> 23) & 255) > 127 + 10 ) 838 x2 = x[i+2].i < 0 ? -exp_max_val : exp_max_val; 839 840 if( ((x[i+3].i >> 23) & 255) > 127 + 10 ) 841 x3 = x[i+3].i < 0 ? -exp_max_val : exp_max_val; 842 843 val0 = cvRound(x0); 844 val1 = cvRound(x1); 845 val2 = cvRound(x2); 846 val3 = cvRound(x3); 847 848 x0 = (x0 - val0)*exp_postscale; 849 x1 = (x1 - val1)*exp_postscale; 850 x2 = (x2 - val2)*exp_postscale; 851 x3 = (x3 - val3)*exp_postscale; 852 853 t = (val0 >> EXPTAB_SCALE) + 1023; 854 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 855 buf[0].i.hi = t << 20; 856 857 t = (val1 >> EXPTAB_SCALE) + 1023; 858 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 859 buf[1].i.hi = t << 20; 860 861 t = (val2 >> EXPTAB_SCALE) + 1023; 862 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 863 buf[2].i.hi = t << 20; 864 865 t = (val3 >> EXPTAB_SCALE) + 1023; 866 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 867 buf[3].i.hi = t << 20; 868 869 x0 = buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY( x0 ); 870 x1 = buf[1].d * icvExpTab[val1 & EXPTAB_MASK] * EXPPOLY( x1 ); 871 872 y[i] = (float)x0; 873 y[i + 1] = (float)x1; 874 875 x2 = buf[2].d * icvExpTab[val2 & EXPTAB_MASK] * EXPPOLY( x2 ); 876 x3 = buf[3].d * icvExpTab[val3 & EXPTAB_MASK] * EXPPOLY( x3 ); 877 878 y[i + 2] = (float)x2; 879 y[i + 3] = (float)x3; 880 } 881 882 for( ; i < n; i++ ) 883 { 884 double x0 = x[i].f * exp_prescale; 885 int val0, t; 886 887 if( ((x[i].i >> 23) & 255) > 127 + 10 ) 888 x0 = x[i].i < 0 ? -exp_max_val : exp_max_val; 889 890 val0 = cvRound(x0); 891 t = (val0 >> EXPTAB_SCALE) + 1023; 892 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 893 894 buf[0].i.hi = t << 20; 895 x0 = (x0 - val0)*exp_postscale; 896 897 y[i] = (float)(buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY(x0)); 898 } 899 900 return CV_OK; 901 } 902 903 904 IPCVAPI_IMPL( CvStatus, icvExp_64f, ( const double *_x, double *y, int n ), (_x, y, n) ) 905 { 906 static const double 907 A5 = .99999999999999999998285227504999 / EXPPOLY_32F_A0, 908 A4 = .69314718055994546743029643825322 / EXPPOLY_32F_A0, 909 A3 = .24022650695886477918181338054308 / EXPPOLY_32F_A0, 910 A2 = .55504108793649567998466049042729e-1 / EXPPOLY_32F_A0, 911 A1 = .96180973140732918010002372686186e-2 / EXPPOLY_32F_A0, 912 A0 = .13369713757180123244806654839424e-2 / EXPPOLY_32F_A0; 913 914 #undef EXPPOLY 915 #define EXPPOLY(x) (((((A0*(x) + A1)*(x) + A2)*(x) + A3)*(x) + A4)*(x) + A5) 916 917 int i = 0; 918 DBLINT buf[4]; 919 const Cv64suf* x = (const Cv64suf*)_x; 920 921 if( !x || !y ) 922 return CV_NULLPTR_ERR; 923 if( n <= 0 ) 924 return CV_BADSIZE_ERR; 925 926 buf[0].i.lo = buf[1].i.lo = buf[2].i.lo = buf[3].i.lo = 0; 927 928 for( ; i <= n - 4; i += 4 ) 929 { 930 double x0 = x[i].f * exp_prescale; 931 double x1 = x[i + 1].f * exp_prescale; 932 double x2 = x[i + 2].f * exp_prescale; 933 double x3 = x[i + 3].f * exp_prescale; 934 935 double y0, y1, y2, y3; 936 int val0, val1, val2, val3, t; 937 938 t = (int)(x[i].i >> 52); 939 if( (t & 2047) > 1023 + 10 ) 940 x0 = t < 0 ? -exp_max_val : exp_max_val; 941 942 t = (int)(x[i+1].i >> 52); 943 if( (t & 2047) > 1023 + 10 ) 944 x1 = t < 0 ? -exp_max_val : exp_max_val; 945 946 t = (int)(x[i+2].i >> 52); 947 if( (t & 2047) > 1023 + 10 ) 948 x2 = t < 0 ? -exp_max_val : exp_max_val; 949 950 t = (int)(x[i+3].i >> 52); 951 if( (t & 2047) > 1023 + 10 ) 952 x3 = t < 0 ? -exp_max_val : exp_max_val; 953 954 val0 = cvRound(x0); 955 val1 = cvRound(x1); 956 val2 = cvRound(x2); 957 val3 = cvRound(x3); 958 959 x0 = (x0 - val0)*exp_postscale; 960 x1 = (x1 - val1)*exp_postscale; 961 x2 = (x2 - val2)*exp_postscale; 962 x3 = (x3 - val3)*exp_postscale; 963 964 t = (val0 >> EXPTAB_SCALE) + 1023; 965 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 966 buf[0].i.hi = t << 20; 967 968 t = (val1 >> EXPTAB_SCALE) + 1023; 969 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 970 buf[1].i.hi = t << 20; 971 972 t = (val2 >> EXPTAB_SCALE) + 1023; 973 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 974 buf[2].i.hi = t << 20; 975 976 t = (val3 >> EXPTAB_SCALE) + 1023; 977 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 978 buf[3].i.hi = t << 20; 979 980 y0 = buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY( x0 ); 981 y1 = buf[1].d * icvExpTab[val1 & EXPTAB_MASK] * EXPPOLY( x1 ); 982 983 y[i] = y0; 984 y[i + 1] = y1; 985 986 y2 = buf[2].d * icvExpTab[val2 & EXPTAB_MASK] * EXPPOLY( x2 ); 987 y3 = buf[3].d * icvExpTab[val3 & EXPTAB_MASK] * EXPPOLY( x3 ); 988 989 y[i + 2] = y2; 990 y[i + 3] = y3; 991 } 992 993 for( ; i < n; i++ ) 994 { 995 double x0 = x[i].f * exp_prescale; 996 int val0, t; 997 998 t = (int)(x[i].i >> 52); 999 if( (t & 2047) > 1023 + 10 ) 1000 x0 = t < 0 ? -exp_max_val : exp_max_val; 1001 1002 val0 = cvRound(x0); 1003 t = (val0 >> EXPTAB_SCALE) + 1023; 1004 t = (t | ((t < 2047) - 1)) & (((t < 0) - 1) & 2047); 1005 1006 buf[0].i.hi = t << 20; 1007 x0 = (x0 - val0)*exp_postscale; 1008 1009 y[i] = buf[0].d * icvExpTab[val0 & EXPTAB_MASK] * EXPPOLY( x0 ); 1010 } 1011 1012 return CV_OK; 1013 } 1014 1015 #undef EXPTAB_SCALE 1016 #undef EXPTAB_MASK 1017 #undef EXPPOLY_32F_A0 1018 1019 CV_IMPL void cvExp( const CvArr* srcarr, CvArr* dstarr ) 1020 { 1021 CV_FUNCNAME( "cvExp" ); 1022 1023 __BEGIN__; 1024 1025 CvMat srcstub, *src = (CvMat*)srcarr; 1026 CvMat dststub, *dst = (CvMat*)dstarr; 1027 int coi1 = 0, coi2 = 0, src_depth, dst_depth; 1028 double* buffer = 0; 1029 CvSize size; 1030 int x, y, dx = 0; 1031 1032 if( !CV_IS_MAT(src)) 1033 CV_CALL( src = cvGetMat( src, &srcstub, &coi1 )); 1034 1035 if( !CV_IS_MAT(dst)) 1036 CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 )); 1037 1038 if( coi1 != 0 || coi2 != 0 ) 1039 CV_ERROR( CV_BadCOI, "" ); 1040 1041 src_depth = CV_MAT_DEPTH(src->type); 1042 dst_depth = CV_MAT_DEPTH(dst->type); 1043 1044 if( !CV_ARE_CNS_EQ( src, dst ) || src_depth < CV_32F || dst_depth < src_depth ) 1045 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 1046 1047 if( !CV_ARE_SIZES_EQ( src, dst ) ) 1048 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 1049 1050 size = cvGetMatSize(src); 1051 size.width *= CV_MAT_CN(src->type); 1052 1053 if( CV_IS_MAT_CONT( src->type & dst->type )) 1054 { 1055 size.width *= size.height; 1056 size.height = 1; 1057 } 1058 1059 if( !CV_ARE_DEPTHS_EQ( src, dst )) 1060 { 1061 dx = MIN( 1024, size.width ); 1062 buffer = (double*)cvStackAlloc( dx*sizeof(buffer[0]) ); 1063 } 1064 1065 for( y = 0; y < size.height; y++ ) 1066 { 1067 uchar* src_data = src->data.ptr + src->step*y; 1068 uchar* dst_data = dst->data.ptr + dst->step*y; 1069 1070 if( src_depth == CV_64F ) 1071 { 1072 icvExp_64f( (double*)src_data, (double*)dst_data, size.width ); 1073 } 1074 else if( src_depth == dst_depth ) 1075 { 1076 icvExp_32f( (float*)src_data, (float*)dst_data, size.width ); 1077 } 1078 else 1079 { 1080 for( x = 0; x < size.width; x += dx ) 1081 { 1082 int len = dx; 1083 if( x + len > size.width ) 1084 len = size.width - x; 1085 icvCvt_32f64f( (float*)src_data + x, buffer, len ); 1086 icvExp_64f( buffer, (double*)dst_data + x, len ); 1087 } 1088 } 1089 } 1090 1091 __END__; 1092 } 1093 1094 1095 /****************************************************************************************\ 1096 * L O G * 1097 \****************************************************************************************/ 1098 1099 #define LOGTAB_SCALE 8 1100 #define LOGTAB_MASK ((1 << LOGTAB_SCALE) - 1) 1101 #define LOGTAB_MASK2 ((1 << (20 - LOGTAB_SCALE)) - 1) 1102 #define LOGTAB_MASK2_32F ((1 << (23 - LOGTAB_SCALE)) - 1) 1103 1104 static const double icvLogTab[] = { 1105 0.0000000000000000000000000000000000000000, 1.000000000000000000000000000000000000000, 1106 .00389864041565732288852075271279318258166, .9961089494163424124513618677042801556420, 1107 .00778214044205494809292034119607706088573, .9922480620155038759689922480620155038760, 1108 .01165061721997527263705585198749759001657, .9884169884169884169884169884169884169884, 1109 .01550418653596525274396267235488267033361, .9846153846153846153846153846153846153846, 1110 .01934296284313093139406447562578250654042, .9808429118773946360153256704980842911877, 1111 .02316705928153437593630670221500622574241, .9770992366412213740458015267175572519084, 1112 .02697658769820207233514075539915211265906, .9733840304182509505703422053231939163498, 1113 .03077165866675368732785500469617545604706, .9696969696969696969696969696969696969697, 1114 .03455238150665972812758397481047722976656, .9660377358490566037735849056603773584906, 1115 .03831886430213659461285757856785494368522, .9624060150375939849624060150375939849624, 1116 .04207121392068705056921373852674150839447, .9588014981273408239700374531835205992509, 1117 .04580953603129420126371940114040626212953, .9552238805970149253731343283582089552239, 1118 .04953393512227662748292900118940451648088, .9516728624535315985130111524163568773234, 1119 .05324451451881227759255210685296333394944, .9481481481481481481481481481481481481481, 1120 .05694137640013842427411105973078520037234, .9446494464944649446494464944649446494465, 1121 .06062462181643483993820353816772694699466, .9411764705882352941176470588235294117647, 1122 .06429435070539725460836422143984236754475, .9377289377289377289377289377289377289377, 1123 .06795066190850773679699159401934593915938, .9343065693430656934306569343065693430657, 1124 .07159365318700880442825962290953611955044, .9309090909090909090909090909090909090909, 1125 .07522342123758751775142172846244648098944, .9275362318840579710144927536231884057971, 1126 .07884006170777602129362549021607264876369, .9241877256317689530685920577617328519856, 1127 .08244366921107458556772229485432035289706, .9208633093525179856115107913669064748201, 1128 .08603433734180314373940490213499288074675, .9175627240143369175627240143369175627240, 1129 .08961215868968712416897659522874164395031, .9142857142857142857142857142857142857143, 1130 .09317722485418328259854092721070628613231, .9110320284697508896797153024911032028470, 1131 .09672962645855109897752299730200320482256, .9078014184397163120567375886524822695035, 1132 .10026945316367513738597949668474029749630, .9045936395759717314487632508833922261484, 1133 .10379679368164355934833764649738441221420, .9014084507042253521126760563380281690141, 1134 .10731173578908805021914218968959175981580, .8982456140350877192982456140350877192982, 1135 .11081436634029011301105782649756292812530, .8951048951048951048951048951048951048951, 1136 .11430477128005862852422325204315711744130, .8919860627177700348432055749128919860627, 1137 .11778303565638344185817487641543266363440, .8888888888888888888888888888888888888889, 1138 .12124924363286967987640707633545389398930, .8858131487889273356401384083044982698962, 1139 .12470347850095722663787967121606925502420, .8827586206896551724137931034482758620690, 1140 .12814582269193003360996385708858724683530, .8797250859106529209621993127147766323024, 1141 .13157635778871926146571524895989568904040, .8767123287671232876712328767123287671233, 1142 .13499516453750481925766280255629681050780, .8737201365187713310580204778156996587031, 1143 .13840232285911913123754857224412262439730, .8707482993197278911564625850340136054422, 1144 .14179791186025733629172407290752744302150, .8677966101694915254237288135593220338983, 1145 .14518200984449788903951628071808954700830, .8648648648648648648648648648648648648649, 1146 .14855469432313711530824207329715136438610, .8619528619528619528619528619528619528620, 1147 .15191604202584196858794030049466527998450, .8590604026845637583892617449664429530201, 1148 .15526612891112392955683674244937719777230, .8561872909698996655518394648829431438127, 1149 .15860503017663857283636730244325008243330, .8533333333333333333333333333333333333333, 1150 .16193282026931324346641360989451641216880, .8504983388704318936877076411960132890365, 1151 .16524957289530714521497145597095368430010, .8476821192052980132450331125827814569536, 1152 .16855536102980664403538924034364754334090, .8448844884488448844884488448844884488449, 1153 .17185025692665920060697715143760433420540, .8421052631578947368421052631578947368421, 1154 .17513433212784912385018287750426679849630, .8393442622950819672131147540983606557377, 1155 .17840765747281828179637841458315961062910, .8366013071895424836601307189542483660131, 1156 .18167030310763465639212199675966985523700, .8338762214983713355048859934853420195440, 1157 .18492233849401198964024217730184318497780, .8311688311688311688311688311688311688312, 1158 .18816383241818296356839823602058459073300, .8284789644012944983818770226537216828479, 1159 .19139485299962943898322009772527962923050, .8258064516129032258064516129032258064516, 1160 .19461546769967164038916962454095482826240, .8231511254019292604501607717041800643087, 1161 .19782574332991986754137769821682013571260, .8205128205128205128205128205128205128205, 1162 .20102574606059073203390141770796617493040, .8178913738019169329073482428115015974441, 1163 .20421554142869088876999228432396193966280, .8152866242038216560509554140127388535032, 1164 .20739519434607056602715147164417430758480, .8126984126984126984126984126984126984127, 1165 .21056476910734961416338251183333341032260, .8101265822784810126582278481012658227848, 1166 .21372432939771812687723695489694364368910, .8075709779179810725552050473186119873817, 1167 .21687393830061435506806333251006435602900, .8050314465408805031446540880503144654088, 1168 .22001365830528207823135744547471404075630, .8025078369905956112852664576802507836991, 1169 .22314355131420973710199007200571941211830, .8000000000000000000000000000000000000000, 1170 .22626367865045338145790765338460914790630, .7975077881619937694704049844236760124611, 1171 .22937410106484582006380890106811420992010, .7950310559006211180124223602484472049689, 1172 .23247487874309405442296849741978803649550, .7925696594427244582043343653250773993808, 1173 .23556607131276688371634975283086532726890, .7901234567901234567901234567901234567901, 1174 .23864773785017498464178231643018079921600, .7876923076923076923076923076923076923077, 1175 .24171993688714515924331749374687206000090, .7852760736196319018404907975460122699387, 1176 .24478272641769091566565919038112042471760, .7828746177370030581039755351681957186544, 1177 .24783616390458124145723672882013488560910, .7804878048780487804878048780487804878049, 1178 .25088030628580937353433455427875742316250, .7781155015197568389057750759878419452888, 1179 .25391520998096339667426946107298135757450, .7757575757575757575757575757575757575758, 1180 .25694093089750041913887912414793390780680, .7734138972809667673716012084592145015106, 1181 .25995752443692604627401010475296061486000, .7710843373493975903614457831325301204819, 1182 .26296504550088134477547896494797896593800, .7687687687687687687687687687687687687688, 1183 .26596354849713793599974565040611196309330, .7664670658682634730538922155688622754491, 1184 .26895308734550393836570947314612567424780, .7641791044776119402985074626865671641791, 1185 .27193371548364175804834985683555714786050, .7619047619047619047619047619047619047619, 1186 .27490548587279922676529508862586226314300, .7596439169139465875370919881305637982196, 1187 .27786845100345625159121709657483734190480, .7573964497041420118343195266272189349112, 1188 .28082266290088775395616949026589281857030, .7551622418879056047197640117994100294985, 1189 .28376817313064456316240580235898960381750, .7529411764705882352941176470588235294118, 1190 .28670503280395426282112225635501090437180, .7507331378299120234604105571847507331378, 1191 .28963329258304265634293983566749375313530, .7485380116959064327485380116959064327485, 1192 .29255300268637740579436012922087684273730, .7463556851311953352769679300291545189504, 1193 .29546421289383584252163927885703742504130, .7441860465116279069767441860465116279070, 1194 .29836697255179722709783618483925238251680, .7420289855072463768115942028985507246377, 1195 .30126133057816173455023545102449133992200, .7398843930635838150289017341040462427746, 1196 .30414733546729666446850615102448500692850, .7377521613832853025936599423631123919308, 1197 .30702503529491181888388950937951449304830, .7356321839080459770114942528735632183908, 1198 .30989447772286465854207904158101882785550, .7335243553008595988538681948424068767908, 1199 .31275571000389684739317885942000430077330, .7314285714285714285714285714285714285714, 1200 .31560877898630329552176476681779604405180, .7293447293447293447293447293447293447293, 1201 .31845373111853458869546784626436419785030, .7272727272727272727272727272727272727273, 1202 .32129061245373424782201254856772720813750, .7252124645892351274787535410764872521246, 1203 .32411946865421192853773391107097268104550, .7231638418079096045197740112994350282486, 1204 .32694034499585328257253991068864706903700, .7211267605633802816901408450704225352113, 1205 .32975328637246797969240219572384376078850, .7191011235955056179775280898876404494382, 1206 .33255833730007655635318997155991382896900, .7170868347338935574229691876750700280112, 1207 .33535554192113781191153520921943709254280, .7150837988826815642458100558659217877095, 1208 .33814494400871636381467055798566434532400, .7130919220055710306406685236768802228412, 1209 .34092658697059319283795275623560883104800, .7111111111111111111111111111111111111111, 1210 .34370051385331840121395430287520866841080, .7091412742382271468144044321329639889197, 1211 .34646676734620857063262633346312213689100, .7071823204419889502762430939226519337017, 1212 .34922538978528827602332285096053965389730, .7052341597796143250688705234159779614325, 1213 .35197642315717814209818925519357435405250, .7032967032967032967032967032967032967033, 1214 .35471990910292899856770532096561510115850, .7013698630136986301369863013698630136986, 1215 .35745588892180374385176833129662554711100, .6994535519125683060109289617486338797814, 1216 .36018440357500774995358483465679455548530, .6975476839237057220708446866485013623978, 1217 .36290549368936841911903457003063522279280, .6956521739130434782608695652173913043478, 1218 .36561919956096466943762379742111079394830, .6937669376693766937669376693766937669377, 1219 .36832556115870762614150635272380895912650, .6918918918918918918918918918918918918919, 1220 .37102461812787262962487488948681857436900, .6900269541778975741239892183288409703504, 1221 .37371640979358405898480555151763837784530, .6881720430107526881720430107526881720430, 1222 .37640097516425302659470730759494472295050, .6863270777479892761394101876675603217158, 1223 .37907835293496944251145919224654790014030, .6844919786096256684491978609625668449198, 1224 .38174858149084833769393299007788300514230, .6826666666666666666666666666666666666667, 1225 .38441169891033200034513583887019194662580, .6808510638297872340425531914893617021277, 1226 .38706774296844825844488013899535872042180, .6790450928381962864721485411140583554377, 1227 .38971675114002518602873692543653305619950, .6772486772486772486772486772486772486772, 1228 .39235876060286384303665840889152605086580, .6754617414248021108179419525065963060686, 1229 .39499380824086893770896722344332374632350, .6736842105263157894736842105263157894737, 1230 .39762193064713846624158577469643205404280, .6719160104986876640419947506561679790026, 1231 .40024316412701266276741307592601515352730, .6701570680628272251308900523560209424084, 1232 .40285754470108348090917615991202183067800, .6684073107049608355091383812010443864230, 1233 .40546510810816432934799991016916465014230, .6666666666666666666666666666666666666667, 1234 .40806588980822172674223224930756259709600, .6649350649350649350649350649350649350649, 1235 .41065992498526837639616360320360399782650, .6632124352331606217616580310880829015544, 1236 .41324724855021932601317757871584035456180, .6614987080103359173126614987080103359173, 1237 .41582789514371093497757669865677598863850, .6597938144329896907216494845360824742268, 1238 .41840189913888381489925905043492093682300, .6580976863753213367609254498714652956298, 1239 .42096929464412963239894338585145305842150, .6564102564102564102564102564102564102564, 1240 .42353011550580327293502591601281892508280, .6547314578005115089514066496163682864450, 1241 .42608439531090003260516141381231136620050, .6530612244897959183673469387755102040816, 1242 .42863216738969872610098832410585600882780, .6513994910941475826972010178117048346056, 1243 .43117346481837132143866142541810404509300, .6497461928934010152284263959390862944162, 1244 .43370832042155937902094819946796633303180, .6481012658227848101265822784810126582278, 1245 .43623676677491801667585491486534010618930, .6464646464646464646464646464646464646465, 1246 .43875883620762790027214350629947148263450, .6448362720403022670025188916876574307305, 1247 .44127456080487520440058801796112675219780, .6432160804020100502512562814070351758794, 1248 .44378397241030093089975139264424797147500, .6416040100250626566416040100250626566416, 1249 .44628710262841947420398014401143882423650, .6400000000000000000000000000000000000000, 1250 .44878398282700665555822183705458883196130, .6384039900249376558603491271820448877805, 1251 .45127464413945855836729492693848442286250, .6368159203980099502487562189054726368159, 1252 .45375911746712049854579618113348260521900, .6352357320099255583126550868486352357320, 1253 .45623743348158757315857769754074979573500, .6336633663366336633663366336633663366337, 1254 .45870962262697662081833982483658473938700, .6320987654320987654320987654320987654321, 1255 .46117571512217014895185229761409573256980, .6305418719211822660098522167487684729064, 1256 .46363574096303250549055974261136725544930, .6289926289926289926289926289926289926290, 1257 .46608972992459918316399125615134835243230, .6274509803921568627450980392156862745098, 1258 .46853771156323925639597405279346276074650, .6259168704156479217603911980440097799511, 1259 .47097971521879100631480241645476780831830, .6243902439024390243902439024390243902439, 1260 .47341577001667212165614273544633761048330, .6228710462287104622871046228710462287105, 1261 .47584590486996386493601107758877333253630, .6213592233009708737864077669902912621359, 1262 .47827014848147025860569669930555392056700, .6198547215496368038740920096852300242131, 1263 .48068852934575190261057286988943815231330, .6183574879227053140096618357487922705314, 1264 .48310107575113581113157579238759353756900, .6168674698795180722891566265060240963855, 1265 .48550781578170076890899053978500887751580, .6153846153846153846153846153846153846154, 1266 .48790877731923892879351001283794175833480, .6139088729016786570743405275779376498801, 1267 .49030398804519381705802061333088204264650, .6124401913875598086124401913875598086124, 1268 .49269347544257524607047571407747454941280, .6109785202863961813842482100238663484487, 1269 .49507726679785146739476431321236304938800, .6095238095238095238095238095238095238095, 1270 .49745538920281889838648226032091770321130, .6080760095011876484560570071258907363420, 1271 .49982786955644931126130359189119189977650, .6066350710900473933649289099526066350711, 1272 .50219473456671548383667413872899487614650, .6052009456264775413711583924349881796690, 1273 .50455601075239520092452494282042607665050, .6037735849056603773584905660377358490566, 1274 .50691172444485432801997148999362252652650, .6023529411764705882352941176470588235294, 1275 .50926190178980790257412536448100581765150, .6009389671361502347417840375586854460094, 1276 .51160656874906207391973111953120678663250, .5995316159250585480093676814988290398126, 1277 .51394575110223428282552049495279788970950, .5981308411214953271028037383177570093458, 1278 .51627947444845445623684554448118433356300, .5967365967365967365967365967365967365967, 1279 .51860776420804555186805373523384332656850, .5953488372093023255813953488372093023256, 1280 .52093064562418522900344441950437612831600, .5939675174013921113689095127610208816705, 1281 .52324814376454775732838697877014055848100, .5925925925925925925925925925925925925926, 1282 .52556028352292727401362526507000438869000, .5912240184757505773672055427251732101617, 1283 .52786708962084227803046587723656557500350, .5898617511520737327188940092165898617512, 1284 .53016858660912158374145519701414741575700, .5885057471264367816091954022988505747126, 1285 .53246479886947173376654518506256863474850, .5871559633027522935779816513761467889908, 1286 .53475575061602764748158733709715306758900, .5858123569794050343249427917620137299771, 1287 .53704146589688361856929077475797384977350, .5844748858447488584474885844748858447489, 1288 .53932196859560876944783558428753167390800, .5831435079726651480637813211845102505695, 1289 .54159728243274429804188230264117009937750, .5818181818181818181818181818181818181818, 1290 .54386743096728351609669971367111429572100, .5804988662131519274376417233560090702948, 1291 .54613243759813556721383065450936555862450, .5791855203619909502262443438914027149321, 1292 .54839232556557315767520321969641372561450, .5778781038374717832957110609480812641084, 1293 .55064711795266219063194057525834068655950, .5765765765765765765765765765765765765766, 1294 .55289683768667763352766542084282264113450, .5752808988764044943820224719101123595506, 1295 .55514150754050151093110798683483153581600, .5739910313901345291479820627802690582960, 1296 .55738115013400635344709144192165695130850, .5727069351230425055928411633109619686801, 1297 .55961578793542265941596269840374588966350, .5714285714285714285714285714285714285714, 1298 .56184544326269181269140062795486301183700, .5701559020044543429844097995545657015590, 1299 .56407013828480290218436721261241473257550, .5688888888888888888888888888888888888889, 1300 .56628989502311577464155334382667206227800, .5676274944567627494456762749445676274945, 1301 .56850473535266865532378233183408156037350, .5663716814159292035398230088495575221239, 1302 .57071468100347144680739575051120482385150, .5651214128035320088300220750551876379691, 1303 .57291975356178548306473885531886480748650, .5638766519823788546255506607929515418502, 1304 .57511997447138785144460371157038025558000, .5626373626373626373626373626373626373626, 1305 .57731536503482350219940144597785547375700, .5614035087719298245614035087719298245614, 1306 .57950594641464214795689713355386629700650, .5601750547045951859956236323851203501094, 1307 .58169173963462239562716149521293118596100, .5589519650655021834061135371179039301310, 1308 .58387276558098266665552955601015128195300, .5577342047930283224400871459694989106754, 1309 .58604904500357812846544902640744112432000, .5565217391304347826086956521739130434783, 1310 .58822059851708596855957011939608491957200, .5553145336225596529284164859002169197397, 1311 .59038744660217634674381770309992134571100, .5541125541125541125541125541125541125541, 1312 .59254960960667157898740242671919986605650, .5529157667386609071274298056155507559395, 1313 .59470710774669277576265358220553025603300, .5517241379310344827586206896551724137931, 1314 .59685996110779382384237123915227130055450, .5505376344086021505376344086021505376344, 1315 .59900818964608337768851242799428291618800, .5493562231759656652360515021459227467811, 1316 .60115181318933474940990890900138765573500, .5481798715203426124197002141327623126338, 1317 .60329085143808425240052883964381180703650, .5470085470085470085470085470085470085470, 1318 .60542532396671688843525771517306566238400, .5458422174840085287846481876332622601279, 1319 .60755525022454170969155029524699784815300, .5446808510638297872340425531914893617021, 1320 .60968064953685519036241657886421307921400, .5435244161358811040339702760084925690021, 1321 .61180154110599282990534675263916142284850, .5423728813559322033898305084745762711864, 1322 .61391794401237043121710712512140162289150, .5412262156448202959830866807610993657505, 1323 .61602987721551394351138242200249806046500, .5400843881856540084388185654008438818565, 1324 .61813735955507864705538167982012964785100, .5389473684210526315789473684210526315789, 1325 .62024040975185745772080281312810257077200, .5378151260504201680672268907563025210084, 1326 .62233904640877868441606324267922900617100, .5366876310272536687631027253668763102725, 1327 .62443328801189346144440150965237990021700, .5355648535564853556485355648535564853556, 1328 .62652315293135274476554741340805776417250, .5344467640918580375782881002087682672234, 1329 .62860865942237409420556559780379757285100, .5333333333333333333333333333333333333333, 1330 .63068982562619868570408243613201193511500, .5322245322245322245322245322245322245322, 1331 .63276666957103777644277897707070223987100, .5311203319502074688796680497925311203320, 1332 .63483920917301017716738442686619237065300, .5300207039337474120082815734989648033126, 1333 .63690746223706917739093569252872839570050, .5289256198347107438016528925619834710744, 1334 .63897144645792069983514238629140891134750, .5278350515463917525773195876288659793814, 1335 .64103117942093124081992527862894348800200, .5267489711934156378600823045267489711934, 1336 .64308667860302726193566513757104985415950, .5256673511293634496919917864476386036961, 1337 .64513796137358470073053240412264131009600, .5245901639344262295081967213114754098361, 1338 .64718504499530948859131740391603671014300, .5235173824130879345603271983640081799591, 1339 .64922794662510974195157587018911726772800, .5224489795918367346938775510204081632653, 1340 .65126668331495807251485530287027359008800, .5213849287169042769857433808553971486762, 1341 .65330127201274557080523663898929953575150, .5203252032520325203252032520325203252033, 1342 .65533172956312757406749369692988693714150, .5192697768762677484787018255578093306288, 1343 .65735807270835999727154330685152672231200, .5182186234817813765182186234817813765182, 1344 .65938031808912778153342060249997302889800, .5171717171717171717171717171717171717172, 1345 .66139848224536490484126716182800009846700, .5161290322580645161290322580645161290323, 1346 .66341258161706617713093692145776003599150, .5150905432595573440643863179074446680080, 1347 .66542263254509037562201001492212526500250, .5140562248995983935742971887550200803213, 1348 .66742865127195616370414654738851822912700, .5130260521042084168336673346693386773547, 1349 .66943065394262923906154583164607174694550, .5120000000000000000000000000000000000000, 1350 .67142865660530226534774556057527661323550, .5109780439121756487025948103792415169661, 1351 .67342267521216669923234121597488410770900, .5099601593625498007968127490039840637450, 1352 .67541272562017662384192817626171745359900, .5089463220675944333996023856858846918489, 1353 .67739882359180603188519853574689477682100, .5079365079365079365079365079365079365079, 1354 .67938098479579733801614338517538271844400, .5069306930693069306930693069306930693069, 1355 .68135922480790300781450241629499942064300, .5059288537549407114624505928853754940711, 1356 .68333355911162063645036823800182901322850, .5049309664694280078895463510848126232742, 1357 .68530400309891936760919861626462079584600, .5039370078740157480314960629921259842520, 1358 .68727057207096020619019327568821609020250, .5029469548133595284872298624754420432220, 1359 .68923328123880889251040571252815425395950, .5019607843137254901960784313725490196078, 1360 .69314718055994530941723212145818, 5.0e-01, 1361 }; 1362 1363 1364 1365 #define LOGTAB_TRANSLATE(x,h) (((x) - 1.)*icvLogTab[(h)+1]) 1366 static const double ln_2 = 0.69314718055994530941723212145818; 1367 1368 IPCVAPI_IMPL( CvStatus, icvLog_32f, ( const float *_x, float *y, int n ), (_x, y, n) ) 1369 { 1370 static const double shift[] = { 0, -1./512 }; 1371 static const double 1372 A0 = 0.3333333333333333333333333, 1373 A1 = -0.5, 1374 A2 = 1; 1375 1376 #undef LOGPOLY 1377 #define LOGPOLY(x,k) ((x)+=shift[k],((A0*(x) + A1)*(x) + A2)*(x)) 1378 1379 int i = 0; 1380 union 1381 { 1382 int i; 1383 float f; 1384 } 1385 buf[4]; 1386 1387 const int* x = (const int*)_x; 1388 1389 if( !x || !y ) 1390 return CV_NULLPTR_ERR; 1391 if( n <= 0 ) 1392 return CV_BADSIZE_ERR; 1393 1394 for( i = 0; i <= n - 4; i += 4 ) 1395 { 1396 double x0, x1, x2, x3; 1397 double y0, y1, y2, y3; 1398 int h0, h1, h2, h3; 1399 1400 h0 = x[i]; 1401 h1 = x[i+1]; 1402 buf[0].i = (h0 & LOGTAB_MASK2_32F) | (127 << 23); 1403 buf[1].i = (h1 & LOGTAB_MASK2_32F) | (127 << 23); 1404 1405 y0 = (((h0 >> 23) & 0xff) - 127) * ln_2; 1406 y1 = (((h1 >> 23) & 0xff) - 127) * ln_2; 1407 1408 h0 = (h0 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1409 h1 = (h1 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1410 1411 y0 += icvLogTab[h0]; 1412 y1 += icvLogTab[h1]; 1413 1414 h2 = x[i+2]; 1415 h3 = x[i+3]; 1416 1417 x0 = LOGTAB_TRANSLATE( buf[0].f, h0 ); 1418 x1 = LOGTAB_TRANSLATE( buf[1].f, h1 ); 1419 1420 buf[2].i = (h2 & LOGTAB_MASK2_32F) | (127 << 23); 1421 buf[3].i = (h3 & LOGTAB_MASK2_32F) | (127 << 23); 1422 1423 y2 = (((h2 >> 23) & 0xff) - 127) * ln_2; 1424 y3 = (((h3 >> 23) & 0xff) - 127) * ln_2; 1425 1426 h2 = (h2 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1427 h3 = (h3 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1428 1429 y2 += icvLogTab[h2]; 1430 y3 += icvLogTab[h3]; 1431 1432 x2 = LOGTAB_TRANSLATE( buf[2].f, h2 ); 1433 x3 = LOGTAB_TRANSLATE( buf[3].f, h3 ); 1434 1435 y0 += LOGPOLY( x0, h0 == 510 ); 1436 y1 += LOGPOLY( x1, h1 == 510 ); 1437 1438 y[i] = (float) y0; 1439 y[i + 1] = (float) y1; 1440 1441 y2 += LOGPOLY( x2, h2 == 510 ); 1442 y3 += LOGPOLY( x3, h3 == 510 ); 1443 1444 y[i + 2] = (float) y2; 1445 y[i + 3] = (float) y3; 1446 } 1447 1448 for( ; i < n; i++ ) 1449 { 1450 int h0 = x[i]; 1451 double x0, y0; 1452 1453 y0 = (((h0 >> 23) & 0xff) - 127) * ln_2; 1454 1455 buf[0].i = (h0 & LOGTAB_MASK2_32F) | (127 << 23); 1456 h0 = (h0 >> (23 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1457 1458 y0 += icvLogTab[h0]; 1459 x0 = LOGTAB_TRANSLATE( buf[0].f, h0 ); 1460 y0 += LOGPOLY( x0, h0 == 510 ); 1461 1462 y[i] = (float)y0; 1463 } 1464 1465 return CV_OK; 1466 } 1467 1468 1469 IPCVAPI_IMPL( CvStatus, icvLog_64f, ( const double *x, double *y, int n ), (x, y, n) ) 1470 { 1471 static const double shift[] = { 0, -1./512 }; 1472 static const double 1473 A0 = -.1666666666666666666666666666666666666666, 1474 A1 = +0.2, 1475 A2 = -0.25, 1476 A3 = +0.3333333333333333333333333333333333333333, 1477 A4 = -0.5, 1478 A5 = +1.0; 1479 1480 #undef LOGPOLY 1481 #define LOGPOLY(x,k) ((x)+=shift[k], (xq) = (x)*(x),\ 1482 ((A0*(xq) + A2)*(xq) + A4)*(xq) + ((A1*(xq) + A3)*(xq) + A5)*(x)) 1483 1484 int i = 0; 1485 DBLINT buf[4]; 1486 DBLINT *X = (DBLINT *) x; 1487 1488 if( !x || !y ) 1489 return CV_NULLPTR_ERR; 1490 if( n <= 0 ) 1491 return CV_BADSIZE_ERR; 1492 1493 for( ; i <= n - 4; i += 4 ) 1494 { 1495 double xq; 1496 double x0, x1, x2, x3; 1497 double y0, y1, y2, y3; 1498 int h0, h1, h2, h3; 1499 1500 h0 = X[i].i.lo; 1501 h1 = X[i + 1].i.lo; 1502 buf[0].i.lo = h0; 1503 buf[1].i.lo = h1; 1504 1505 h0 = X[i].i.hi; 1506 h1 = X[i + 1].i.hi; 1507 buf[0].i.hi = (h0 & LOGTAB_MASK2) | (1023 << 20); 1508 buf[1].i.hi = (h1 & LOGTAB_MASK2) | (1023 << 20); 1509 1510 y0 = (((h0 >> 20) & 0x7ff) - 1023) * ln_2; 1511 y1 = (((h1 >> 20) & 0x7ff) - 1023) * ln_2; 1512 1513 h2 = X[i + 2].i.lo; 1514 h3 = X[i + 3].i.lo; 1515 buf[2].i.lo = h2; 1516 buf[3].i.lo = h3; 1517 1518 h0 = (h0 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1519 h1 = (h1 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1520 1521 y0 += icvLogTab[h0]; 1522 y1 += icvLogTab[h1]; 1523 1524 h2 = X[i + 2].i.hi; 1525 h3 = X[i + 3].i.hi; 1526 1527 x0 = LOGTAB_TRANSLATE( buf[0].d, h0 ); 1528 x1 = LOGTAB_TRANSLATE( buf[1].d, h1 ); 1529 1530 buf[2].i.hi = (h2 & LOGTAB_MASK2) | (1023 << 20); 1531 buf[3].i.hi = (h3 & LOGTAB_MASK2) | (1023 << 20); 1532 1533 y2 = (((h2 >> 20) & 0x7ff) - 1023) * ln_2; 1534 y3 = (((h3 >> 20) & 0x7ff) - 1023) * ln_2; 1535 1536 h2 = (h2 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1537 h3 = (h3 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1538 1539 y2 += icvLogTab[h2]; 1540 y3 += icvLogTab[h3]; 1541 1542 x2 = LOGTAB_TRANSLATE( buf[2].d, h2 ); 1543 x3 = LOGTAB_TRANSLATE( buf[3].d, h3 ); 1544 1545 y0 += LOGPOLY( x0, h0 == 510 ); 1546 y1 += LOGPOLY( x1, h1 == 510 ); 1547 1548 y[i] = y0; 1549 y[i + 1] = y1; 1550 1551 y2 += LOGPOLY( x2, h2 == 510 ); 1552 y3 += LOGPOLY( x3, h3 == 510 ); 1553 1554 y[i + 2] = y2; 1555 y[i + 3] = y3; 1556 } 1557 1558 for( ; i < n; i++ ) 1559 { 1560 int h0 = X[i].i.hi; 1561 double xq; 1562 double x0, y0 = (((h0 >> 20) & 0x7ff) - 1023) * ln_2; 1563 1564 buf[0].i.hi = (h0 & LOGTAB_MASK2) | (1023 << 20); 1565 buf[0].i.lo = X[i].i.lo; 1566 h0 = (h0 >> (20 - LOGTAB_SCALE - 1)) & LOGTAB_MASK * 2; 1567 1568 y0 += icvLogTab[h0]; 1569 x0 = LOGTAB_TRANSLATE( buf[0].d, h0 ); 1570 y0 += LOGPOLY( x0, h0 == 510 ); 1571 y[i] = y0; 1572 } 1573 1574 return CV_OK; 1575 } 1576 1577 1578 CV_IMPL void cvLog( const CvArr* srcarr, CvArr* dstarr ) 1579 { 1580 CV_FUNCNAME( "cvLog" ); 1581 1582 __BEGIN__; 1583 1584 CvMat srcstub, *src = (CvMat*)srcarr; 1585 CvMat dststub, *dst = (CvMat*)dstarr; 1586 int coi1 = 0, coi2 = 0, src_depth, dst_depth; 1587 double* buffer = 0; 1588 CvSize size; 1589 int x, y, dx = 0; 1590 1591 if( !CV_IS_MAT(src)) 1592 CV_CALL( src = cvGetMat( src, &srcstub, &coi1 )); 1593 1594 if( !CV_IS_MAT(dst)) 1595 CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 )); 1596 1597 if( coi1 != 0 || coi2 != 0 ) 1598 CV_ERROR( CV_BadCOI, "" ); 1599 1600 src_depth = CV_MAT_DEPTH(src->type); 1601 dst_depth = CV_MAT_DEPTH(dst->type); 1602 1603 if( !CV_ARE_CNS_EQ( src, dst ) || dst_depth < CV_32F || src_depth < dst_depth ) 1604 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 1605 1606 if( !CV_ARE_SIZES_EQ( src, dst ) ) 1607 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 1608 1609 size = cvGetMatSize(src); 1610 size.width *= CV_MAT_CN(src->type); 1611 1612 if( CV_IS_MAT_CONT( src->type & dst->type )) 1613 { 1614 size.width *= size.height; 1615 size.height = 1; 1616 } 1617 1618 if( !CV_ARE_DEPTHS_EQ( src, dst )) 1619 { 1620 dx = MIN( 1024, size.width ); 1621 buffer = (double*)cvStackAlloc( dx*sizeof(buffer[0]) ); 1622 } 1623 1624 for( y = 0; y < size.height; y++ ) 1625 { 1626 uchar* src_data = src->data.ptr + src->step*y; 1627 uchar* dst_data = dst->data.ptr + dst->step*y; 1628 1629 if( dst_depth == CV_64F ) 1630 { 1631 icvLog_64f( (double*)src_data, (double*)dst_data, size.width ); 1632 } 1633 else if( src_depth == dst_depth ) 1634 { 1635 icvLog_32f( (float*)src_data, (float*)dst_data, size.width ); 1636 } 1637 else 1638 { 1639 for( x = 0; x < size.width; x += dx ) 1640 { 1641 int len = dx; 1642 if( x + len > size.width ) 1643 len = size.width - x; 1644 icvLog_64f( (double*)src_data + x, buffer, len ); 1645 icvCvt_64f32f( buffer, (float*)dst_data + x, len ); 1646 } 1647 } 1648 } 1649 1650 __END__; 1651 } 1652 1653 1654 /****************************************************************************************\ 1655 * P O W E R * 1656 \****************************************************************************************/ 1657 1658 #define ICV_DEF_IPOW_OP( flavor, arrtype, worktype, cast_macro ) \ 1659 static CvStatus CV_STDCALL \ 1660 icvIPow_##flavor( const arrtype* src, arrtype* dst, int len, int power ) \ 1661 { \ 1662 int i; \ 1663 \ 1664 for( i = 0; i < len; i++ ) \ 1665 { \ 1666 worktype a = 1, b = src[i]; \ 1667 int p = power; \ 1668 while( p > 1 ) \ 1669 { \ 1670 if( p & 1 ) \ 1671 a *= b; \ 1672 b *= b; \ 1673 p >>= 1; \ 1674 } \ 1675 \ 1676 a *= b; \ 1677 dst[i] = cast_macro(a); \ 1678 } \ 1679 \ 1680 return CV_OK; \ 1681 } 1682 1683 1684 ICV_DEF_IPOW_OP( 8u, uchar, int, CV_CAST_8U ) 1685 ICV_DEF_IPOW_OP( 16u, ushort, int, CV_CAST_16U ) 1686 ICV_DEF_IPOW_OP( 16s, short, int, CV_CAST_16S ) 1687 ICV_DEF_IPOW_OP( 32s, int, int, CV_CAST_32S ) 1688 ICV_DEF_IPOW_OP( 32f, float, double, CV_CAST_32F ) 1689 ICV_DEF_IPOW_OP( 64f, double, double, CV_CAST_64F ) 1690 1691 #define icvIPow_8s 0 1692 1693 CV_DEF_INIT_FUNC_TAB_1D( IPow ) 1694 1695 typedef CvStatus (CV_STDCALL * CvIPowFunc)( const void* src, void* dst, int len, int power ); 1696 typedef CvStatus (CV_STDCALL * CvSqrtFunc)( const void* src, void* dst, int len ); 1697 1698 CV_IMPL void cvPow( const CvArr* srcarr, CvArr* dstarr, double power ) 1699 { 1700 static CvFuncTable ipow_tab; 1701 static int inittab = 0; 1702 1703 CV_FUNCNAME( "cvPow" ); 1704 1705 __BEGIN__; 1706 1707 void* temp_buffer = 0; 1708 int block_size = 0; 1709 CvMat srcstub, *src = (CvMat*)srcarr; 1710 CvMat dststub, *dst = (CvMat*)dstarr; 1711 int coi1 = 0, coi2 = 0; 1712 int depth; 1713 CvSize size; 1714 int x, y; 1715 int ipower = cvRound( power ); 1716 int is_ipower = 0; 1717 1718 if( !CV_IS_MAT(src)) 1719 CV_CALL( src = cvGetMat( src, &srcstub, &coi1 )); 1720 1721 if( !CV_IS_MAT(dst)) 1722 CV_CALL( dst = cvGetMat( dst, &dststub, &coi2 )); 1723 1724 if( coi1 != 0 || coi2 != 0 ) 1725 CV_ERROR( CV_BadCOI, "" ); 1726 1727 if( !CV_ARE_TYPES_EQ( src, dst )) 1728 CV_ERROR_FROM_CODE( CV_StsUnmatchedFormats ); 1729 1730 if( !CV_ARE_SIZES_EQ( src, dst ) ) 1731 CV_ERROR_FROM_CODE( CV_StsUnmatchedSizes ); 1732 1733 depth = CV_MAT_DEPTH( src->type ); 1734 1735 if( fabs(ipower - power) < DBL_EPSILON ) 1736 { 1737 if( !inittab ) 1738 { 1739 icvInitIPowTable( &ipow_tab ); 1740 inittab = 1; 1741 } 1742 1743 if( ipower < 0 ) 1744 { 1745 CV_CALL( cvDiv( 0, src, dst )); 1746 1747 if( ipower == -1 ) 1748 EXIT; 1749 ipower = -ipower; 1750 src = dst; 1751 } 1752 1753 switch( ipower ) 1754 { 1755 case 0: 1756 cvSet( dst, cvScalarAll(1)); 1757 EXIT; 1758 case 1: 1759 cvCopy( src, dst ); 1760 EXIT; 1761 case 2: 1762 cvMul( src, src, dst ); 1763 EXIT; 1764 default: 1765 is_ipower = 1; 1766 } 1767 } 1768 else if( depth < CV_32F ) 1769 CV_ERROR( CV_StsUnsupportedFormat, 1770 "Fractional or negative integer power factor can be used " 1771 "with floating-point types only"); 1772 1773 size = cvGetMatSize(src); 1774 size.width *= CV_MAT_CN(src->type); 1775 1776 if( CV_IS_MAT_CONT( src->type & dst->type )) 1777 { 1778 size.width *= size.height; 1779 size.height = 1; 1780 } 1781 1782 if( is_ipower ) 1783 { 1784 CvIPowFunc pow_func = (CvIPowFunc)ipow_tab.fn_2d[depth]; 1785 if( !pow_func ) 1786 CV_ERROR( CV_StsUnsupportedFormat, "The data type is not supported" ); 1787 1788 for( y = 0; y < size.height; y++ ) 1789 { 1790 uchar* src_data = src->data.ptr + src->step*y; 1791 uchar* dst_data = dst->data.ptr + dst->step*y; 1792 1793 pow_func( src_data, dst_data, size.width, ipower ); 1794 } 1795 } 1796 else if( fabs(fabs(power) - 0.5) < DBL_EPSILON ) 1797 { 1798 CvSqrtFunc sqrt_func = power < 0 ? 1799 (depth == CV_32F ? (CvSqrtFunc)icvInvSqrt_32f : (CvSqrtFunc)icvInvSqrt_64f) : 1800 (depth == CV_32F ? (CvSqrtFunc)icvSqrt_32f : (CvSqrtFunc)icvSqrt_64f); 1801 1802 for( y = 0; y < size.height; y++ ) 1803 { 1804 uchar* src_data = src->data.ptr + src->step*y; 1805 uchar* dst_data = dst->data.ptr + dst->step*y; 1806 1807 sqrt_func( src_data, dst_data, size.width ); 1808 } 1809 } 1810 else 1811 { 1812 block_size = MIN( size.width, ICV_MATH_BLOCK_SIZE ); 1813 temp_buffer = cvStackAlloc( block_size*CV_ELEM_SIZE(depth) ); 1814 1815 for( y = 0; y < size.height; y++ ) 1816 { 1817 uchar* src_data = src->data.ptr + src->step*y; 1818 uchar* dst_data = dst->data.ptr + dst->step*y; 1819 1820 for( x = 0; x < size.width; x += block_size ) 1821 { 1822 int len = MIN( size.width - x, block_size ); 1823 if( depth == CV_32F ) 1824 { 1825 icvLog_32f( (float*)src_data + x, (float*)temp_buffer, len ); 1826 icvScale_32f( (float*)temp_buffer, (float*)temp_buffer, len, (float)power, 0 ); 1827 icvExp_32f( (float*)temp_buffer, (float*)dst_data + x, len ); 1828 } 1829 else 1830 { 1831 icvLog_64f( (double*)src_data + x, (double*)temp_buffer, len ); 1832 icvScale_64f( (double*)temp_buffer, (double*)temp_buffer, len, power, 0 ); 1833 icvExp_64f( (double*)temp_buffer, (double*)dst_data + x, len ); 1834 } 1835 } 1836 } 1837 } 1838 1839 __END__; 1840 } 1841 1842 1843 /************************** CheckArray for NaN's, Inf's *********************************/ 1844 1845 IPCVAPI_IMPL( CvStatus, icvCheckArray_32f_C1R, 1846 ( const float* src, int srcstep, CvSize size, int flags, double min_val, double max_val ), 1847 (src, srcstep, size, flags, min_val, max_val) ) 1848 { 1849 Cv32suf a, b; 1850 int ia, ib; 1851 const int* isrc = (const int*)src; 1852 1853 if( !src ) 1854 return CV_NULLPTR_ERR; 1855 1856 if( size.width <= 0 || size.height <= 0 ) 1857 return CV_BADSIZE_ERR; 1858 1859 if( flags & CV_CHECK_RANGE ) 1860 { 1861 a.f = (float)min_val; 1862 b.f = (float)max_val; 1863 } 1864 else 1865 { 1866 a.f = -FLT_MAX; 1867 b.f = FLT_MAX; 1868 } 1869 1870 ia = CV_TOGGLE_FLT(a.i); 1871 ib = CV_TOGGLE_FLT(b.i); 1872 1873 srcstep /= sizeof(isrc[0]); 1874 for( ; size.height--; isrc += srcstep ) 1875 { 1876 int i; 1877 for( i = 0; i < size.width; i++ ) 1878 { 1879 int val = isrc[i]; 1880 val = CV_TOGGLE_FLT(val); 1881 1882 if( val < ia || val >= ib ) 1883 return CV_BADRANGE_ERR; 1884 } 1885 } 1886 1887 return CV_OK; 1888 } 1889 1890 1891 IPCVAPI_IMPL( CvStatus, icvCheckArray_64f_C1R, 1892 ( const double* src, int srcstep, CvSize size, int flags, double min_val, double max_val ), 1893 (src, srcstep, size, flags, min_val, max_val) ) 1894 { 1895 Cv64suf a, b; 1896 int64 ia, ib; 1897 const int64* isrc = (const int64*)src; 1898 1899 if( !src ) 1900 return CV_NULLPTR_ERR; 1901 1902 if( size.width <= 0 || size.height <= 0 ) 1903 return CV_BADSIZE_ERR; 1904 1905 if( flags & CV_CHECK_RANGE ) 1906 { 1907 a.f = min_val; 1908 b.f = max_val; 1909 } 1910 else 1911 { 1912 a.f = -DBL_MAX; 1913 b.f = DBL_MAX; 1914 } 1915 1916 ia = CV_TOGGLE_DBL(a.i); 1917 ib = CV_TOGGLE_DBL(b.i); 1918 1919 srcstep /= sizeof(isrc[0]); 1920 for( ; size.height--; isrc += srcstep ) 1921 { 1922 int i; 1923 for( i = 0; i < size.width; i++ ) 1924 { 1925 int64 val = isrc[i]; 1926 val = CV_TOGGLE_DBL(val); 1927 1928 if( val < ia || val >= ib ) 1929 return CV_BADRANGE_ERR; 1930 } 1931 } 1932 1933 return CV_OK; 1934 } 1935 1936 1937 CV_IMPL int cvCheckArr( const CvArr* arr, int flags, 1938 double minVal, double maxVal ) 1939 { 1940 int result = 0; 1941 1942 CV_FUNCNAME( "cvCheckArr" ); 1943 1944 __BEGIN__; 1945 1946 if( arr ) 1947 { 1948 CvStatus status = CV_OK; 1949 CvMat stub, *mat = (CvMat*)arr; 1950 int type; 1951 CvSize size; 1952 1953 if( !CV_IS_MAT( mat )) 1954 CV_CALL( mat = cvGetMat( mat, &stub, 0, 1 )); 1955 1956 type = CV_MAT_TYPE( mat->type ); 1957 size = cvGetMatSize( mat ); 1958 1959 size.width *= CV_MAT_CN( type ); 1960 1961 if( CV_IS_MAT_CONT( mat->type )) 1962 { 1963 size.width *= size.height; 1964 size.height = 1; 1965 } 1966 1967 if( CV_MAT_DEPTH(type) == CV_32F ) 1968 { 1969 status = icvCheckArray_32f_C1R( mat->data.fl, mat->step, size, 1970 flags, minVal, maxVal ); 1971 } 1972 else if( CV_MAT_DEPTH(type) == CV_64F ) 1973 { 1974 status = icvCheckArray_64f_C1R( mat->data.db, mat->step, size, 1975 flags, minVal, maxVal ); 1976 } 1977 else 1978 { 1979 CV_ERROR( CV_StsUnsupportedFormat, "" ); 1980 } 1981 1982 if( status < 0 ) 1983 { 1984 if( status != CV_BADRANGE_ERR || !(flags & CV_CHECK_QUIET)) 1985 CV_ERROR( CV_StsOutOfRange, "CheckArray failed" ); 1986 EXIT; 1987 } 1988 } 1989 1990 result = 1; 1991 1992 __END__; 1993 1994 return result; 1995 } 1996 1997 1998 /* End of file. */ 1999