Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
0fa06b1d
O
Opencv
项目概览
Greenplum
/
Opencv
大约 1 年 前同步成功
通知
7
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0fa06b1d
编写于
7月 22, 2020
作者:
M
Maksim Shabunin
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #17863 from nglee:dev_cudaDetachOutput
上级
5444a6b1
9411cd6c
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
56 addition
and
1 deletion
+56
-1
modules/cudaarithm/src/core.cpp
modules/cudaarithm/src/core.cpp
+43
-1
modules/cudaarithm/test/test_core.cpp
modules/cudaarithm/test/test_core.cpp
+13
-0
未找到文件。
modules/cudaarithm/src/core.cpp
浏览文件 @
0fa06b1d
...
...
@@ -102,6 +102,34 @@ namespace
cudaSafeCall
(
cudaDeviceSynchronize
()
);
}
};
template
<
int
DEPTH
>
struct
NppMirrorIFunc
{
typedef
typename
NppTypeTraits
<
DEPTH
>::
npp_t
npp_t
;
typedef
NppStatus
(
*
func_t
)(
npp_t
*
pSrcDst
,
int
nSrcDstStep
,
NppiSize
oROI
,
NppiAxis
flip
);
};
template
<
int
DEPTH
,
typename
NppMirrorIFunc
<
DEPTH
>
::
func_t
func
>
struct
NppMirrorI
{
typedef
typename
NppMirrorIFunc
<
DEPTH
>::
npp_t
npp_t
;
static
void
call
(
GpuMat
&
srcDst
,
int
flipCode
,
cudaStream_t
stream
)
{
NppStreamHandler
h
(
stream
);
NppiSize
sz
;
sz
.
width
=
srcDst
.
cols
;
sz
.
height
=
srcDst
.
rows
;
nppSafeCall
(
func
(
srcDst
.
ptr
<
npp_t
>
(),
static_cast
<
int
>
(
srcDst
.
step
),
sz
,
(
flipCode
==
0
?
NPP_HORIZONTAL_AXIS
:
(
flipCode
>
0
?
NPP_VERTICAL_AXIS
:
NPP_BOTH_AXIS
)))
);
if
(
stream
==
0
)
cudaSafeCall
(
cudaDeviceSynchronize
()
);
}
};
}
void
cv
::
cuda
::
flip
(
InputArray
_src
,
OutputArray
_dst
,
int
flipCode
,
Stream
&
stream
)
...
...
@@ -117,6 +145,17 @@ void cv::cuda::flip(InputArray _src, OutputArray _dst, int flipCode, Stream& str
{
NppMirror
<
CV_32F
,
nppiMirror_32f_C1R
>::
call
,
0
,
NppMirror
<
CV_32F
,
nppiMirror_32f_C3R
>::
call
,
NppMirror
<
CV_32F
,
nppiMirror_32f_C4R
>::
call
}
};
typedef
void
(
*
ifunc_t
)(
GpuMat
&
srcDst
,
int
flipCode
,
cudaStream_t
stream
);
static
const
ifunc_t
ifuncs
[
6
][
4
]
=
{
{
NppMirrorI
<
CV_8U
,
nppiMirror_8u_C1IR
>::
call
,
0
,
NppMirrorI
<
CV_8U
,
nppiMirror_8u_C3IR
>::
call
,
NppMirrorI
<
CV_8U
,
nppiMirror_8u_C4IR
>::
call
},
{
0
,
0
,
0
,
0
},
{
NppMirrorI
<
CV_16U
,
nppiMirror_16u_C1IR
>::
call
,
0
,
NppMirrorI
<
CV_16U
,
nppiMirror_16u_C3IR
>::
call
,
NppMirrorI
<
CV_16U
,
nppiMirror_16u_C4IR
>::
call
},
{
0
,
0
,
0
,
0
},
{
NppMirrorI
<
CV_32S
,
nppiMirror_32s_C1IR
>::
call
,
0
,
NppMirrorI
<
CV_32S
,
nppiMirror_32s_C3IR
>::
call
,
NppMirrorI
<
CV_32S
,
nppiMirror_32s_C4IR
>::
call
},
{
NppMirrorI
<
CV_32F
,
nppiMirror_32f_C1IR
>::
call
,
0
,
NppMirrorI
<
CV_32F
,
nppiMirror_32f_C3IR
>::
call
,
NppMirrorI
<
CV_32F
,
nppiMirror_32f_C4IR
>::
call
}
};
GpuMat
src
=
getInputMat
(
_src
,
stream
);
CV_Assert
(
src
.
depth
()
==
CV_8U
||
src
.
depth
()
==
CV_16U
||
src
.
depth
()
==
CV_32S
||
src
.
depth
()
==
CV_32F
);
...
...
@@ -125,7 +164,10 @@ void cv::cuda::flip(InputArray _src, OutputArray _dst, int flipCode, Stream& str
_dst
.
create
(
src
.
size
(),
src
.
type
());
GpuMat
dst
=
getOutputMat
(
_dst
,
src
.
size
(),
src
.
type
(),
stream
);
if
(
src
.
refcount
!=
dst
.
refcount
)
funcs
[
src
.
depth
()][
src
.
channels
()
-
1
](
src
,
dst
,
flipCode
,
StreamAccessor
::
getStream
(
stream
));
else
// in-place
ifuncs
[
src
.
depth
()][
src
.
channels
()
-
1
](
src
,
flipCode
,
StreamAccessor
::
getStream
(
stream
));
syncOutput
(
dst
,
_dst
,
stream
);
}
...
...
modules/cudaarithm/test/test_core.cpp
浏览文件 @
0fa06b1d
...
...
@@ -279,6 +279,19 @@ CUDA_TEST_P(Flip, Accuracy)
EXPECT_MAT_NEAR
(
dst_gold
,
dst
,
0.0
);
}
CUDA_TEST_P
(
Flip
,
AccuracyInplace
)
{
cv
::
Mat
src
=
randomMat
(
size
,
type
);
cv
::
cuda
::
GpuMat
srcDst
=
loadMat
(
src
,
useRoi
);
cv
::
cuda
::
flip
(
srcDst
,
srcDst
,
flip_code
);
cv
::
Mat
dst_gold
;
cv
::
flip
(
src
,
dst_gold
,
flip_code
);
EXPECT_MAT_NEAR
(
dst_gold
,
srcDst
,
0.0
);
}
INSTANTIATE_TEST_CASE_P
(
CUDA_Arithm
,
Flip
,
testing
::
Combine
(
ALL_DEVICES
,
DIFFERENT_SIZES
,
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录