| 2533 | } |
| 2534 | |
| 2535 | void cv::mulTransposed( InputArray _src, OutputArray _dst, bool ata, |
| 2536 | InputArray _delta, double scale, int dtype ) |
| 2537 | { |
| 2538 | Mat src = _src.getMat(), delta = _delta.getMat(); |
| 2539 | const int gemm_level = 100; // boundary above which GEMM is faster. |
| 2540 | int stype = src.type(); |
| 2541 | dtype = std::max(std::max(CV_MAT_DEPTH(dtype >= 0 ? dtype : stype), delta.depth()), CV_32F); |
| 2542 | CV_Assert( src.channels() == 1 ); |
| 2543 | |
| 2544 | if( delta.data ) |
| 2545 | { |
| 2546 | CV_Assert( delta.channels() == 1 && |
| 2547 | (delta.rows == src.rows || delta.rows == 1) && |
| 2548 | (delta.cols == src.cols || delta.cols == 1)); |
| 2549 | if( delta.type() != dtype ) |
| 2550 | delta.convertTo(delta, dtype); |
| 2551 | } |
| 2552 | |
| 2553 | int dsize = ata ? src.cols : src.rows; |
| 2554 | _dst.create( dsize, dsize, dtype ); |
| 2555 | Mat dst = _dst.getMat(); |
| 2556 | |
| 2557 | if( src.data == dst.data || (stype == dtype && |
| 2558 | (dst.cols >= gemm_level && dst.rows >= gemm_level && |
| 2559 | src.cols >= gemm_level && src.rows >= gemm_level))) |
| 2560 | { |
| 2561 | Mat src2; |
| 2562 | const Mat* tsrc = &src; |
| 2563 | if( delta.data ) |
| 2564 | { |
| 2565 | if( delta.size() == src.size() ) |
| 2566 | subtract( src, delta, src2 ); |
| 2567 | else |
| 2568 | { |
| 2569 | repeat(delta, src.rows/delta.rows, src.cols/delta.cols, src2); |
| 2570 | subtract( src, src2, src2 ); |
| 2571 | } |
| 2572 | tsrc = &src2; |
| 2573 | } |
| 2574 | gemm( *tsrc, *tsrc, scale, Mat(), 0, dst, ata ? GEMM_1_T : GEMM_2_T ); |
| 2575 | } |
| 2576 | else |
| 2577 | { |
| 2578 | MulTransposedFunc func = 0; |
| 2579 | if(stype == CV_8U && dtype == CV_32F) |
| 2580 | { |
| 2581 | if(ata) |
| 2582 | func = MulTransposedR<uchar,float>; |
| 2583 | else |
| 2584 | func = MulTransposedL<uchar,float>; |
| 2585 | } |
| 2586 | else if(stype == CV_8U && dtype == CV_64F) |
| 2587 | { |
| 2588 | if(ata) |
| 2589 | func = MulTransposedR<uchar,double>; |
| 2590 | else |
| 2591 | func = MulTransposedL<uchar,double>; |
| 2592 | } |