| 477 | }; |
| 478 | |
| 479 | void RNG::fill( InputOutputArray _mat, int disttype, |
| 480 | InputArray _param1arg, InputArray _param2arg, bool saturateRange ) |
| 481 | { |
| 482 | Mat mat = _mat.getMat(), _param1 = _param1arg.getMat(), _param2 = _param2arg.getMat(); |
| 483 | int depth = mat.depth(), cn = mat.channels(); |
| 484 | AutoBuffer<double> _parambuf; |
| 485 | int j, k, fast_int_mode = 0, smallFlag = 1; |
| 486 | RandFunc func = 0; |
| 487 | RandnScaleFunc scaleFunc = 0; |
| 488 | |
| 489 | CV_Assert(_param1.channels() == 1 && (_param1.rows == 1 || _param1.cols == 1) && |
| 490 | (_param1.rows + _param1.cols - 1 == cn || _param1.rows + _param1.cols - 1 == 1 || |
| 491 | (_param1.size() == Size(1, 4) && _param1.type() == CV_64F && cn <= 4))); |
| 492 | CV_Assert( _param2.channels() == 1 && |
| 493 | (((_param2.rows == 1 || _param2.cols == 1) && |
| 494 | (_param2.rows + _param2.cols - 1 == cn || _param2.rows + _param2.cols - 1 == 1 || |
| 495 | (_param1.size() == Size(1, 4) && _param1.type() == CV_64F && cn <= 4))) || |
| 496 | (_param2.rows == cn && _param2.cols == cn && disttype == NORMAL))); |
| 497 | |
| 498 | Vec2i* ip = 0; |
| 499 | Vec2d* dp = 0; |
| 500 | Vec2f* fp = 0; |
| 501 | DivStruct* ds = 0; |
| 502 | uchar* mean = 0; |
| 503 | uchar* stddev = 0; |
| 504 | bool stdmtx = false; |
| 505 | int n1 = (int)_param1.total(); |
| 506 | int n2 = (int)_param2.total(); |
| 507 | |
| 508 | if( disttype == UNIFORM ) |
| 509 | { |
| 510 | _parambuf.allocate(cn*8 + n1 + n2); |
| 511 | double* parambuf = _parambuf; |
| 512 | double* p1 = (double*)_param1.data; |
| 513 | double* p2 = (double*)_param2.data; |
| 514 | |
| 515 | if( !_param1.isContinuous() || _param1.type() != CV_64F || n1 != cn ) |
| 516 | { |
| 517 | Mat tmp(_param1.size(), CV_64F, parambuf); |
| 518 | _param1.convertTo(tmp, CV_64F); |
| 519 | p1 = parambuf; |
| 520 | if( n1 < cn ) |
| 521 | for( j = n1; j < cn; j++ ) |
| 522 | p1[j] = p1[j-n1]; |
| 523 | } |
| 524 | |
| 525 | if( !_param2.isContinuous() || _param2.type() != CV_64F || n2 != cn ) |
| 526 | { |
| 527 | Mat tmp(_param2.size(), CV_64F, parambuf + cn); |
| 528 | _param2.convertTo(tmp, CV_64F); |
| 529 | p2 = parambuf + cn; |
| 530 | if( n2 < cn ) |
| 531 | for( j = n2; j < cn; j++ ) |
| 532 | p2[j] = p2[j-n2]; |
| 533 | } |
| 534 | |
| 535 | if( depth <= CV_32S ) |
| 536 | { |