Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
e89cee35
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,发现更多精彩内容 >>
提交
e89cee35
编写于
6月 21, 2014
作者:
I
Ilya Lavrenov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
optimized cv::inRange
上级
6952b90e
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
53 addition
and
21 deletion
+53
-21
modules/core/src/arithm.cpp
modules/core/src/arithm.cpp
+12
-5
modules/core/src/opencl/inrange.cl
modules/core/src/opencl/inrange.cl
+41
-16
未找到文件。
modules/core/src/arithm.cpp
浏览文件 @
e89cee35
...
...
@@ -3130,9 +3130,16 @@ static bool ocl_inRange( InputArray _src, InputArray _lowerb,
(
!
haveScalar
&&
(
sdepth
!=
ldepth
||
sdepth
!=
udepth
))
)
return
false
;
ocl
::
Kernel
ker
(
"inrange"
,
ocl
::
core
::
inrange_oclsrc
,
format
(
"%s-D cn=%d -D T=%s%s"
,
haveScalar
?
"-D HAVE_SCALAR "
:
""
,
cn
,
ocl
::
typeToStr
(
sdepth
),
doubleSupport
?
" -D DOUBLE_SUPPORT"
:
""
));
int
kercn
=
haveScalar
?
cn
:
std
::
max
(
std
::
min
(
ocl
::
predictOptimalVectorWidth
(
_src
,
_lowerb
,
_upperb
,
_dst
),
4
),
cn
);
if
(
kercn
%
cn
!=
0
)
kercn
=
cn
;
int
colsPerWI
=
kercn
/
cn
;
String
opts
=
format
(
"%s-D cn=%d -D srcT=%s -D srcT1=%s -D dstT=%s -D kercn=%d -D depth=%d%s -D colsPerWI=%d"
,
haveScalar
?
"-D HAVE_SCALAR "
:
""
,
cn
,
ocl
::
typeToStr
(
CV_MAKE_TYPE
(
sdepth
,
kercn
)),
ocl
::
typeToStr
(
sdepth
),
ocl
::
typeToStr
(
CV_8UC
(
colsPerWI
)),
kercn
,
sdepth
,
doubleSupport
?
" -D DOUBLE_SUPPORT"
:
""
,
colsPerWI
);
ocl
::
Kernel
ker
(
"inrange"
,
ocl
::
core
::
inrange_oclsrc
,
opts
);
if
(
ker
.
empty
())
return
false
;
...
...
@@ -3180,7 +3187,7 @@ static bool ocl_inRange( InputArray _src, InputArray _lowerb,
}
ocl
::
KernelArg
srcarg
=
ocl
::
KernelArg
::
ReadOnlyNoSize
(
src
),
dstarg
=
ocl
::
KernelArg
::
WriteOnly
(
dst
);
dstarg
=
ocl
::
KernelArg
::
WriteOnly
(
dst
,
1
,
colsPerWI
);
if
(
haveScalar
)
{
...
...
@@ -3194,7 +3201,7 @@ static bool ocl_inRange( InputArray _src, InputArray _lowerb,
ker
.
args
(
srcarg
,
dstarg
,
ocl
::
KernelArg
::
ReadOnlyNoSize
(
lscalaru
),
ocl
::
KernelArg
::
ReadOnlyNoSize
(
uscalaru
),
rowsPerWI
);
size_t
globalsize
[
2
]
=
{
ssize
.
width
,
(
ssize
.
height
+
rowsPerWI
-
1
)
/
rowsPerWI
};
size_t
globalsize
[
2
]
=
{
ssize
.
width
/
colsPerWI
,
(
ssize
.
height
+
rowsPerWI
-
1
)
/
rowsPerWI
};
return
ker
.
run
(
2
,
globalsize
,
NULL
,
false
);
}
...
...
modules/core/src/opencl/inrange.cl
浏览文件 @
e89cee35
...
...
@@ -52,7 +52,7 @@
__kernel
void
inrange
(
__global
const
uchar
*
src1ptr,
int
src1_step,
int
src1_offset,
__global
uchar
*
dstptr,
int
dst_step,
int
dst_offset,
int
dst_rows,
int
dst_cols,
#
ifdef
HAVE_SCALAR
__global
const
T
*
src2,
__global
const
T
*
src3,
__global
const
srcT1
*
src2,
__global
const
srcT1
*
src3,
#
else
__global
const
uchar
*
src2ptr,
int
src2_step,
int
src2_offset,
__global
const
uchar
*
src3ptr,
int
src3_step,
int
src3_offset,
...
...
@@ -64,31 +64,56 @@ __kernel void inrange(__global const uchar * src1ptr, int src1_step, int src1_of
if
(
x
<
dst_cols
)
{
int
src1_index
=
mad24
(
y0,
src1_step,
mad24
(
x,
(
int
)
sizeof
(
T
)
*
cn,
src1_offset
))
;
int
dst_index
=
mad24
(
y0,
dst_step,
x
+
dst_offset
)
;
int
src1_index
=
mad24
(
y0,
src1_step,
mad24
(
x,
(
int
)
sizeof
(
srcT1
)
*
ker
cn,
src1_offset
))
;
int
dst_index
=
mad24
(
y0,
dst_step,
mad24
(
x,
colsPerWI,
dst_offset
)
)
;
#
ifndef
HAVE_SCALAR
int
src2_index
=
mad24
(
y0,
src2_step,
mad24
(
x,
(
int
)
sizeof
(
T
)
*
cn,
src2_offset
))
;
int
src3_index
=
mad24
(
y0,
src3_step,
mad24
(
x,
(
int
)
sizeof
(
T
)
*
cn,
src3_offset
))
;
int
src2_index
=
mad24
(
y0,
src2_step,
mad24
(
x,
(
int
)
sizeof
(
srcT1
)
*
ker
cn,
src2_offset
))
;
int
src3_index
=
mad24
(
y0,
src3_step,
mad24
(
x,
(
int
)
sizeof
(
srcT1
)
*
ker
cn,
src3_offset
))
;
#
endif
for
(
int
y
=
y0,
y1
=
min
(
dst_rows,
y0
+
rowsPerWI
)
; y < y1; ++y, src1_index += src1_step, dst_index += dst_step)
{
__global
const
T
*
src1
=
(
__global
const
T
*
)(
src1ptr
+
src1_index
)
;
#
if
kercn
>=
cn
&&
kercn
==
4
&&
depth
<=
4
&&
!defined
HAVE_SCALAR
srcT
src1
=
*
(
__global
const
srcT
*
)(
src1ptr
+
src1_index
)
;
srcT
src2
=
*
(
__global
const
srcT
*
)(
src2ptr
+
src2_index
)
;
srcT
src3
=
*
(
__global
const
srcT
*
)(
src3ptr
+
src3_index
)
;
__global
dstT
*
dst
=
(
__global
dstT
*
)(
dstptr
+
dst_index
)
;
#
if
cn
==
1
dst[0]
=
src2
>
src1
|
| src3 < src1 ? (dstT)(0) : (dstT)(255);
#elif cn == 2
dst[0] = (dstT)(src2.xy > src1.xy || src3.xy < src1.xy ||
src2.zw > src1.zw || src3.zw < src1.zw ? (dstT)(0) : (dstT)(255);
#elif cn == 4
dst[0] = (dstT)(src2.x > src1.x || src3.x < src1.x ||
src2.y > src1.y || src3.y < src1.y ||
src2.z > src1.z || src3.z < src1.z ||
src2.w > src1.w || src3.w < src1.w ? 0 : 255);
#endif
#else
__global const srcT1 * src1 = (__global const srcT1 *)(src1ptr + src1_index);
__global uchar * dst = dstptr + dst_index;
#ifndef HAVE_SCALAR
__global
const
T
*
src2
=
(
__global
const
T
*
)(
src2ptr
+
src2_index
)
;
__global
const
T
*
src3
=
(
__global
const
T
*
)(
src3ptr
+
src3_index
)
;
__global const
srcT1 * src2 = (__global const srcT1
*)(src2ptr + src2_index);
__global const
srcT1 * src3 = (__global const srcT1
*)(src3ptr + src3_index);
#endif
dst[0]
=
255
;
for
(
int
c
=
0
; c < cn; ++c)
if
(
src2[c]
>
src1[c]
||
src3[c]
<
src1[c]
)
{
dst[0]
=
0
;
break
;
}
#pragma unroll
for (int px = 0; px < colsPerWI; ++px, src1 += cn
#ifndef HAVE_SCALAR
, src2 += cn, src3 += cn
#endif
)
{
dst[px] = 255;
for (int c = 0; c < cn; ++c)
if (src2[c] > src1[c] |
|
src3[c]
<
src1[c]
)
{
dst[px]
=
0
;
break
;
}
}
#
endif
//
kercn
>=
cn
#
ifndef
HAVE_SCALAR
src2_index
+=
src2_step
;
src3_index
+=
src3_step
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录