Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Opencv
提交
c5e92c31
O
Opencv
项目概览
Greenplum
/
Opencv
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
c5e92c31
编写于
8月 08, 2012
作者:
V
Vladislav Vinogradov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fixed Bug #2252
error in the tutorial Similarity check (PNSR and SSIM) on the GPU
上级
0f4bdcd7
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
90 addition
and
87 deletion
+90
-87
samples/cpp/tutorial_code/gpu/gpu-basics-similarity/gpu-basics-similarity.cpp
..._code/gpu/gpu-basics-similarity/gpu-basics-similarity.cpp
+90
-87
未找到文件。
samples/cpp/tutorial_code/gpu/gpu-basics-similarity/gpu-basics-similarity.cpp
浏览文件 @
c5e92c31
...
...
@@ -30,11 +30,11 @@ struct BufferMSSIM // Optimized GPU versions
gpu
::
GpuMat
I1_2
,
I2_2
,
I1_I2
;
vector
<
gpu
::
GpuMat
>
vI1
,
vI2
;
gpu
::
GpuMat
mu1
,
mu2
;
gpu
::
GpuMat
mu1_2
,
mu2_2
,
mu1_mu2
;
gpu
::
GpuMat
mu1
,
mu2
;
gpu
::
GpuMat
mu1_2
,
mu2_2
,
mu1_mu2
;
gpu
::
GpuMat
sigma1_2
,
sigma2_2
,
sigma12
;
gpu
::
GpuMat
t3
;
gpu
::
GpuMat
sigma1_2
,
sigma2_2
,
sigma12
;
gpu
::
GpuMat
t3
;
gpu
::
GpuMat
ssim_map
;
...
...
@@ -56,7 +56,7 @@ void help()
int
main
(
int
argc
,
char
*
argv
[])
{
help
();
help
();
Mat
I1
=
imread
(
argv
[
1
]);
// Read the two images
Mat
I2
=
imread
(
argv
[
2
]);
...
...
@@ -69,13 +69,13 @@ int main(int argc, char *argv[])
BufferPSNR
bufferPSNR
;
BufferMSSIM
bufferMSSIM
;
int
TIMES
;
stringstream
sstr
(
argv
[
3
]);
int
TIMES
;
stringstream
sstr
(
argv
[
3
]);
sstr
>>
TIMES
;
double
time
,
result
;
//------------------------------- PSNR CPU ----------------------------------------------------
time
=
(
double
)
getTickCount
();
time
=
(
double
)
getTickCount
();
for
(
int
i
=
0
;
i
<
TIMES
;
++
i
)
result
=
getPSNR
(
I1
,
I2
);
...
...
@@ -84,10 +84,10 @@ int main(int argc, char *argv[])
time
/=
TIMES
;
cout
<<
"Time of PSNR CPU (averaged for "
<<
TIMES
<<
" runs): "
<<
time
<<
" milliseconds."
<<
" With result of: "
<<
result
<<
endl
;
<<
" With result of: "
<<
result
<<
endl
;
//------------------------------- PSNR GPU ----------------------------------------------------
time
=
(
double
)
getTickCount
();
time
=
(
double
)
getTickCount
();
for
(
int
i
=
0
;
i
<
TIMES
;
++
i
)
result
=
getPSNR_GPU
(
I1
,
I2
);
...
...
@@ -96,7 +96,7 @@ int main(int argc, char *argv[])
time
/=
TIMES
;
cout
<<
"Time of PSNR GPU (averaged for "
<<
TIMES
<<
" runs): "
<<
time
<<
" milliseconds."
<<
" With result of: "
<<
result
<<
endl
;
<<
" With result of: "
<<
result
<<
endl
;
//------------------------------- PSNR GPU Optimized--------------------------------------------
time
=
(
double
)
getTickCount
();
// Initial call
...
...
@@ -105,20 +105,20 @@ int main(int argc, char *argv[])
cout
<<
"Initial call GPU optimized: "
<<
time
<<
" milliseconds."
<<
" With result of: "
<<
result
<<
endl
;
time
=
(
double
)
getTickCount
();
time
=
(
double
)
getTickCount
();
for
(
int
i
=
0
;
i
<
TIMES
;
++
i
)
result
=
getPSNR_GPU_optimized
(
I1
,
I2
,
bufferPSNR
);
time
=
1000
*
((
double
)
getTickCount
()
-
time
)
/
getTickFrequency
();
time
/=
TIMES
;
cout
<<
"Time of PSNR GPU OPTIMIZED ( / "
<<
TIMES
<<
" runs): "
<<
time
<<
" milliseconds."
<<
" With result of: "
<<
result
<<
endl
<<
endl
;
cout
<<
"Time of PSNR GPU OPTIMIZED ( / "
<<
TIMES
<<
" runs): "
<<
time
<<
" milliseconds."
<<
" With result of: "
<<
result
<<
endl
<<
endl
;
//------------------------------- SSIM CPU -----------------------------------------------------
Scalar
x
;
time
=
(
double
)
getTickCount
();
time
=
(
double
)
getTickCount
();
for
(
int
i
=
0
;
i
<
TIMES
;
++
i
)
x
=
getMSSIM
(
I1
,
I2
);
...
...
@@ -127,10 +127,10 @@ int main(int argc, char *argv[])
time
/=
TIMES
;
cout
<<
"Time of MSSIM CPU (averaged for "
<<
TIMES
<<
" runs): "
<<
time
<<
" milliseconds."
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
;
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
;
//------------------------------- SSIM GPU -----------------------------------------------------
time
=
(
double
)
getTickCount
();
time
=
(
double
)
getTickCount
();
for
(
int
i
=
0
;
i
<
TIMES
;
++
i
)
x
=
getMSSIM_GPU
(
I1
,
I2
);
...
...
@@ -139,16 +139,16 @@ int main(int argc, char *argv[])
time
/=
TIMES
;
cout
<<
"Time of MSSIM GPU (averaged for "
<<
TIMES
<<
" runs): "
<<
time
<<
" milliseconds."
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
;
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
;
//------------------------------- SSIM GPU Optimized--------------------------------------------
time
=
(
double
)
getTickCount
();
time
=
(
double
)
getTickCount
();
x
=
getMSSIM_GPU_optimized
(
I1
,
I2
,
bufferMSSIM
);
time
=
1000
*
((
double
)
getTickCount
()
-
time
)
/
getTickFrequency
();
cout
<<
"Time of MSSIM GPU Initial Call "
<<
time
<<
" milliseconds."
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
;
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
;
time
=
(
double
)
getTickCount
();
time
=
(
double
)
getTickCount
();
for
(
int
i
=
0
;
i
<
TIMES
;
++
i
)
x
=
getMSSIM_GPU_optimized
(
I1
,
I2
,
bufferMSSIM
);
...
...
@@ -157,14 +157,14 @@ int main(int argc, char *argv[])
time
/=
TIMES
;
cout
<<
"Time of MSSIM GPU OPTIMIZED ( / "
<<
TIMES
<<
" runs): "
<<
time
<<
" milliseconds."
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
<<
endl
;
<<
" With result of B"
<<
x
.
val
[
0
]
<<
" G"
<<
x
.
val
[
1
]
<<
" R"
<<
x
.
val
[
2
]
<<
endl
<<
endl
;
return
0
;
}
double
getPSNR
(
const
Mat
&
I1
,
const
Mat
&
I2
)
{
Mat
s1
;
Mat
s1
;
absdiff
(
I1
,
I2
,
s1
);
// |I1 - I2|
s1
.
convertTo
(
s1
,
CV_32F
);
// cannot make a square on 8 bits
s1
=
s1
.
mul
(
s1
);
// |I1 - I2|^2
...
...
@@ -186,7 +186,7 @@ double getPSNR(const Mat& I1, const Mat& I2)
double
getPSNR_GPU_optimized
(
const
Mat
&
I1
,
const
Mat
&
I2
,
BufferPSNR
&
b
)
{
{
b
.
gI1
.
upload
(
I1
);
b
.
gI2
.
upload
(
I2
);
...
...
@@ -210,7 +210,7 @@ double getPSNR_GPU_optimized(const Mat& I1, const Mat& I2, BufferPSNR& b)
double
getPSNR_GPU
(
const
Mat
&
I1
,
const
Mat
&
I2
)
{
gpu
::
GpuMat
gI1
,
gI2
,
gs
,
t1
,
t2
;
gpu
::
GpuMat
gI1
,
gI2
,
gs
,
t1
,
t2
;
gI1
.
upload
(
I1
);
gI2
.
upload
(
I2
);
...
...
@@ -218,7 +218,7 @@ double getPSNR_GPU(const Mat& I1, const Mat& I2)
gI1
.
convertTo
(
t1
,
CV_32F
);
gI2
.
convertTo
(
t2
,
CV_32F
);
gpu
::
absdiff
(
t1
.
reshape
(
1
),
t2
.
reshape
(
1
),
gs
);
gpu
::
absdiff
(
t1
.
reshape
(
1
),
t2
.
reshape
(
1
),
gs
);
gpu
::
multiply
(
gs
,
gs
,
gs
);
Scalar
s
=
gpu
::
sum
(
gs
);
...
...
@@ -235,14 +235,14 @@ double getPSNR_GPU(const Mat& I1, const Mat& I2)
}
Scalar
getMSSIM
(
const
Mat
&
i1
,
const
Mat
&
i2
)
{
{
const
double
C1
=
6.5025
,
C2
=
58.5225
;
/***************************** INITS **********************************/
int
d
=
CV_32F
;
Mat
I1
,
I2
;
Mat
I1
,
I2
;
i1
.
convertTo
(
I1
,
d
);
// cannot calculate on one byte large values
i2
.
convertTo
(
I2
,
d
);
i2
.
convertTo
(
I2
,
d
);
Mat
I2_2
=
I2
.
mul
(
I2
);
// I2^2
Mat
I1_2
=
I1
.
mul
(
I1
);
// I1^2
...
...
@@ -254,11 +254,11 @@ Scalar getMSSIM( const Mat& i1, const Mat& i2)
GaussianBlur
(
I1
,
mu1
,
Size
(
11
,
11
),
1.5
);
GaussianBlur
(
I2
,
mu2
,
Size
(
11
,
11
),
1.5
);
Mat
mu1_2
=
mu1
.
mul
(
mu1
);
Mat
mu2_2
=
mu2
.
mul
(
mu2
);
Mat
mu1_2
=
mu1
.
mul
(
mu1
);
Mat
mu2_2
=
mu2
.
mul
(
mu2
);
Mat
mu1_mu2
=
mu1
.
mul
(
mu2
);
Mat
sigma1_2
,
sigma2_2
,
sigma12
;
Mat
sigma1_2
,
sigma2_2
,
sigma12
;
GaussianBlur
(
I1_2
,
sigma1_2
,
Size
(
11
,
11
),
1.5
);
sigma1_2
-=
mu1_2
;
...
...
@@ -270,28 +270,28 @@ Scalar getMSSIM( const Mat& i1, const Mat& i2)
sigma12
-=
mu1_mu2
;
///////////////////////////////// FORMULA ////////////////////////////////
Mat
t1
,
t2
,
t3
;
Mat
t1
,
t2
,
t3
;
t1
=
2
*
mu1_mu2
+
C1
;
t2
=
2
*
sigma12
+
C2
;
t1
=
2
*
mu1_mu2
+
C1
;
t2
=
2
*
sigma12
+
C2
;
t3
=
t1
.
mul
(
t2
);
// t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
t1
=
mu1_2
+
mu2_2
+
C1
;
t2
=
sigma1_2
+
sigma2_2
+
C2
;
t1
=
mu1_2
+
mu2_2
+
C1
;
t2
=
sigma1_2
+
sigma2_2
+
C2
;
t1
=
t1
.
mul
(
t2
);
// t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
Mat
ssim_map
;
divide
(
t3
,
t1
,
ssim_map
);
// ssim_map = t3./t1;
Scalar
mssim
=
mean
(
ssim_map
);
// mssim = average of ssim map
return
mssim
;
return
mssim
;
}
Scalar
getMSSIM_GPU
(
const
Mat
&
i1
,
const
Mat
&
i2
)
{
{
const
float
C1
=
6.5025
f
,
C2
=
58.5225
f
;
/***************************** INITS **********************************/
gpu
::
GpuMat
gI1
,
gI2
,
gs1
,
t1
,
t2
;
gpu
::
GpuMat
gI1
,
gI2
,
gs1
,
t1
,
t2
;
gI1
.
upload
(
i1
);
gI2
.
upload
(
i2
);
...
...
@@ -299,14 +299,14 @@ Scalar getMSSIM_GPU( const Mat& i1, const Mat& i2)
gI1
.
convertTo
(
t1
,
CV_MAKE_TYPE
(
CV_32F
,
gI1
.
channels
()));
gI2
.
convertTo
(
t2
,
CV_MAKE_TYPE
(
CV_32F
,
gI2
.
channels
()));
vector
<
gpu
::
GpuMat
>
vI1
,
vI2
;
vector
<
gpu
::
GpuMat
>
vI1
,
vI2
;
gpu
::
split
(
t1
,
vI1
);
gpu
::
split
(
t2
,
vI2
);
Scalar
mssim
;
for
(
int
i
=
0
;
i
<
gI1
.
channels
();
++
i
)
{
gpu
::
GpuMat
I2_2
,
I1_2
,
I1_I2
;
gpu
::
GpuMat
I2_2
,
I1_2
,
I1_I2
;
gpu
::
multiply
(
vI2
[
i
],
vI2
[
i
],
I2_2
);
// I2^2
gpu
::
multiply
(
vI1
[
i
],
vI1
[
i
],
I1_2
);
// I1^2
...
...
@@ -317,45 +317,45 @@ Scalar getMSSIM_GPU( const Mat& i1, const Mat& i2)
gpu
::
GaussianBlur
(
vI1
[
i
],
mu1
,
Size
(
11
,
11
),
1.5
);
gpu
::
GaussianBlur
(
vI2
[
i
],
mu2
,
Size
(
11
,
11
),
1.5
);
gpu
::
GpuMat
mu1_2
,
mu2_2
,
mu1_mu2
;
gpu
::
multiply
(
mu1
,
mu1
,
mu1_2
);
gpu
::
multiply
(
mu2
,
mu2
,
mu2_2
);
gpu
::
multiply
(
mu1
,
mu2
,
mu1_mu2
);
gpu
::
GpuMat
mu1_2
,
mu2_2
,
mu1_mu2
;
gpu
::
multiply
(
mu1
,
mu1
,
mu1_2
);
gpu
::
multiply
(
mu2
,
mu2
,
mu2_2
);
gpu
::
multiply
(
mu1
,
mu2
,
mu1_mu2
);
gpu
::
GpuMat
sigma1_2
,
sigma2_2
,
sigma12
;
gpu
::
GpuMat
sigma1_2
,
sigma2_2
,
sigma12
;
gpu
::
GaussianBlur
(
I1_2
,
sigma1_2
,
Size
(
11
,
11
),
1.5
);
sigma1_2
-=
mu1_2
;
gpu
::
subtract
(
sigma1_2
,
mu1_2
,
sigma1_2
);
//
sigma1_2 -= mu1_2;
gpu
::
GaussianBlur
(
I2_2
,
sigma2_2
,
Size
(
11
,
11
),
1.5
);
sigma2_2
-=
mu2_2
;
gpu
::
subtract
(
sigma2_2
,
mu2_2
,
sigma2_2
);
//
sigma2_2 -= mu2_2;
gpu
::
GaussianBlur
(
I1_I2
,
sigma12
,
Size
(
11
,
11
),
1.5
);
sigma12
-=
mu1_mu2
;
gpu
::
subtract
(
sigma12
,
mu1_mu2
,
sigma12
);
//
sigma12 -= mu1_mu2;
///////////////////////////////// FORMULA ////////////////////////////////
gpu
::
GpuMat
t1
,
t2
,
t3
;
gpu
::
GpuMat
t1
,
t2
,
t3
;
t1
=
2
*
mu1_mu2
+
C1
;
t2
=
2
*
sigma12
+
C2
;
gpu
::
multiply
(
t1
,
t2
,
t3
);
// t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
mu1_mu2
.
convertTo
(
t1
,
-
1
,
2
,
C1
);
// t1 = 2 * mu1_mu2 + C1;
sigma12
.
convertTo
(
t2
,
-
1
,
2
,
C2
);
// t2 = 2 * sigma12 + C2;
gpu
::
multiply
(
t1
,
t2
,
t3
);
// t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
t1
=
mu1_2
+
mu2_2
+
C1
;
t2
=
sigma1_2
+
sigma2_2
+
C2
;
gpu
::
multiply
(
t1
,
t2
,
t1
);
// t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
gpu
::
addWeighted
(
mu1_2
,
1.0
,
mu2_2
,
1.0
,
C1
,
t1
);
// t1 = mu1_2 + mu2_2 + C1;
gpu
::
addWeighted
(
sigma1_2
,
1.0
,
sigma2_2
,
1.0
,
C2
,
t2
);
// t2 = sigma1_2 + sigma2_2 + C2;
gpu
::
multiply
(
t1
,
t2
,
t1
);
// t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
gpu
::
GpuMat
ssim_map
;
gpu
::
divide
(
t3
,
t1
,
ssim_map
);
// ssim_map = t3./t1;
Scalar
s
=
gpu
::
sum
(
ssim_map
);
Scalar
s
=
gpu
::
sum
(
ssim_map
);
mssim
.
val
[
i
]
=
s
.
val
[
0
]
/
(
ssim_map
.
rows
*
ssim_map
.
cols
);
}
return
mssim
;
return
mssim
;
}
Scalar
getMSSIM_GPU_optimized
(
const
Mat
&
i1
,
const
Mat
&
i2
,
BufferMSSIM
&
b
)
{
{
int
cn
=
i1
.
channels
();
const
float
C1
=
6.5025
f
,
C2
=
58.5225
f
;
...
...
@@ -367,60 +367,63 @@ Scalar getMSSIM_GPU_optimized( const Mat& i1, const Mat& i2, BufferMSSIM& b)
gpu
::
Stream
stream
;
stream
.
enqueueConvert
(
b
.
gI1
,
b
.
t1
,
CV_32F
);
stream
.
enqueueConvert
(
b
.
gI2
,
b
.
t2
,
CV_32F
);
stream
.
enqueueConvert
(
b
.
gI2
,
b
.
t2
,
CV_32F
);
gpu
::
split
(
b
.
t1
,
b
.
vI1
,
stream
);
gpu
::
split
(
b
.
t2
,
b
.
vI2
,
stream
);
Scalar
mssim
;
gpu
::
GpuMat
buf
;
for
(
int
i
=
0
;
i
<
b
.
gI1
.
channels
();
++
i
)
{
{
gpu
::
multiply
(
b
.
vI2
[
i
],
b
.
vI2
[
i
],
b
.
I2_2
,
stream
);
// I2^2
gpu
::
multiply
(
b
.
vI1
[
i
],
b
.
vI1
[
i
],
b
.
I1_2
,
stream
);
// I1^2
gpu
::
multiply
(
b
.
vI1
[
i
],
b
.
vI2
[
i
],
b
.
I1_I2
,
stream
);
// I1 * I2
gpu
::
GaussianBlur
(
b
.
vI1
[
i
],
b
.
mu1
,
Size
(
11
,
11
),
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
GaussianBlur
(
b
.
vI2
[
i
],
b
.
mu2
,
Size
(
11
,
11
),
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
GaussianBlur
(
b
.
vI1
[
i
],
b
.
mu1
,
Size
(
11
,
11
),
buf
,
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
GaussianBlur
(
b
.
vI2
[
i
],
b
.
mu2
,
Size
(
11
,
11
),
buf
,
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
multiply
(
b
.
mu1
,
b
.
mu1
,
b
.
mu1_2
,
stream
);
gpu
::
multiply
(
b
.
mu2
,
b
.
mu2
,
b
.
mu2_2
,
stream
);
gpu
::
multiply
(
b
.
mu1
,
b
.
mu2
,
b
.
mu1_mu2
,
stream
);
gpu
::
multiply
(
b
.
mu1
,
b
.
mu1
,
b
.
mu1_2
,
stream
);
gpu
::
multiply
(
b
.
mu2
,
b
.
mu2
,
b
.
mu2_2
,
stream
);
gpu
::
multiply
(
b
.
mu1
,
b
.
mu2
,
b
.
mu1_mu2
,
stream
);
gpu
::
GaussianBlur
(
b
.
I1_2
,
b
.
sigma1_2
,
Size
(
11
,
11
),
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
subtract
(
b
.
sigma1_2
,
b
.
mu1_2
,
b
.
sigma1_2
,
stream
);
gpu
::
GaussianBlur
(
b
.
I1_2
,
b
.
sigma1_2
,
Size
(
11
,
11
),
buf
,
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
subtract
(
b
.
sigma1_2
,
b
.
mu1_2
,
b
.
sigma1_2
,
gpu
::
GpuMat
(),
-
1
,
stream
);
//b.sigma1_2 -= b.mu1_2; - This would result in an extra data transfer operation
gpu
::
GaussianBlur
(
b
.
I2_2
,
b
.
sigma2_2
,
Size
(
11
,
11
),
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
subtract
(
b
.
sigma2_2
,
b
.
mu2_2
,
b
.
sigma2_2
,
stream
);
gpu
::
GaussianBlur
(
b
.
I2_2
,
b
.
sigma2_2
,
Size
(
11
,
11
),
buf
,
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
subtract
(
b
.
sigma2_2
,
b
.
mu2_2
,
b
.
sigma2_2
,
gpu
::
GpuMat
(),
-
1
,
stream
);
//b.sigma2_2 -= b.mu2_2;
gpu
::
GaussianBlur
(
b
.
I1_I2
,
b
.
sigma12
,
Size
(
11
,
11
),
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
subtract
(
b
.
sigma12
,
b
.
mu1_mu2
,
b
.
sigma12
,
stream
);
gpu
::
GaussianBlur
(
b
.
I1_I2
,
b
.
sigma12
,
Size
(
11
,
11
),
buf
,
1.5
,
0
,
BORDER_DEFAULT
,
-
1
,
stream
);
gpu
::
subtract
(
b
.
sigma12
,
b
.
mu1_mu2
,
b
.
sigma12
,
gpu
::
GpuMat
(),
-
1
,
stream
);
//b.sigma12 -= b.mu1_mu2;
//here too it would be an extra data transfer due to call of operator*(Scalar, Mat)
gpu
::
multiply
(
b
.
mu1_mu2
,
2
,
b
.
t1
,
stream
);
//b.t1 = 2 * b.mu1_mu2 + C1;
gpu
::
add
(
b
.
t1
,
C1
,
b
.
t1
,
stream
);
gpu
::
multiply
(
b
.
sigma12
,
2
,
b
.
t2
,
stream
);
//b.t2 = 2 * b.sigma12 + C2;
gpu
::
add
(
b
.
t2
,
C2
,
b
.
t2
,
stream
);
gpu
::
multiply
(
b
.
mu1_mu2
,
2
,
b
.
t1
,
1
,
-
1
,
stream
);
//b.t1 = 2 * b.mu1_mu2 + C1;
gpu
::
add
(
b
.
t1
,
C1
,
b
.
t1
,
gpu
::
GpuMat
(),
-
1
,
stream
);
gpu
::
multiply
(
b
.
sigma12
,
2
,
b
.
t2
,
1
,
-
1
,
stream
);
//b.t2 = 2 * b.sigma12 + C2;
gpu
::
add
(
b
.
t2
,
C2
,
b
.
t2
,
gpu
::
GpuMat
(),
-
12
,
stream
);
gpu
::
multiply
(
b
.
t1
,
b
.
t2
,
b
.
t3
,
stream
);
// t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
gpu
::
multiply
(
b
.
t1
,
b
.
t2
,
b
.
t3
,
1
,
-
1
,
stream
);
// t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
gpu
::
add
(
b
.
mu1_2
,
b
.
mu2_2
,
b
.
t1
,
stream
);
gpu
::
add
(
b
.
t1
,
C1
,
b
.
t1
,
stream
);
gpu
::
add
(
b
.
mu1_2
,
b
.
mu2_2
,
b
.
t1
,
gpu
::
GpuMat
(),
-
1
,
stream
);
gpu
::
add
(
b
.
t1
,
C1
,
b
.
t1
,
gpu
::
GpuMat
(),
-
1
,
stream
);
gpu
::
add
(
b
.
sigma1_2
,
b
.
sigma2_2
,
b
.
t2
,
stream
);
gpu
::
add
(
b
.
t2
,
C2
,
b
.
t2
,
stream
);
gpu
::
add
(
b
.
sigma1_2
,
b
.
sigma2_2
,
b
.
t2
,
gpu
::
GpuMat
(),
-
1
,
stream
);
gpu
::
add
(
b
.
t2
,
C2
,
b
.
t2
,
gpu
::
GpuMat
(),
-
1
,
stream
);
gpu
::
multiply
(
b
.
t1
,
b
.
t2
,
b
.
t1
,
stream
);
// t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
gpu
::
divide
(
b
.
t3
,
b
.
t1
,
b
.
ssim_map
,
stream
);
// ssim_map = t3./t1;
gpu
::
multiply
(
b
.
t1
,
b
.
t2
,
b
.
t1
,
1
,
-
1
,
stream
);
// t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
gpu
::
divide
(
b
.
t3
,
b
.
t1
,
b
.
ssim_map
,
1
,
-
1
,
stream
);
// ssim_map = t3./t1;
stream
.
waitForCompletion
();
Scalar
s
=
gpu
::
sum
(
b
.
ssim_map
,
b
.
buf
);
Scalar
s
=
gpu
::
sum
(
b
.
ssim_map
,
b
.
buf
);
mssim
.
val
[
i
]
=
s
.
val
[
0
]
/
(
b
.
ssim_map
.
rows
*
b
.
ssim_map
.
cols
);
}
return
mssim
;
}
\ No newline at end of file
return
mssim
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录