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
08914aa7
Commit
08914aa7
authored
Feb 13, 2013
by
Vladislav Vinogradov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
added gpu compare with scalar
parent
a828b607
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
211 additions
and
0 deletions
+211
-0
per_element_operations.rst
modules/gpu/doc/per_element_operations.rst
+2
-0
gpu.hpp
modules/gpu/include/opencv2/gpu/gpu.hpp
+1
-0
perf_core.cpp
modules/gpu/perf/perf_core.cpp
+33
-0
element_operations.cu
modules/gpu/src/cuda/element_operations.cu
+0
-0
element_operations.cpp
modules/gpu/src/element_operations.cpp
+64
-0
test_core.cpp
modules/gpu/test/test_core.cpp
+111
-0
No files found.
modules/gpu/doc/per_element_operations.rst
View file @
08914aa7
...
...
@@ -276,6 +276,8 @@ Compares elements of two matrices.
.. ocv:function:: void gpu::compare( const GpuMat& a, const GpuMat& b, GpuMat& c, int cmpop, Stream& stream=Stream::Null() )
.. ocv:function:: void gpu::compare(const GpuMat& a, Scalar sc, GpuMat& c, int cmpop, Stream& stream = Stream::Null())
:param a: First source matrix.
:param b: Second source matrix with the same size and type as ``a`` .
...
...
modules/gpu/include/opencv2/gpu/gpu.hpp
View file @
08914aa7
...
...
@@ -533,6 +533,7 @@ CV_EXPORTS void pow(const GpuMat& src, double power, GpuMat& dst, Stream& stream
//! compares elements of two arrays (c = a <cmpop> b)
CV_EXPORTS
void
compare
(
const
GpuMat
&
a
,
const
GpuMat
&
b
,
GpuMat
&
c
,
int
cmpop
,
Stream
&
stream
=
Stream
::
Null
());
CV_EXPORTS
void
compare
(
const
GpuMat
&
a
,
Scalar
sc
,
GpuMat
&
c
,
int
cmpop
,
Stream
&
stream
=
Stream
::
Null
());
//! performs per-elements bit-wise inversion
CV_EXPORTS
void
bitwise_not
(
const
GpuMat
&
src
,
GpuMat
&
dst
,
const
GpuMat
&
mask
=
GpuMat
(),
Stream
&
stream
=
Stream
::
Null
());
...
...
modules/gpu/perf/perf_core.cpp
View file @
08914aa7
...
...
@@ -647,6 +647,39 @@ PERF_TEST_P(Sz_Depth_Code, Core_CompareMat, Combine(GPU_TYPICAL_MAT_SIZES, ARITH
}
}
//////////////////////////////////////////////////////////////////////
// CompareScalar
PERF_TEST_P
(
Sz_Depth_Code
,
Core_CompareScalar
,
Combine
(
GPU_TYPICAL_MAT_SIZES
,
ARITHM_MAT_DEPTH
,
ALL_CMP_CODES
))
{
const
cv
::
Size
size
=
GET_PARAM
(
0
);
const
int
depth
=
GET_PARAM
(
1
);
const
int
cmp_code
=
GET_PARAM
(
2
);
cv
::
Mat
src
(
size
,
depth
);
fillRandom
(
src
);
cv
::
Scalar
s
=
cv
::
Scalar
::
all
(
100
);
if
(
PERF_RUN_GPU
())
{
cv
::
gpu
::
GpuMat
d_src
(
src
);
cv
::
gpu
::
GpuMat
d_dst
;
TEST_CYCLE
()
cv
::
gpu
::
compare
(
d_src
,
s
,
d_dst
,
cmp_code
);
GPU_SANITY_CHECK
(
d_dst
);
}
else
{
cv
::
Mat
dst
;
TEST_CYCLE
()
cv
::
compare
(
src
,
s
,
dst
,
cmp_code
);
CPU_SANITY_CHECK
(
dst
);
}
}
//////////////////////////////////////////////////////////////////////
// BitwiseNot
...
...
modules/gpu/src/cuda/element_operations.cu
View file @
08914aa7
This diff is collapsed.
Click to expand it.
modules/gpu/src/element_operations.cpp
View file @
08914aa7
...
...
@@ -64,6 +64,7 @@ void cv::gpu::sqrt(const GpuMat&, GpuMat&, Stream&) { throw_nogpu(); }
void
cv
::
gpu
::
exp
(
const
GpuMat
&
,
GpuMat
&
,
Stream
&
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
log
(
const
GpuMat
&
,
GpuMat
&
,
Stream
&
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
compare
(
const
GpuMat
&
,
const
GpuMat
&
,
GpuMat
&
,
int
,
Stream
&
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
compare
(
const
GpuMat
&
,
Scalar
,
GpuMat
&
,
int
,
Stream
&
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
bitwise_not
(
const
GpuMat
&
,
GpuMat
&
,
const
GpuMat
&
,
Stream
&
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
bitwise_or
(
const
GpuMat
&
,
const
GpuMat
&
,
GpuMat
&
,
const
GpuMat
&
,
Stream
&
)
{
throw_nogpu
();
}
void
cv
::
gpu
::
bitwise_or
(
const
GpuMat
&
,
const
Scalar
&
,
GpuMat
&
,
Stream
&
)
{
throw_nogpu
();
}
...
...
@@ -2001,6 +2002,69 @@ void cv::gpu::compare(const GpuMat& src1, const GpuMat& src2, GpuMat& dst, int c
func
(
src1_
,
src2_
,
dst_
,
stream
);
}
namespace
arithm
{
template
<
typename
T
>
void
cmpScalarEq
(
PtrStepSzb
src
,
int
cn
,
double
val
[
4
],
PtrStepSzb
dst
,
cudaStream_t
stream
);
template
<
typename
T
>
void
cmpScalarNe
(
PtrStepSzb
src
,
int
cn
,
double
val
[
4
],
PtrStepSzb
dst
,
cudaStream_t
stream
);
template
<
typename
T
>
void
cmpScalarLt
(
PtrStepSzb
src
,
int
cn
,
double
val
[
4
],
PtrStepSzb
dst
,
cudaStream_t
stream
);
template
<
typename
T
>
void
cmpScalarLe
(
PtrStepSzb
src
,
int
cn
,
double
val
[
4
],
PtrStepSzb
dst
,
cudaStream_t
stream
);
template
<
typename
T
>
void
cmpScalarGt
(
PtrStepSzb
src
,
int
cn
,
double
val
[
4
],
PtrStepSzb
dst
,
cudaStream_t
stream
);
template
<
typename
T
>
void
cmpScalarGe
(
PtrStepSzb
src
,
int
cn
,
double
val
[
4
],
PtrStepSzb
dst
,
cudaStream_t
stream
);
}
namespace
{
template
<
typename
T
>
void
castScalar
(
Scalar
&
sc
)
{
sc
.
val
[
0
]
=
saturate_cast
<
T
>
(
sc
.
val
[
0
]);
sc
.
val
[
1
]
=
saturate_cast
<
T
>
(
sc
.
val
[
1
]);
sc
.
val
[
2
]
=
saturate_cast
<
T
>
(
sc
.
val
[
2
]);
sc
.
val
[
3
]
=
saturate_cast
<
T
>
(
sc
.
val
[
3
]);
}
}
void
cv
::
gpu
::
compare
(
const
GpuMat
&
src
,
Scalar
sc
,
GpuMat
&
dst
,
int
cmpop
,
Stream
&
stream
)
{
using
namespace
arithm
;
typedef
void
(
*
func_t
)(
PtrStepSzb
src
,
int
cn
,
double
val
[
4
],
PtrStepSzb
dst
,
cudaStream_t
stream
);
static
const
func_t
funcs
[
7
][
6
]
=
{
{
cmpScalarEq
<
unsigned
char
>
,
cmpScalarGt
<
unsigned
char
>
,
cmpScalarGe
<
unsigned
char
>
,
cmpScalarLt
<
unsigned
char
>
,
cmpScalarLe
<
unsigned
char
>
,
cmpScalarNe
<
unsigned
char
>
},
{
cmpScalarEq
<
signed
char
>
,
cmpScalarGt
<
signed
char
>
,
cmpScalarGe
<
signed
char
>
,
cmpScalarLt
<
signed
char
>
,
cmpScalarLe
<
signed
char
>
,
cmpScalarNe
<
signed
char
>
},
{
cmpScalarEq
<
unsigned
short
>
,
cmpScalarGt
<
unsigned
short
>
,
cmpScalarGe
<
unsigned
short
>
,
cmpScalarLt
<
unsigned
short
>
,
cmpScalarLe
<
unsigned
short
>
,
cmpScalarNe
<
unsigned
short
>
},
{
cmpScalarEq
<
short
>
,
cmpScalarGt
<
short
>
,
cmpScalarGe
<
short
>
,
cmpScalarLt
<
short
>
,
cmpScalarLe
<
short
>
,
cmpScalarNe
<
short
>
},
{
cmpScalarEq
<
int
>
,
cmpScalarGt
<
int
>
,
cmpScalarGe
<
int
>
,
cmpScalarLt
<
int
>
,
cmpScalarLe
<
int
>
,
cmpScalarNe
<
int
>
},
{
cmpScalarEq
<
float
>
,
cmpScalarGt
<
float
>
,
cmpScalarGe
<
float
>
,
cmpScalarLt
<
float
>
,
cmpScalarLe
<
float
>
,
cmpScalarNe
<
float
>
},
{
cmpScalarEq
<
double
>
,
cmpScalarGt
<
double
>
,
cmpScalarGe
<
double
>
,
cmpScalarLt
<
double
>
,
cmpScalarLe
<
double
>
,
cmpScalarNe
<
double
>
}
};
typedef
void
(
*
cast_func_t
)(
Scalar
&
sc
);
static
const
cast_func_t
cast_func
[]
=
{
castScalar
<
unsigned
char
>
,
castScalar
<
signed
char
>
,
castScalar
<
unsigned
short
>
,
castScalar
<
short
>
,
castScalar
<
int
>
,
castScalar
<
float
>
,
castScalar
<
double
>
};
const
int
depth
=
src
.
depth
();
const
int
cn
=
src
.
channels
();
CV_Assert
(
depth
<=
CV_64F
);
CV_Assert
(
cn
<=
4
);
CV_Assert
(
cmpop
>=
CMP_EQ
&&
cmpop
<=
CMP_NE
);
if
(
depth
==
CV_64F
)
{
if
(
!
deviceSupports
(
NATIVE_DOUBLE
))
CV_Error
(
CV_StsUnsupportedFormat
,
"The device doesn't support double"
);
}
dst
.
create
(
src
.
size
(),
CV_MAKE_TYPE
(
CV_8U
,
cn
));
cast_func
[
depth
](
sc
);
funcs
[
depth
][
cmpop
](
src
,
cn
,
sc
.
val
,
dst
,
StreamAccessor
::
getStream
(
stream
));
}
//////////////////////////////////////////////////////////////////////////////
// Unary bitwise logical operations
...
...
modules/gpu/test/test_core.cpp
View file @
08914aa7
...
...
@@ -1669,6 +1669,117 @@ INSTANTIATE_TEST_CASE_P(GPU_Core, Compare_Array, testing::Combine(
ALL_CMP_CODES
,
WHOLE_SUBMAT
));
////////////////////////////////////////////////////////////////////////////////
// Compare_Scalar
namespace
{
template
<
template
<
typename
>
class
Op
,
typename
T
>
void
compareScalarImpl
(
const
cv
::
Mat
&
src
,
cv
::
Scalar
sc
,
cv
::
Mat
&
dst
)
{
Op
<
T
>
op
;
const
int
cn
=
src
.
channels
();
dst
.
create
(
src
.
size
(),
CV_MAKE_TYPE
(
CV_8U
,
cn
));
for
(
int
y
=
0
;
y
<
src
.
rows
;
++
y
)
{
for
(
int
x
=
0
;
x
<
src
.
cols
;
++
x
)
{
for
(
int
c
=
0
;
c
<
cn
;
++
c
)
{
T
src_val
=
src
.
at
<
T
>
(
y
,
x
*
cn
+
c
);
T
sc_val
=
cv
::
saturate_cast
<
T
>
(
sc
.
val
[
c
]);
dst
.
at
<
uchar
>
(
y
,
x
*
cn
+
c
)
=
static_cast
<
uchar
>
(
static_cast
<
int
>
(
op
(
src_val
,
sc_val
))
*
255
);
}
}
}
}
void
compareScalarGold
(
const
cv
::
Mat
&
src
,
cv
::
Scalar
sc
,
cv
::
Mat
&
dst
,
int
cmpop
)
{
typedef
void
(
*
func_t
)(
const
cv
::
Mat
&
src
,
cv
::
Scalar
sc
,
cv
::
Mat
&
dst
);
static
const
func_t
funcs
[
7
][
6
]
=
{
{
compareScalarImpl
<
std
::
equal_to
,
unsigned
char
>
,
compareScalarImpl
<
std
::
greater
,
unsigned
char
>
,
compareScalarImpl
<
std
::
greater_equal
,
unsigned
char
>
,
compareScalarImpl
<
std
::
less
,
unsigned
char
>
,
compareScalarImpl
<
std
::
less_equal
,
unsigned
char
>
,
compareScalarImpl
<
std
::
not_equal_to
,
unsigned
char
>
},
{
compareScalarImpl
<
std
::
equal_to
,
signed
char
>
,
compareScalarImpl
<
std
::
greater
,
signed
char
>
,
compareScalarImpl
<
std
::
greater_equal
,
signed
char
>
,
compareScalarImpl
<
std
::
less
,
signed
char
>
,
compareScalarImpl
<
std
::
less_equal
,
signed
char
>
,
compareScalarImpl
<
std
::
not_equal_to
,
signed
char
>
},
{
compareScalarImpl
<
std
::
equal_to
,
unsigned
short
>
,
compareScalarImpl
<
std
::
greater
,
unsigned
short
>
,
compareScalarImpl
<
std
::
greater_equal
,
unsigned
short
>
,
compareScalarImpl
<
std
::
less
,
unsigned
short
>
,
compareScalarImpl
<
std
::
less_equal
,
unsigned
short
>
,
compareScalarImpl
<
std
::
not_equal_to
,
unsigned
short
>
},
{
compareScalarImpl
<
std
::
equal_to
,
short
>
,
compareScalarImpl
<
std
::
greater
,
short
>
,
compareScalarImpl
<
std
::
greater_equal
,
short
>
,
compareScalarImpl
<
std
::
less
,
short
>
,
compareScalarImpl
<
std
::
less_equal
,
short
>
,
compareScalarImpl
<
std
::
not_equal_to
,
short
>
},
{
compareScalarImpl
<
std
::
equal_to
,
int
>
,
compareScalarImpl
<
std
::
greater
,
int
>
,
compareScalarImpl
<
std
::
greater_equal
,
int
>
,
compareScalarImpl
<
std
::
less
,
int
>
,
compareScalarImpl
<
std
::
less_equal
,
int
>
,
compareScalarImpl
<
std
::
not_equal_to
,
int
>
},
{
compareScalarImpl
<
std
::
equal_to
,
float
>
,
compareScalarImpl
<
std
::
greater
,
float
>
,
compareScalarImpl
<
std
::
greater_equal
,
float
>
,
compareScalarImpl
<
std
::
less
,
float
>
,
compareScalarImpl
<
std
::
less_equal
,
float
>
,
compareScalarImpl
<
std
::
not_equal_to
,
float
>
},
{
compareScalarImpl
<
std
::
equal_to
,
double
>
,
compareScalarImpl
<
std
::
greater
,
double
>
,
compareScalarImpl
<
std
::
greater_equal
,
double
>
,
compareScalarImpl
<
std
::
less
,
double
>
,
compareScalarImpl
<
std
::
less_equal
,
double
>
,
compareScalarImpl
<
std
::
not_equal_to
,
double
>
}
};
funcs
[
src
.
depth
()][
cmpop
](
src
,
sc
,
dst
);
}
}
PARAM_TEST_CASE
(
Compare_Scalar
,
cv
::
gpu
::
DeviceInfo
,
cv
::
Size
,
MatType
,
CmpCode
,
UseRoi
)
{
cv
::
gpu
::
DeviceInfo
devInfo
;
cv
::
Size
size
;
int
type
;
int
cmp_code
;
bool
useRoi
;
virtual
void
SetUp
()
{
devInfo
=
GET_PARAM
(
0
);
size
=
GET_PARAM
(
1
);
type
=
GET_PARAM
(
2
);
cmp_code
=
GET_PARAM
(
3
);
useRoi
=
GET_PARAM
(
4
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
}
};
GPU_TEST_P
(
Compare_Scalar
,
Accuracy
)
{
cv
::
Mat
src
=
randomMat
(
size
,
type
);
cv
::
Scalar
sc
=
randomScalar
(
0.0
,
255.0
);
if
(
src
.
depth
()
<
CV_32F
)
{
sc
.
val
[
0
]
=
cvRound
(
sc
.
val
[
0
]);
sc
.
val
[
1
]
=
cvRound
(
sc
.
val
[
1
]);
sc
.
val
[
2
]
=
cvRound
(
sc
.
val
[
2
]);
sc
.
val
[
3
]
=
cvRound
(
sc
.
val
[
3
]);
}
if
(
src
.
depth
()
==
CV_64F
&&
!
supportFeature
(
devInfo
,
cv
::
gpu
::
NATIVE_DOUBLE
))
{
try
{
cv
::
gpu
::
GpuMat
dst
;
cv
::
gpu
::
compare
(
loadMat
(
src
),
sc
,
dst
,
cmp_code
);
}
catch
(
const
cv
::
Exception
&
e
)
{
ASSERT_EQ
(
CV_StsUnsupportedFormat
,
e
.
code
);
}
}
else
{
cv
::
gpu
::
GpuMat
dst
=
createMat
(
size
,
CV_MAKE_TYPE
(
CV_8U
,
src
.
channels
()),
useRoi
);
cv
::
gpu
::
compare
(
loadMat
(
src
,
useRoi
),
sc
,
dst
,
cmp_code
);
cv
::
Mat
dst_gold
;
compareScalarGold
(
src
,
sc
,
dst_gold
,
cmp_code
);
EXPECT_MAT_NEAR
(
dst_gold
,
dst
,
0.0
);
}
}
INSTANTIATE_TEST_CASE_P
(
GPU_Core
,
Compare_Scalar
,
testing
::
Combine
(
ALL_DEVICES
,
DIFFERENT_SIZES
,
TYPES
(
CV_8U
,
CV_64F
,
1
,
4
),
ALL_CMP_CODES
,
WHOLE_SUBMAT
));
//////////////////////////////////////////////////////////////////////////////
// Bitwise_Array
...
...
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