Compute Library
 21.02
NEWarpKernel.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016-2020 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_NEWARPKERNEL_H
25 #define ARM_COMPUTE_NEWARPKERNEL_H
26 
27 #include "arm_compute/core/Types.h"
29 
30 #include <array>
31 #include <cstdint>
32 namespace arm_compute
33 {
34 class ITensor;
35 
36 /** Common interface for warp affine and warp perspective */
37 class INEWarpKernel : public INEKernel
38 {
39 public:
40  /** Default constructor */
41  INEWarpKernel();
42  /** Prevent instances of this class from being copied (As this class contains pointers) */
43  INEWarpKernel(const INEWarpKernel &) = delete;
44  /** Prevent instances of this class from being copied (As this class contains pointers) */
45  INEWarpKernel &operator=(const INEWarpKernel &) = delete;
46  /** Allow instances of this class to be moved */
47  INEWarpKernel(INEWarpKernel &&) = default;
48  /** Allow instances of this class to be moved */
49  INEWarpKernel &operator=(INEWarpKernel &&) = default;
50  /** Default destructor */
51  ~INEWarpKernel() = default;
52  /** Initialise the kernel's input, output and border mode.
53  *
54  * @param[in] input Source tensor. Data type supported: U8.
55  * @param[out] output Destination tensor. Data type supported: U8.
56  * @param[in] matrix The perspective or affine matrix to use. Must be 2x3 for affine and 3x3 for perspective of type float.
57  * The matrix argument requires 9 values, for the affine case the last 3 values are ignored.
58  * @param[in] border_mode Strategy to use for borders
59  * @param[in] constant_border_value Constant value used for filling the border.
60  */
61  virtual void configure(const ITensor *input, ITensor *output, const std::array<float, 9> &matrix, BorderMode border_mode, uint8_t constant_border_value);
62 
63  // Inherited methods overridden:
64  void run(const Window &window, const ThreadInfo &info) override;
65 
66  // Inherited methods overridden:
67  BorderSize border_size() const override;
68 
69 protected:
70  /** function to perform warp affine or warp perspective on the given window when border mode == UNDEFINED
71  *
72  * @param[in] window Region on which to execute the kernel
73  */
74  virtual void warp_undefined(const Window &window) = 0;
75  /** function to perform warp affine or warp perspective on the given window when border mode == CONSTANT
76  *
77  * @param[in] window Region on which to execute the kernel
78  */
79  virtual void warp_constant(const Window &window) = 0;
80  /** function to perform warp affine or warp perspective on the given window when border mode == REPLICATE
81  *
82  * @param[in] window Region on which to execute the kernel
83  */
84  virtual void warp_replicate(const Window &window) = 0;
85  /** Common signature for all the specialised warp functions
86  *
87  * @param[in] window Region on which to execute the kernel.
88  */
89  void (INEWarpKernel::*_func)(const Window &window);
90 
91  const ITensor *_input; /**< Input Tensor */
92  ITensor *_output; /**< Output Tensor */
93  uint8_t _constant_border_value; /**< Constant value used for filling the border. This value is used for those pixels out of the ROI when the border mode is CONSTANT */
94  std::array<float, 9> _matrix; /**< The affine or perspective matrix. Must be 2x3 for warp affine or 3x3 for warp perspective of type float. */
95 };
96 
97 /** Template interface for the kernel to compute warp affine
98  *
99  */
100 template <InterpolationPolicy interpolation>
102 {
103 private:
104  const char *name() const override
105  {
106  return "NEWarpAffineKernel";
107  }
108  // Inherited methods overridden:
109  void warp_undefined(const Window &window) override;
110  void warp_constant(const Window &window) override;
111  void warp_replicate(const Window &window) override;
112 };
113 
114 /** Template interface for the kernel to compute warp perspective
115  *
116  */
117 template <InterpolationPolicy interpolation>
119 {
120 private:
121  const char *name() const override
122  {
123  return "NEWarpPerspectiveKernel";
124  }
125  // Inherited methods overridden:
126  void warp_undefined(const Window &window) override;
127  void warp_constant(const Window &window) override;
128  void warp_replicate(const Window &window) override;
129 };
130 } // namespace arm_compute
131 #endif /*ARM_COMPUTE_NEWARPKERNEL_H */
BorderMode
Methods available to handle borders.
Definition: Types.h:265
const Window & window() const
The maximum window the kernel can be executed on.
Definition: IKernel.cpp:28
Container for 2D border size.
Definition: Types.h:273
Common interface for all kernels implemented in C++.
Definition: ICPPKernel.h:38
void run(const Window &window, const ThreadInfo &info) override
Execute the kernel on the passed window.
Common interface for warp affine and warp perspective.
Definition: NEWarpKernel.h:37
INEWarpKernel()
Default constructor.
Interface for Neon tensor.
Definition: ITensor.h:36
Copyright (c) 2017-2021 Arm Limited.
~INEWarpKernel()=default
Default destructor.
Template interface for the kernel to compute warp affine.
Definition: NEWarpKernel.h:101
BorderSize border_size() const override
The size of the border for that kernel.
ScaleKernelInfo info(interpolation_policy, default_border_mode, PixelValue(), sampling_policy, false)
Information about executing thread and CPU.
Definition: CPPTypes.h:235
INEWarpKernel & operator=(const INEWarpKernel &)=delete
Prevent instances of this class from being copied (As this class contains pointers) ...
Describe a multidimensional execution window.
Definition: Window.h:39
virtual const char * name() const =0
Name of the kernel.
Template interface for the kernel to compute warp perspective.
Definition: NEWarpKernel.h:118
virtual void configure(const ITensor *input, ITensor *output, const std::array< float, 9 > &matrix, BorderMode border_mode, uint8_t constant_border_value)
Initialise the kernel&#39;s input, output and border mode.