@@ -2574,20 +2574,68 @@ static bool ipp_warpAffine( InputArray _src, OutputArray _dst, int interpolation
25742574
25752575namespace hal {
25762576
2577- void warpAffine (int src_type,
2578- const uchar * src_data, size_t src_step, int src_width, int src_height,
2579- uchar * dst_data, size_t dst_step, int dst_width, int dst_height,
2580- const double M[6 ], int interpolation, int borderType, const double borderValue[4 ])
2577+ static void warpAffine (int src_type,
2578+ const uchar * src_data, size_t src_step, int src_width, int src_height,
2579+ uchar * dst_data, size_t dst_step, int dst_width, int dst_height,
2580+ const double M[6 ], int interpolation, int borderType, const double borderValue[4 ], AlgorithmHint hint )
25812581{
25822582 CALL_HAL (warpAffine, cv_hal_warpAffine, src_type, src_data, src_step, src_width, src_height, dst_data, dst_step, dst_width, dst_height, M, interpolation, borderType, borderValue);
25832583
25842584 Mat src (Size (src_width, src_height), src_type, const_cast <uchar*>(src_data), src_step);
25852585 Mat dst (Size (dst_width, dst_height), src_type, dst_data, dst_step);
25862586
2587- if (interpolation == INTER_LINEAR &&
2588- (dst.channels () == 1 || dst.channels () == 3 || dst.channels () == 4 ) &&
2589- (dst.depth () == CV_8U || dst.depth () == CV_16U || dst.depth () == CV_32F)) {
2590- CV_CPU_DISPATCH (warpAffineSimdInvoker, (dst, src, M, interpolation, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2587+ if (interpolation == INTER_LINEAR) {
2588+ switch (src_type) {
2589+ case CV_8UC1: {
2590+ if (hint == cv::ALGO_HINT_APPROX) {
2591+ CV_CPU_DISPATCH (warpAffineLinearApproxInvoker_8UC1, (src_data, src_step, src_height, src_width, dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2592+ } else {
2593+ CV_CPU_DISPATCH (warpAffineLinearInvoker_8UC1, (src_data, src_step, src_height, src_width, dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2594+ }
2595+ break ;
2596+ }
2597+ case CV_8UC3: {
2598+ if (hint == cv::ALGO_HINT_APPROX) {
2599+ CV_CPU_DISPATCH (warpAffineLinearApproxInvoker_8UC3, (src_data, src_step, src_height, src_width, dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2600+ } else {
2601+ CV_CPU_DISPATCH (warpAffineLinearInvoker_8UC3, (src_data, src_step, src_height, src_width, dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2602+ }
2603+ break ;
2604+ }
2605+ case CV_8UC4: {
2606+ if (hint == cv::ALGO_HINT_APPROX) {
2607+ CV_CPU_DISPATCH (warpAffineLinearApproxInvoker_8UC4, (src_data, src_step, src_height, src_width, dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2608+ } else {
2609+ CV_CPU_DISPATCH (warpAffineLinearInvoker_8UC4, (src_data, src_step, src_height, src_width, dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2610+ }
2611+ break ;
2612+ }
2613+ case CV_16UC1: {
2614+ CV_CPU_DISPATCH (warpAffineLinearInvoker_16UC1, ((const uint16_t *)src_data, src_step, src_height, src_width, (uint16_t *)dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2615+ break ;
2616+ }
2617+ case CV_16UC3: {
2618+ CV_CPU_DISPATCH (warpAffineLinearInvoker_16UC3, ((const uint16_t *)src_data, src_step, src_height, src_width, (uint16_t *)dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2619+ break ;
2620+ }
2621+ case CV_16UC4: {
2622+ CV_CPU_DISPATCH (warpAffineLinearInvoker_16UC4, ((const uint16_t *)src_data, src_step, src_height, src_width, (uint16_t *)dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2623+ break ;
2624+ }
2625+ case CV_32FC1: {
2626+ CV_CPU_DISPATCH (warpAffineLinearInvoker_32FC1, ((const float *)src_data, src_step, src_height, src_width, (float *)dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2627+ break ;
2628+ }
2629+ case CV_32FC3: {
2630+ CV_CPU_DISPATCH (warpAffineLinearInvoker_32FC3, ((const float *)src_data, src_step, src_height, src_width, (float *)dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2631+ break ;
2632+ }
2633+ case CV_32FC4: {
2634+ CV_CPU_DISPATCH (warpAffineLinearInvoker_32FC4, ((const float *)src_data, src_step, src_height, src_width, (float *)dst_data, dst_step, dst_height, dst_width, M, borderType, borderValue), CV_CPU_DISPATCH_MODES_ALL);
2635+ break ;
2636+ }
2637+ // no default
2638+ }
25912639 }
25922640
25932641 int x;
@@ -2706,10 +2754,14 @@ void warpAffineBlockline(int *adelta, int *bdelta, short* xy, short* alpha, int
27062754
27072755void cv::warpAffine ( InputArray _src, OutputArray _dst,
27082756 InputArray _M0, Size dsize,
2709- int flags, int borderType, const Scalar& borderValue )
2757+ int flags, int borderType, const Scalar& borderValue,
2758+ AlgorithmHint hint )
27102759{
27112760 CV_INSTRUMENT_REGION ();
27122761
2762+ if (hint == cv::ALGO_HINT_DEFAULT)
2763+ hint = cv::getDefaultAlgorithmHint ();
2764+
27132765 int interpolation = flags & INTER_MAX;
27142766 CV_Assert ( _src.channels () <= 4 || (interpolation != INTER_LANCZOS4 &&
27152767 interpolation != INTER_CUBIC) );
@@ -2817,7 +2869,7 @@ void cv::warpAffine( InputArray _src, OutputArray _dst,
28172869#endif
28182870
28192871 hal::warpAffine (src.type (), src.data , src.step , src.cols , src.rows , dst.data , dst.step , dst.cols , dst.rows ,
2820- M, interpolation, borderType, borderValue.val );
2872+ M, interpolation, borderType, borderValue.val , hint );
28212873}
28222874
28232875
0 commit comments