@@ -56,14 +56,14 @@ void absDiffScalar(const GpuMat& src, cv::Scalar val, bool, GpuMat& dst, const G
56
56
57
57
namespace
58
58
{
59
- template <typename T , typename S > struct AbsDiffScalarOp : unary_function<T, T >
59
+ template <typename SrcType , typename ScalarType, typename DstType > struct AbsDiffScalarOp : unary_function<SrcType, DstType >
60
60
{
61
- S val;
61
+ ScalarType val;
62
62
63
- __device__ __forceinline__ T operator ()(T a) const
63
+ __device__ __forceinline__ DstType operator ()(SrcType a) const
64
64
{
65
- abs_func<S > f;
66
- return saturate_cast<T >(f (a - val));
65
+ abs_func<ScalarType > f;
66
+ return saturate_cast<DstType >(f (saturate_cast<ScalarType>(a) - val));
67
67
}
68
68
};
69
69
@@ -77,34 +77,101 @@ namespace
77
77
};
78
78
};
79
79
80
- template <typename SrcType, typename ScalarDepth>
81
- void absDiffScalarImpl (const GpuMat& src, double value, GpuMat& dst, Stream& stream)
80
+ template <typename SrcType, typename ScalarDepth, typename DstType >
81
+ void absDiffScalarImpl (const GpuMat& src, cv::Scalar value, GpuMat& dst, Stream& stream)
82
82
{
83
- AbsDiffScalarOp<SrcType, ScalarDepth> op;
84
- op.val = static_cast <ScalarDepth>(value);
83
+ typedef typename MakeVec<ScalarDepth, VecTraits<SrcType>::cn>::type ScalarType;
84
+
85
+ cv::Scalar_<ScalarDepth> value_ = value;
86
+
87
+ AbsDiffScalarOp<SrcType, ScalarType, DstType> op;
88
+ op.val = VecTraits<ScalarType>::make (value_.val );
85
89
gridTransformUnary_< TransformPolicy<ScalarDepth> >(globPtr<SrcType>(src), globPtr<SrcType>(dst), op, stream);
86
90
}
87
91
}
88
92
89
93
void absDiffScalar (const GpuMat& src, cv::Scalar val, bool , GpuMat& dst, const GpuMat&, double , Stream& stream, int )
90
94
{
91
- typedef void (*func_t )(const GpuMat& src, double val, GpuMat& dst, Stream& stream);
92
- static const func_t funcs[] =
95
+ typedef void (*func_t )(const GpuMat& src, cv::Scalar val, GpuMat& dst, Stream& stream);
96
+ static const func_t funcs[7 ][ 7 ][ 4 ] =
93
97
{
94
- absDiffScalarImpl<uchar, float >,
95
- absDiffScalarImpl<schar, float >,
96
- absDiffScalarImpl<ushort, float >,
97
- absDiffScalarImpl<short , float >,
98
- absDiffScalarImpl<int , float >,
99
- absDiffScalarImpl<float , float >,
100
- absDiffScalarImpl<double , double >
98
+ {
99
+ {absDiffScalarImpl<uchar, float , uchar>, absDiffScalarImpl<uchar2 , float , uchar2 >, absDiffScalarImpl<uchar3 , float , uchar3 >, absDiffScalarImpl<uchar4 , float , uchar4 >},
100
+ {absDiffScalarImpl<uchar, float , schar>, absDiffScalarImpl<uchar2 , float , char2 >, absDiffScalarImpl<uchar3 , float , char3 >, absDiffScalarImpl<uchar4 , float , char4 >},
101
+ {absDiffScalarImpl<uchar, float , ushort>, absDiffScalarImpl<uchar2 , float , ushort2 >, absDiffScalarImpl<uchar3 , float , ushort3 >, absDiffScalarImpl<uchar4 , float , ushort4 >},
102
+ {absDiffScalarImpl<uchar, float , short >, absDiffScalarImpl<uchar2 , float , short2 >, absDiffScalarImpl<uchar3 , float , short3 >, absDiffScalarImpl<uchar4 , float , short4 >},
103
+ {absDiffScalarImpl<uchar, float , int >, absDiffScalarImpl<uchar2 , float , int2 >, absDiffScalarImpl<uchar3 , float , int3 >, absDiffScalarImpl<uchar4 , float , int4 >},
104
+ {absDiffScalarImpl<uchar, float , float >, absDiffScalarImpl<uchar2 , float , float2 >, absDiffScalarImpl<uchar3 , float , float3 >, absDiffScalarImpl<uchar4 , float , float4 >},
105
+ {absDiffScalarImpl<uchar, double , double >, absDiffScalarImpl<uchar2 , double , double2 >, absDiffScalarImpl<uchar3 , double , double3 >, absDiffScalarImpl<uchar4 , double , double4 >}
106
+ },
107
+ {
108
+ {absDiffScalarImpl<schar, float , uchar>, absDiffScalarImpl<char2 , float , uchar2 >, absDiffScalarImpl<char3 , float , uchar3 >, absDiffScalarImpl<char4 , float , uchar4 >},
109
+ {absDiffScalarImpl<schar, float , schar>, absDiffScalarImpl<char2 , float , char2 >, absDiffScalarImpl<char3 , float , char3 >, absDiffScalarImpl<char4 , float , char4 >},
110
+ {absDiffScalarImpl<schar, float , ushort>, absDiffScalarImpl<char2 , float , ushort2 >, absDiffScalarImpl<char3 , float , ushort3 >, absDiffScalarImpl<char4 , float , ushort4 >},
111
+ {absDiffScalarImpl<schar, float , short >, absDiffScalarImpl<char2 , float , short2 >, absDiffScalarImpl<char3 , float , short3 >, absDiffScalarImpl<char4 , float , short4 >},
112
+ {absDiffScalarImpl<schar, float , int >, absDiffScalarImpl<char2 , float , int2 >, absDiffScalarImpl<char3 , float , int3 >, absDiffScalarImpl<char4 , float , int4 >},
113
+ {absDiffScalarImpl<schar, float , float >, absDiffScalarImpl<char2 , float , float2 >, absDiffScalarImpl<char3 , float , float3 >, absDiffScalarImpl<char4 , float , float4 >},
114
+ {absDiffScalarImpl<schar, double , double >, absDiffScalarImpl<char2 , double , double2 >, absDiffScalarImpl<char3 , double , double3 >, absDiffScalarImpl<char4 , double , double4 >}
115
+ },
116
+ {
117
+ {0 /* absDiffScalarImpl<ushort, float, uchar>*/ , 0 /* absDiffScalarImpl<ushort2, float, uchar2>*/ , 0 /* absDiffScalarImpl<ushort3, float, uchar3>*/ , 0 /* absDiffScalarImpl<ushort4, float, uchar4>*/ },
118
+ {0 /* absDiffScalarImpl<ushort, float, schar>*/ , 0 /* absDiffScalarImpl<ushort2, float, char2>*/ , 0 /* absDiffScalarImpl<ushort3, float, char3>*/ , 0 /* absDiffScalarImpl<ushort4, float, char4>*/ },
119
+ {absDiffScalarImpl<ushort, float , ushort>, absDiffScalarImpl<ushort2 , float , ushort2 >, absDiffScalarImpl<ushort3 , float , ushort3 >, absDiffScalarImpl<ushort4 , float , ushort4 >},
120
+ {absDiffScalarImpl<ushort, float , short >, absDiffScalarImpl<ushort2 , float , short2 >, absDiffScalarImpl<ushort3 , float , short3 >, absDiffScalarImpl<ushort4 , float , short4 >},
121
+ {absDiffScalarImpl<ushort, float , int >, absDiffScalarImpl<ushort2 , float , int2 >, absDiffScalarImpl<ushort3 , float , int3 >, absDiffScalarImpl<ushort4 , float , int4 >},
122
+ {absDiffScalarImpl<ushort, float , float >, absDiffScalarImpl<ushort2 , float , float2 >, absDiffScalarImpl<ushort3 , float , float3 >, absDiffScalarImpl<ushort4 , float , float4 >},
123
+ {absDiffScalarImpl<ushort, double , double >, absDiffScalarImpl<ushort2 , double , double2 >, absDiffScalarImpl<ushort3 , double , double3 >, absDiffScalarImpl<ushort4 , double , double4 >}
124
+ },
125
+ {
126
+ {0 /* absDiffScalarImpl<short, float, uchar>*/ , 0 /* absDiffScalarImpl<short2, float, uchar2>*/ , 0 /* absDiffScalarImpl<short3, float, uchar3>*/ , 0 /* absDiffScalarImpl<short4, float, uchar4>*/ },
127
+ {0 /* absDiffScalarImpl<short, float, schar>*/ , 0 /* absDiffScalarImpl<short2, float, char2>*/ , 0 /* absDiffScalarImpl<short3, float, char3>*/ , 0 /* absDiffScalarImpl<short4, float, char4>*/ },
128
+ {absDiffScalarImpl<short , float , ushort>, absDiffScalarImpl<short2 , float , ushort2 >, absDiffScalarImpl<short3 , float , ushort3 >, absDiffScalarImpl<short4 , float , ushort4 >},
129
+ {absDiffScalarImpl<short , float , short >, absDiffScalarImpl<short2 , float , short2 >, absDiffScalarImpl<short3 , float , short3 >, absDiffScalarImpl<short4 , float , short4 >},
130
+ {absDiffScalarImpl<short , float , int >, absDiffScalarImpl<short2 , float , int2 >, absDiffScalarImpl<short3 , float , int3 >, absDiffScalarImpl<short4 , float , int4 >},
131
+ {absDiffScalarImpl<short , float , float >, absDiffScalarImpl<short2 , float , float2 >, absDiffScalarImpl<short3 , float , float3 >, absDiffScalarImpl<short4 , float , float4 >},
132
+ {absDiffScalarImpl<short , double , double >, absDiffScalarImpl<short2 , double , double2 >, absDiffScalarImpl<short3 , double , double3 >, absDiffScalarImpl<short4 , double , double4 >}
133
+ },
134
+ {
135
+ {0 /* absDiffScalarImpl<int, float, uchar>*/ , 0 /* absDiffScalarImpl<int2, float, uchar2>*/ , 0 /* absDiffScalarImpl<int3, float, uchar3>*/ , 0 /* absDiffScalarImpl<int4, float, uchar4>*/ },
136
+ {0 /* absDiffScalarImpl<int, float, schar>*/ , 0 /* absDiffScalarImpl<int2, float, char2>*/ , 0 /* absDiffScalarImpl<int3, float, char3>*/ , 0 /* absDiffScalarImpl<int4, float, char4>*/ },
137
+ {0 /* absDiffScalarImpl<int, float, ushort>*/ , 0 /* absDiffScalarImpl<int2, float, ushort2>*/ , 0 /* absDiffScalarImpl<int3, float, ushort3>*/ , 0 /* absDiffScalarImpl<int4, float, ushort4>*/ },
138
+ {0 /* absDiffScalarImpl<int, float, short>*/ , 0 /* absDiffScalarImpl<int2, float, short2>*/ , 0 /* absDiffScalarImpl<int3, float, short3>*/ , 0 /* absDiffScalarImpl<int4, float, short4>*/ },
139
+ {absDiffScalarImpl<int , float , int >, absDiffScalarImpl<int2 , float , int2 >, absDiffScalarImpl<int3 , float , int3 >, absDiffScalarImpl<int4 , float , int4 >},
140
+ {absDiffScalarImpl<int , float , float >, absDiffScalarImpl<int2 , float , float2 >, absDiffScalarImpl<int3 , float , float3 >, absDiffScalarImpl<int4 , float , float4 >},
141
+ {absDiffScalarImpl<int , double , double >, absDiffScalarImpl<int2 , double , double2 >, absDiffScalarImpl<int3 , double , double3 >, absDiffScalarImpl<int4 , double , double4 >}
142
+ },
143
+ {
144
+ {0 /* absDiffScalarImpl<float, float, uchar>*/ , 0 /* absDiffScalarImpl<float2, float, uchar2>*/ , 0 /* absDiffScalarImpl<float3, float, uchar3>*/ , 0 /* absDiffScalarImpl<float4, float, uchar4>*/ },
145
+ {0 /* absDiffScalarImpl<float, float, schar>*/ , 0 /* absDiffScalarImpl<float2, float, char2>*/ , 0 /* absDiffScalarImpl<float3, float, char3>*/ , 0 /* absDiffScalarImpl<float4, float, char4>*/ },
146
+ {0 /* absDiffScalarImpl<float, float, ushort>*/ , 0 /* absDiffScalarImpl<float2, float, ushort2>*/ , 0 /* absDiffScalarImpl<float3, float, ushort3>*/ , 0 /* absDiffScalarImpl<float4, float, ushort4>*/ },
147
+ {0 /* absDiffScalarImpl<float, float, short>*/ , 0 /* absDiffScalarImpl<float2, float, short2>*/ , 0 /* absDiffScalarImpl<float3, float, short3>*/ , 0 /* absDiffScalarImpl<float4, float, short4>*/ },
148
+ {0 /* absDiffScalarImpl<float, float, int>*/ , 0 /* absDiffScalarImpl<float2, float, int2>*/ , 0 /* absDiffScalarImpl<float3, float, int3>*/ , 0 /* absDiffScalarImpl<float4, float, int4>*/ },
149
+ {absDiffScalarImpl<float , float , float >, absDiffScalarImpl<float2 , float , float2 >, absDiffScalarImpl<float3 , float , float3 >, absDiffScalarImpl<float4 , float , float4 >},
150
+ {absDiffScalarImpl<float , double , double >, absDiffScalarImpl<float2 , double , double2 >, absDiffScalarImpl<float3 , double , double3 >, absDiffScalarImpl<float4 , double , double4 >}
151
+ },
152
+ {
153
+ {0 /* absDiffScalarImpl<double, double, uchar>*/ , 0 /* absDiffScalarImpl<double2, double, uchar2>*/ , 0 /* absDiffScalarImpl<double3, double, uchar3>*/ , 0 /* absDiffScalarImpl<double4, double, uchar4>*/ },
154
+ {0 /* absDiffScalarImpl<double, double, schar>*/ , 0 /* absDiffScalarImpl<double2, double, char2>*/ , 0 /* absDiffScalarImpl<double3, double, char3>*/ , 0 /* absDiffScalarImpl<double4, double, char4>*/ },
155
+ {0 /* absDiffScalarImpl<double, double, ushort>*/ , 0 /* absDiffScalarImpl<double2, double, ushort2>*/ , 0 /* absDiffScalarImpl<double3, double, ushort3>*/ , 0 /* absDiffScalarImpl<double4, double, ushort4>*/ },
156
+ {0 /* absDiffScalarImpl<double, double, short>*/ , 0 /* absDiffScalarImpl<double2, double, short2>*/ , 0 /* absDiffScalarImpl<double3, double, short3>*/ , 0 /* absDiffScalarImpl<double4, double, short4>*/ },
157
+ {0 /* absDiffScalarImpl<double, double, int>*/ , 0 /* absDiffScalarImpl<double2, double, int2>*/ , 0 /* absDiffScalarImpl<double3, double, int3>*/ , 0 /* absDiffScalarImpl<double4, double, int4>*/ },
158
+ {0 /* absDiffScalarImpl<double, double, float>*/ , 0 /* absDiffScalarImpl<double2, double, float2>*/ , 0 /* absDiffScalarImpl<double3, double, float3>*/ , 0 /* absDiffScalarImpl<double4, double, float4>*/ },
159
+ {absDiffScalarImpl<double , double , double >, absDiffScalarImpl<double2 , double , double2 >, absDiffScalarImpl<double3 , double , double3 >, absDiffScalarImpl<double4 , double , double4 >}
160
+ }
101
161
};
102
162
103
- const int depth = src.depth ();
163
+ const int sdepth = src.depth ();
164
+ const int ddepth = dst.depth ();
165
+ const int cn = src.channels ();
166
+
167
+ CV_DbgAssert ( sdepth <= CV_64F && ddepth <= CV_64F && cn <= 4 );
168
+
169
+ const func_t func = funcs[sdepth][ddepth][cn - 1 ];
104
170
105
- CV_DbgAssert ( depth <= CV_64F );
171
+ if (!func)
172
+ CV_Error (cv::Error::StsUnsupportedFormat, " Unsupported combination of source and destination types" );
106
173
107
- funcs[depth] (src, val[ 0 ] , dst, stream);
174
+ func (src, val, dst, stream);
108
175
}
109
176
110
177
#endif
0 commit comments