Skip to content

Commit 041b84d

Browse files
committed
Added cuda merge branch with vector instead of tuple.
1 parent dd22c2d commit 041b84d

File tree

6 files changed

+178
-43
lines changed

6 files changed

+178
-43
lines changed

modules/cudaarithm/src/cuda/polar_cart.cu

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -132,24 +132,24 @@ void cv::cuda::cartToPolar(InputArray _x, InputArray _y, OutputArray _mag, Outpu
132132
GpuMat_<float> magc(mag.reshape(1));
133133
GpuMat_<float> anglec(angle.reshape(1));
134134

135-
if (angleInDegrees)
136-
{
137-
gridTransformTuple(zipPtr(xc, yc),
138-
tie(magc, anglec),
139-
make_tuple(
140-
binaryTupleAdapter<0, 1>(magnitude_func<float>()),
141-
binaryTupleAdapter<0, 1>(direction_func<float, true>())),
142-
stream);
143-
}
144-
else
145-
{
146-
gridTransformTuple(zipPtr(xc, yc),
147-
tie(magc, anglec),
148-
make_tuple(
149-
binaryTupleAdapter<0, 1>(magnitude_func<float>()),
150-
binaryTupleAdapter<0, 1>(direction_func<float, false>())),
151-
stream);
152-
}
135+
// if (angleInDegrees)
136+
// {
137+
// gridTransformTuple(zipPtr(xc, yc),
138+
// tie(magc, anglec),
139+
// make_tuple(
140+
// binaryTupleAdapter<0, 1>(magnitude_func<float>()),
141+
// binaryTupleAdapter<0, 1>(direction_func<float, true>())),
142+
// stream);
143+
// }
144+
// else
145+
// {
146+
// gridTransformTuple(zipPtr(xc, yc),
147+
// tie(magc, anglec),
148+
// make_tuple(
149+
// binaryTupleAdapter<0, 1>(magnitude_func<float>()),
150+
// binaryTupleAdapter<0, 1>(direction_func<float, false>())),
151+
// stream);
152+
// }
153153

154154
syncOutput(mag, _mag, stream);
155155
syncOutput(angle, _angle, stream);

modules/cudaarithm/src/cuda/split_merge.cu

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ namespace
6767
{
6868
static void call(const GpuMat* src, GpuMat& dst, Stream& stream)
6969
{
70-
gridMerge(zipPtr(globPtr<T>(src[0]), globPtr<T>(src[1])),
70+
const std::vector<GlobPtrSz<T>> d_src = {globPtr<T>(src[0]), globPtr<T>(src[1])};
71+
gridMerge(d_src,
7172
globPtr<typename MakeVec<T, 2>::type>(dst),
7273
stream);
7374
}
@@ -77,7 +78,8 @@ namespace
7778
{
7879
static void call(const GpuMat* src, GpuMat& dst, Stream& stream)
7980
{
80-
gridMerge(zipPtr(globPtr<T>(src[0]), globPtr<T>(src[1]), globPtr<T>(src[2])),
81+
const std::vector<GlobPtrSz<T>> d_src = {globPtr<T>(src[0]), globPtr<T>(src[1]), globPtr<T>(src[2])};
82+
gridMerge(d_src,
8183
globPtr<typename MakeVec<T, 3>::type>(dst),
8284
stream);
8385
}
@@ -87,7 +89,8 @@ namespace
8789
{
8890
static void call(const GpuMat* src, GpuMat& dst, Stream& stream)
8991
{
90-
gridMerge(zipPtr(globPtr<T>(src[0]), globPtr<T>(src[1]), globPtr<T>(src[2]), globPtr<T>(src[3])),
92+
const std::vector<GlobPtrSz<T> > d_src = {globPtr<T>(src[0]), globPtr<T>(src[1]), globPtr<T>(src[2]), globPtr<T>(src[3])};
93+
gridMerge(d_src,
9194
globPtr<typename MakeVec<T, 4>::type>(dst),
9295
stream);
9396
}

modules/cudev/include/opencv2/cudev/grid/detail/split_merge.hpp

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,28 +157,47 @@ namespace grid_split_merge_detail
157157
template <class Policy> struct MergeImpl<2, Policy>
158158
{
159159
template <class SrcPtrTuple, typename DstType, class MaskPtr>
160-
__host__ static void merge(const SrcPtrTuple& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
160+
__host__ static void mergeTuple(const SrcPtrTuple& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
161161
{
162162
mergeC2<Policy>(get<0>(src), get<1>(src), dst, mask, rows, cols, stream);
163163
}
164+
165+
template <typename VecType, typename DstType, class MaskPtr>
166+
__host__ static void mergeVector(const std::vector<VecType>& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
167+
{
168+
mergeC2<Policy>(src[0], src[1], dst, mask, rows, cols, stream);
169+
}
170+
164171
};
165172

166173
template <class Policy> struct MergeImpl<3, Policy>
167174
{
168175
template <class SrcPtrTuple, typename DstType, class MaskPtr>
169-
__host__ static void merge(const SrcPtrTuple& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
176+
__host__ static void mergeTuple(const SrcPtrTuple& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
170177
{
171178
mergeC3<Policy>(get<0>(src), get<1>(src), get<2>(src), dst, mask, rows, cols, stream);
172179
}
180+
181+
template <typename VecType, typename DstType, class MaskPtr>
182+
__host__ static void mergeVector(const std::vector<VecType>& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
183+
{
184+
mergeC3<Policy>(src[0], src[1], src[2], dst, mask, rows, cols, stream);
185+
}
173186
};
174187

175188
template <class Policy> struct MergeImpl<4, Policy>
176189
{
177190
template <class SrcPtrTuple, typename DstType, class MaskPtr>
178-
__host__ static void merge(const SrcPtrTuple& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
191+
__host__ static void mergeTuple(const SrcPtrTuple& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
179192
{
180193
mergeC4<Policy>(get<0>(src), get<1>(src), get<2>(src), get<3>(src), dst, mask, rows, cols, stream);
181194
}
195+
196+
template <typename VecType, typename DstType, class MaskPtr>
197+
__host__ static void mergeVector(const std::vector<VecType>& src, const GlobPtr<DstType>& dst, const MaskPtr& mask, int rows, int cols, cudaStream_t stream)
198+
{
199+
mergeC4<Policy>(src[0], src[1], src[2], src[3], dst, mask, rows, cols, stream);
200+
}
182201
};
183202

184203
// split

modules/cudev/include/opencv2/cudev/grid/split_merge.hpp

Lines changed: 115 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,11 @@ __host__ void gridMerge_(const SrcPtrTuple& src, GpuMat_<DstType>& dst, const Ma
7272

7373
dst.create(rows, cols);
7474

75-
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src),
76-
shrinkPtr(dst),
77-
shrinkPtr(mask),
78-
rows, cols,
79-
StreamAccessor::getStream(stream));
75+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeTuple(shrinkPtr(src),
76+
shrinkPtr(dst),
77+
shrinkPtr(mask),
78+
rows, cols,
79+
StreamAccessor::getStream(stream));
8080
}
8181

8282
template <class Policy, class SrcPtrTuple, typename DstType, class MaskPtr>
@@ -90,7 +90,7 @@ __host__ void gridMerge_(const SrcPtrTuple& src, const GlobPtrSz<DstType>& dst,
9090
CV_Assert( getRows(dst) == rows && getCols(dst) == cols );
9191
CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
9292

93-
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src),
93+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeTuple(shrinkPtr(src),
9494
shrinkPtr(dst),
9595
shrinkPtr(mask),
9696
rows, cols,
@@ -107,30 +107,104 @@ __host__ void gridMerge_(const SrcPtrTuple& src, GpuMat_<DstType>& dst, Stream&
107107

108108
dst.create(rows, cols);
109109

110-
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src),
111-
shrinkPtr(dst),
112-
WithOutMask(),
113-
rows, cols,
114-
StreamAccessor::getStream(stream));
110+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeTuple(shrinkPtr(src),
111+
shrinkPtr(dst),
112+
WithOutMask(),
113+
rows, cols,
114+
StreamAccessor::getStream(stream));
115115
}
116116

117117
template <class Policy, class SrcPtrTuple, typename DstType>
118118
__host__ void gridMerge_(const SrcPtrTuple& src, const GlobPtrSz<DstType>& dst, Stream& stream = Stream::Null())
119119
{
120-
//CV_StaticAssert( VecTraits<DstType>::cn == tuple_size<SrcPtrTuple>::value, "" );
120+
CV_StaticAssert( VecTraits<DstType>::cn == tuple_size<SrcPtrTuple>::value, "" );
121121

122122
const int rows = getRows(src);
123123
const int cols = getCols(src);
124124

125125
CV_Assert( getRows(dst) == rows && getCols(dst) == cols );
126126

127-
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::merge(shrinkPtr(src),
128-
shrinkPtr(dst),
129-
WithOutMask(),
130-
rows, cols,
131-
StreamAccessor::getStream(stream));
127+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeTuple(shrinkPtr(src),
128+
shrinkPtr(dst),
129+
WithOutMask(),
130+
rows, cols,
131+
StreamAccessor::getStream(stream));
132+
}
133+
134+
template <class Policy, typename VecType, typename DstType, class MaskPtr>
135+
__host__ void gridMergeVector_(const std::vector<VecType>& src, GpuMat_<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
136+
{
137+
CV_Assert( VecTraits<DstType>::cn == src.size() );
138+
139+
const int rows = getRows(src);
140+
const int cols = getCols(src);
141+
142+
CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
143+
144+
dst.create(rows, cols);
145+
146+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeVector(src,
147+
shrinkPtr(dst),
148+
shrinkPtr(mask),
149+
rows, cols,
150+
StreamAccessor::getStream(stream));
151+
}
152+
153+
template <class Policy, typename VecType, typename DstType, class MaskPtr>
154+
__host__ void gridMergeVector_(const std::vector<VecType>& src, const GlobPtrSz<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
155+
{
156+
CV_Assert( VecTraits<DstType>::cn == src.size() );
157+
158+
const int rows = src[0].rows;
159+
const int cols = src[0].cols;
160+
161+
CV_Assert( getRows(dst) == rows && getCols(dst) == cols );
162+
CV_Assert( getRows(mask) == rows && getCols(mask) == cols );
163+
164+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeVector(src,
165+
shrinkPtr(dst),
166+
shrinkPtr(mask),
167+
rows, cols,
168+
StreamAccessor::getStream(stream));
169+
}
170+
171+
template <class Policy, typename VecType, typename DstType>
172+
__host__ void gridMergeVector_(const std::vector<VecType>& src, GpuMat_<DstType>& dst, Stream& stream = Stream::Null())
173+
{
174+
CV_Assert( VecTraits<DstType>::cn == src.size() );
175+
176+
const int rows = src[0].rows;
177+
const int cols = src[0].cols;
178+
179+
dst.create(rows, cols);
180+
181+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeVector(src,
182+
shrinkPtr(dst),
183+
WithOutMask(),
184+
rows, cols,
185+
StreamAccessor::getStream(stream));
186+
}
187+
188+
template <class Policy, typename VecType, typename DstType>
189+
__host__ void gridMergeVector_(const std::vector<VecType>& src, const GlobPtrSz<DstType>& dst, Stream& stream = Stream::Null())
190+
{
191+
CV_Assert( VecTraits<DstType>::cn == src.size() );
192+
193+
const int rows = src[0].rows;
194+
const int cols = src[0].cols;
195+
196+
CV_Assert( getRows(dst) == rows && getCols(dst) == cols );
197+
198+
grid_split_merge_detail::MergeImpl<VecTraits<DstType>::cn, Policy>::mergeVector(src,
199+
shrinkPtr(dst),
200+
WithOutMask(),
201+
rows, cols,
202+
StreamAccessor::getStream(stream));
132203
}
133204

205+
206+
///////////////////////////////////////////////////////////////
207+
134208
template <class Policy, class SrcPtr, typename DstType, class MaskPtr>
135209
__host__ void gridSplit_(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
136210
{
@@ -522,6 +596,30 @@ __host__ void gridMerge(const SrcPtrTuple& src, const GlobPtrSz<DstType>& dst, S
522596
gridMerge_<DefaultSplitMergePolicy>(src, dst, stream);
523597
}
524598

599+
template <typename VecType, typename DstType, class MaskPtr>
600+
__host__ void gridMergeVector(const std::vector<VecType>& src, GpuMat_<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
601+
{
602+
gridMergeVector_<DefaultSplitMergePolicy>(src, dst, mask, stream);
603+
}
604+
605+
template <typename VecType, typename DstType, class MaskPtr>
606+
__host__ void gridMerge(const std::vector<VecType>& src, const GlobPtrSz<DstType>& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
607+
{
608+
gridMergeVector_<DefaultSplitMergePolicy>(src, dst, mask, stream);
609+
}
610+
611+
template <typename VecType, typename DstType>
612+
__host__ void gridMerge(const std::vector<VecType>& src, GpuMat_<DstType>& dst, Stream& stream = Stream::Null())
613+
{
614+
gridMergeVector_<DefaultSplitMergePolicy>(src, dst, stream);
615+
}
616+
617+
template <typename VecType, typename DstType>
618+
__host__ void gridMerge(const std::vector<VecType>& src, const GlobPtrSz<DstType>& dst, Stream& stream = Stream::Null())
619+
{
620+
gridMergeVector_<DefaultSplitMergePolicy>(src, dst, stream);
621+
}
622+
525623
template <class SrcPtr, typename DstType, class MaskPtr>
526624
__host__ void gridSplit(const SrcPtr& src, const tuple< GpuMat_<DstType>&, GpuMat_<DstType>& >& dst, const MaskPtr& mask, Stream& stream = Stream::Null())
527625
{

modules/cudev/include/opencv2/cudev/ptr2d/glob.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,18 @@ __host__ GlobPtrSz<T> globPtr(const GpuMat& mat)
118118
return p;
119119
}
120120

121+
template <typename T>
122+
__host__ GlobPtrSz<T> globPtr(const GpuMat_<T>& mat)
123+
{
124+
GlobPtrSz<T> p;
125+
p.data = (T*) mat.data;
126+
p.step = mat.step;
127+
p.rows = mat.rows;
128+
p.cols = mat.cols;
129+
return p;
130+
}
131+
132+
121133
template <typename T> struct PtrTraits< GlobPtrSz<T> > : PtrTraitsBase<GlobPtrSz<T>, GlobPtr<T> >
122134
{
123135
};

modules/cudev/test/test_split_merge.cu

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public:
7070
GpuMat_<T> d_src2(src2);
7171

7272
GpuMat_<typename MakeVec<T, 2>::type> dst;
73-
gridMerge(zipPtr(d_src1, d_src2), dst);
73+
std::vector<GlobPtrSz<T> > d_src = {globPtr(d_src1), globPtr(d_src2)};
74+
gridMerge(d_src, dst);
7475

7576
Mat dst_gold;
7677
Mat srcs[] = {src1, src2};
@@ -93,8 +94,10 @@ public:
9394
GpuMat_<T> d_src2(src2);
9495
GpuMat_<T> d_src3(src3);
9596

97+
std::vector<GlobPtrSz<T> > d_src = {globPtr(d_src1), globPtr(d_src2), globPtr(d_src3)};
98+
9699
GpuMat_<typename MakeVec<T, 3>::type> dst;
97-
gridMerge(zipPtr(d_src1, d_src2, d_src3), dst);
100+
gridMerge(d_src, dst);
98101

99102
Mat dst_gold;
100103
Mat srcs[] = {src1, src2, src3};

0 commit comments

Comments
 (0)