Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
0ec0aeb7
O
Opencv
项目概览
Greenplum
/
Opencv
10 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
0ec0aeb7
编写于
11月 06, 2014
作者:
A
Alexander Karsakov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Minor optimization for ocl_canny
上级
5efad375
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
27 addition
and
29 deletion
+27
-29
modules/imgproc/src/canny.cpp
modules/imgproc/src/canny.cpp
+4
-4
modules/imgproc/src/opencl/canny.cl
modules/imgproc/src/opencl/canny.cl
+23
-25
未找到文件。
modules/imgproc/src/canny.cpp
浏览文件 @
0ec0aeb7
...
...
@@ -138,10 +138,10 @@ static bool ocl_Canny(InputArray _src, OutputArray _dst, float low_thresh, float
*/
char
cvt
[
40
];
ocl
::
Kernel
with_sobel
(
"stage1_with_sobel"
,
ocl
::
imgproc
::
canny_oclsrc
,
format
(
"-D WITH_SOBEL -D cn=%d -D TYPE=%s -D convert_
intN=%s -D in
tN=%s -D GRP_SIZEX=%d -D GRP_SIZEY=%d%s"
,
format
(
"-D WITH_SOBEL -D cn=%d -D TYPE=%s -D convert_
floatN=%s -D floa
tN=%s -D GRP_SIZEX=%d -D GRP_SIZEY=%d%s"
,
cn
,
ocl
::
memopTypeToStr
(
_src
.
depth
()),
ocl
::
convertTypeStr
(
_src
.
type
(),
CV_32SC
(
cn
)
,
cn
,
cvt
),
ocl
::
memopTypeToStr
(
CV_32SC
(
cn
)),
ocl
::
convertTypeStr
(
_src
.
depth
(),
CV_32F
,
cn
,
cvt
),
ocl
::
typeToStr
(
CV_MAKE_TYPE
(
CV_32F
,
cn
)),
lSizeX
,
lSizeY
,
L2gradient
?
" -D L2GRAD"
:
""
));
if
(
with_sobel
.
empty
())
...
...
@@ -151,7 +151,7 @@ static bool ocl_Canny(InputArray _src, OutputArray _dst, float low_thresh, float
map
.
create
(
size
,
CV_32S
);
with_sobel
.
args
(
ocl
::
KernelArg
::
ReadOnly
(
src
),
ocl
::
KernelArg
::
WriteOnlyNoSize
(
map
),
low
,
high
);
(
float
)
low
,
(
float
)
high
);
size_t
globalsize
[
2
]
=
{
size
.
width
,
size
.
height
},
localsize
[
2
]
=
{
lSizeX
,
lSizeY
};
...
...
modules/imgproc/src/opencl/canny.cl
浏览文件 @
0ec0aeb7
...
...
@@ -49,9 +49,9 @@
#
ifdef
WITH_SOBEL
#
if
cn
==
1
#
define
loadpix
(
addr
)
convert_
in
tN
(
*
(
__global
const
TYPE
*
)(
addr
))
#
define
loadpix
(
addr
)
convert_
floa
tN
(
*
(
__global
const
TYPE
*
)(
addr
))
#
else
#
define
loadpix
(
addr
)
convert_
in
tN
(
vload3
(
0
,
(
__global
const
TYPE
*
)(
addr
)))
#
define
loadpix
(
addr
)
convert_
floa
tN
(
vload3
(
0
,
(
__global
const
TYPE
*
)(
addr
)))
#
endif
#
define
storepix
(
value,
addr
)
*
(
__global
int
*
)(
addr
)
=
(
int
)(
value
)
...
...
@@ -77,23 +77,21 @@ __constant int next[4][2] = {
{
1
,
1
}
}
;
inline
int3
sobel
(
int
idx,
__local
const
in
tN
*smem
)
inline
float3
sobel
(
int
idx,
__local
const
floa
tN
*smem
)
{
//
result:
x,
y,
mag
in
t3
res
;
floa
t3
res
;
intN
dx
=
smem[idx
+
2]
-
smem[idx]
+
2
*
(
smem[idx
+
GRP_SIZEX
+
6]
-
smem[idx
+
GRP_SIZEX
+
4]
)
+
smem[idx
+
2
*
GRP_SIZEX
+
10]
-
smem[idx
+
2
*
GRP_SIZEX
+
8]
;
floatN
dx
=
fma
(
2
,
smem[idx
+
GRP_SIZEX
+
6]
-
smem[idx
+
GRP_SIZEX
+
4],
smem[idx
+
2]
-
smem[idx]
+
smem[idx
+
2
*
GRP_SIZEX
+
10]
-
smem[idx
+
2
*
GRP_SIZEX
+
8]
)
;
intN
dy
=
smem[idx]
-
smem[idx
+
2
*
GRP_SIZEX
+
8]
+
2
*
(
smem[idx
+
1]
-
smem[idx
+
2
*
GRP_SIZEX
+
9]
)
+
smem[idx
+
2]
-
smem[idx
+
2
*
GRP_SIZEX
+
10]
;
floatN
dy
=
fma
(
2
,
smem[idx
+
1]
-
smem[idx
+
2
*
GRP_SIZEX
+
9],
smem[idx
+
2]
-
smem[idx
+
2
*
GRP_SIZEX
+
10]
+
smem[idx]
-
smem[idx
+
2
*
GRP_SIZEX
+
8]
)
;
#
ifdef
L2GRAD
intN
magN
=
dx
*
dx
+
dy
*
dy
;
floatN
magN
=
fma
(
dx,
dx,
dy
*
dy
)
;
#
else
intN
magN
=
convert_intN
(
abs
(
dx
)
+
abs
(
dy
)
)
;
floatN
magN
=
fabs
(
dx
)
+
fabs
(
dy
)
;
#
endif
#
if
cn
==
1
res.z
=
magN
;
...
...
@@ -120,9 +118,9 @@ inline int3 sobel(int idx, __local const intN *smem)
__kernel
void
stage1_with_sobel
(
__global
const
uchar
*src,
int
src_step,
int
src_offset,
int
rows,
int
cols,
__global
uchar
*map,
int
map_step,
int
map_offset,
int
low_thr,
in
t
high_thr
)
float
low_thr,
floa
t
high_thr
)
{
__local
in
tN
smem[
(
GRP_SIZEX
+
4
)
*
(
GRP_SIZEY
+
4
)
]
;
__local
floa
tN
smem[
(
GRP_SIZEX
+
4
)
*
(
GRP_SIZEY
+
4
)
]
;
int
lidx
=
get_local_id
(
0
)
;
int
lidy
=
get_local_id
(
1
)
;
...
...
@@ -143,7 +141,7 @@ __kernel void stage1_with_sobel(__global const uchar *src, int src_step, int src
////
Sobel,
Magnitude
//
__local
in
t
mag[
(
GRP_SIZEX
+
2
)
*
(
GRP_SIZEY
+
2
)
]
;
__local
floa
t
mag[
(
GRP_SIZEX
+
2
)
*
(
GRP_SIZEY
+
2
)
]
;
lidx++
;
lidy++
;
...
...
@@ -164,13 +162,13 @@ __kernel void stage1_with_sobel(__global const uchar *src, int src_step, int src
int
idx
=
lidx
+
lidy
*
(
GRP_SIZEX
+
4
)
;
i
=
lidx
+
lidy
*
(
GRP_SIZEX
+
2
)
;
in
t3
res
=
sobel
(
idx,
smem
)
;
floa
t3
res
=
sobel
(
idx,
smem
)
;
mag[i]
=
res.z
;
int
x
=
res.x
;
int
y
=
res.y
;
barrier
(
CLK_LOCAL_MEM_FENCE
)
;
int
x
=
(
int
)
res.x
;
int
y
=
(
int
)
res.y
;
////
Threshold
+
Non
maxima
suppression
//
...
...
@@ -218,7 +216,7 @@ __kernel void stage1_with_sobel(__global const uchar *src, int src_step, int src
if
(
gidx
>=
cols
|
| gidy >= rows)
return;
in
t mag0 = mag[i];
floa
t mag0 = mag[i];
int value = 1;
if (mag0 > low_thr)
...
...
@@ -235,8 +233,8 @@ __kernel void stage1_with_sobel(__global const uchar *src, int src_step, int src
int dir3 = (a * b) & (((x ^ y) & 0x80000000) >> 31); // if a = 1, b = 1, dy ^ dx < 0
int dir = a * b + 2 * dir3;
in
t prev_mag = mag[(lidy + prev[dir][0]) * (GRP_SIZEX + 2) + lidx + prev[dir][1]];
in
t next_mag = mag[(lidy + next[dir][0]) * (GRP_SIZEX + 2) + lidx + next[dir][1]] + (dir & 1);
floa
t prev_mag = mag[(lidy + prev[dir][0]) * (GRP_SIZEX + 2) + lidx + prev[dir][1]];
floa
t next_mag = mag[(lidy + next[dir][0]) * (GRP_SIZEX + 2) + lidx + next[dir][1]] + (dir & 1);
if (mag0 > prev_mag && mag0 >= next_mag)
{
...
...
@@ -400,10 +398,10 @@ __kernel void stage2_hysteresis(__global uchar *map, int map_step, int map_offse
l_counter = 0;
barrier(CLK_LOCAL_MEM_FENCE);
#pragma unroll
for (int y = y0; y < min(y0 + PIX_PER_WI, rows); ++y)
if (x < cols)
{
if (x < cols)
#pragma unroll
for (int y = y0; y < min(y0 + PIX_PER_WI, rows); ++y)
{
int type = loadpix(map + mad24(y, map_step, x * (int)sizeof(int)));
if (type == 2)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录