Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
c4c86a89
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,发现更多精彩内容 >>
提交
c4c86a89
编写于
1月 12, 2015
作者:
I
Ilya Lavrenov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
cvtColor XYZ 2 RGB f32
上级
93f88008
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
110 addition
and
3 deletion
+110
-3
modules/imgproc/perf/perf_cvt_color.cpp
modules/imgproc/perf/perf_cvt_color.cpp
+3
-3
modules/imgproc/src/color.cpp
modules/imgproc/src/color.cpp
+107
-0
未找到文件。
modules/imgproc/perf/perf_cvt_color.cpp
浏览文件 @
c4c86a89
...
...
@@ -204,12 +204,12 @@ PERF_TEST_P(Size_CvtMode, cvtColor8u,
)
{
Size
sz
=
GetParam
();
int
mode
=
COLOR_
YCrCb
2RGB
;
int
mode
=
COLOR_
XYZ
2RGB
;
ChPair
ch
=
getConversionInfo
(
mode
);
mode
%=
COLOR_COLORCVT_MAX
;
Mat
src
(
sz
,
CV_
8U
C
(
3
));
Mat
dst
(
sz
,
CV_
8U
C
(
3
));
Mat
src
(
sz
,
CV_
32F
C
(
3
));
Mat
dst
(
sz
,
CV_
32F
C
(
3
));
declare
.
time
(
100
);
declare
.
in
(
src
,
WARMUP_RNG
).
out
(
dst
);
...
...
modules/imgproc/src/color.cpp
浏览文件 @
c4c86a89
...
...
@@ -3421,6 +3421,7 @@ template<typename _Tp> struct RGB2XYZ_i
C3
=
coeffs
[
3
],
C4
=
coeffs
[
4
],
C5
=
coeffs
[
5
],
C6
=
coeffs
[
6
],
C7
=
coeffs
[
7
],
C8
=
coeffs
[
8
];
n
*=
3
;
for
(
int
i
=
0
;
i
<
n
;
i
+=
3
,
src
+=
scn
)
{
int
X
=
CV_DESCALE
(
src
[
0
]
*
C0
+
src
[
1
]
*
C1
+
src
[
2
]
*
C2
,
xyz_shift
);
...
...
@@ -3714,6 +3715,112 @@ template<typename _Tp> struct XYZ2RGB_f
float
coeffs
[
9
];
};
#if CV_SSE2
template
<
>
struct
XYZ2RGB_f
<
float
>
{
typedef
float
channel_type
;
XYZ2RGB_f
(
int
_dstcn
,
int
_blueIdx
,
const
float
*
_coeffs
)
:
dstcn
(
_dstcn
),
blueIdx
(
_blueIdx
)
{
memcpy
(
coeffs
,
_coeffs
?
_coeffs
:
XYZ2sRGB_D65
,
9
*
sizeof
(
coeffs
[
0
]));
if
(
blueIdx
==
0
)
{
std
::
swap
(
coeffs
[
0
],
coeffs
[
6
]);
std
::
swap
(
coeffs
[
1
],
coeffs
[
7
]);
std
::
swap
(
coeffs
[
2
],
coeffs
[
8
]);
}
v_c0
=
_mm_set1_ps
(
coeffs
[
0
]);
v_c1
=
_mm_set1_ps
(
coeffs
[
1
]);
v_c2
=
_mm_set1_ps
(
coeffs
[
2
]);
v_c3
=
_mm_set1_ps
(
coeffs
[
3
]);
v_c4
=
_mm_set1_ps
(
coeffs
[
4
]);
v_c5
=
_mm_set1_ps
(
coeffs
[
5
]);
v_c6
=
_mm_set1_ps
(
coeffs
[
6
]);
v_c7
=
_mm_set1_ps
(
coeffs
[
7
]);
v_c8
=
_mm_set1_ps
(
coeffs
[
8
]);
}
void
process
(
__m128
v_x
,
__m128
v_y
,
__m128
v_z
,
__m128
&
v_r
,
__m128
&
v_g
,
__m128
&
v_b
)
const
{
v_b
=
_mm_mul_ps
(
v_x
,
v_c0
);
v_b
=
_mm_add_ps
(
v_b
,
_mm_mul_ps
(
v_y
,
v_c1
));
v_b
=
_mm_add_ps
(
v_b
,
_mm_mul_ps
(
v_z
,
v_c2
));
v_g
=
_mm_mul_ps
(
v_x
,
v_c3
);
v_g
=
_mm_add_ps
(
v_g
,
_mm_mul_ps
(
v_y
,
v_c4
));
v_g
=
_mm_add_ps
(
v_g
,
_mm_mul_ps
(
v_z
,
v_c5
));
v_r
=
_mm_mul_ps
(
v_x
,
v_c6
);
v_r
=
_mm_add_ps
(
v_r
,
_mm_mul_ps
(
v_y
,
v_c7
));
v_r
=
_mm_add_ps
(
v_r
,
_mm_mul_ps
(
v_z
,
v_c8
));
}
void
operator
()(
const
float
*
src
,
float
*
dst
,
int
n
)
const
{
int
dcn
=
dstcn
;
float
alpha
=
ColorChannel
<
float
>::
max
();
float
C0
=
coeffs
[
0
],
C1
=
coeffs
[
1
],
C2
=
coeffs
[
2
],
C3
=
coeffs
[
3
],
C4
=
coeffs
[
4
],
C5
=
coeffs
[
5
],
C6
=
coeffs
[
6
],
C7
=
coeffs
[
7
],
C8
=
coeffs
[
8
];
n
*=
3
;
int
i
=
0
;
if
(
dcn
==
3
)
{
for
(
;
i
<=
n
-
24
;
i
+=
24
,
dst
+=
24
)
{
__m128
v_x0
=
_mm_loadu_ps
(
src
+
i
);
__m128
v_x1
=
_mm_loadu_ps
(
src
+
i
+
4
);
__m128
v_y0
=
_mm_loadu_ps
(
src
+
i
+
8
);
__m128
v_y1
=
_mm_loadu_ps
(
src
+
i
+
12
);
__m128
v_z0
=
_mm_loadu_ps
(
src
+
i
+
16
);
__m128
v_z1
=
_mm_loadu_ps
(
src
+
i
+
20
);
_MM_DEINTERLIV_PS
(
v_x0
,
v_x1
,
v_y0
,
v_y1
,
v_z0
,
v_z1
)
__m128
v_r0
,
v_g0
,
v_b0
;
process
(
v_x0
,
v_y0
,
v_z0
,
v_r0
,
v_g0
,
v_b0
);
__m128
v_r1
,
v_g1
,
v_b1
;
process
(
v_x1
,
v_y1
,
v_z1
,
v_r1
,
v_g1
,
v_b1
);
_MM_INTERLIV_PS
(
v_b0
,
v_b1
,
v_g0
,
v_g1
,
v_r0
,
v_r1
)
_mm_storeu_ps
(
dst
,
v_b0
);
_mm_storeu_ps
(
dst
+
4
,
v_b1
);
_mm_storeu_ps
(
dst
+
8
,
v_g0
);
_mm_storeu_ps
(
dst
+
12
,
v_g1
);
_mm_storeu_ps
(
dst
+
16
,
v_r0
);
_mm_storeu_ps
(
dst
+
20
,
v_r1
);
}
}
for
(
;
i
<
n
;
i
+=
3
,
dst
+=
dcn
)
{
float
B
=
src
[
i
]
*
C0
+
src
[
i
+
1
]
*
C1
+
src
[
i
+
2
]
*
C2
;
float
G
=
src
[
i
]
*
C3
+
src
[
i
+
1
]
*
C4
+
src
[
i
+
2
]
*
C5
;
float
R
=
src
[
i
]
*
C6
+
src
[
i
+
1
]
*
C7
+
src
[
i
+
2
]
*
C8
;
dst
[
0
]
=
B
;
dst
[
1
]
=
G
;
dst
[
2
]
=
R
;
if
(
dcn
==
4
)
dst
[
3
]
=
alpha
;
}
}
int
dstcn
,
blueIdx
;
float
coeffs
[
9
];
__m128
v_c0
,
v_c1
,
v_c2
,
v_c3
,
v_c4
,
v_c5
,
v_c6
,
v_c7
,
v_c8
;
};
#endif // CV_SSE2
template
<
typename
_Tp
>
struct
XYZ2RGB_i
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录