Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
c5e92c31
Commit
c5e92c31
authored
Aug 08, 2012
by
Vladislav Vinogradov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed Bug #2252
error in the tutorial Similarity check (PNSR and SSIM) on the GPU
parent
0f4bdcd7
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
90 additions
and
88 deletions
+90
-88
gpu-basics-similarity.cpp
..._code/gpu/gpu-basics-similarity/gpu-basics-similarity.cpp
+90
-88
No files found.
samples/cpp/tutorial_code/gpu/gpu-basics-similarity/gpu-basics-similarity.cpp
View file @
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
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment