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
d192117e
Commit
d192117e
authored
Jun 06, 2012
by
Marina Kolpakova
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
GPU resize with INTER_AREA
parent
bc541951
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
273 additions
and
28 deletions
+273
-28
resize.cu
modules/gpu/src/cuda/resize.cu
+62
-3
filters.hpp
modules/gpu/src/opencv2/gpu/device/filters.hpp
+108
-3
vec_traits.hpp
modules/gpu/src/opencv2/gpu/device/vec_traits.hpp
+2
-2
resize.cpp
modules/gpu/src/resize.cpp
+2
-1
test_resize.cpp
modules/gpu/test/test_resize.cpp
+47
-1
utility.hpp
modules/gpu/test/utility.hpp
+1
-1
imgwarp.cpp
modules/imgproc/src/imgwarp.cpp
+17
-17
test_imgwarp.cpp
modules/imgproc/test/test_imgwarp.cpp
+34
-0
No files found.
modules/gpu/src/cuda/resize.cu
View file @
d192117e
...
@@ -46,6 +46,7 @@
...
@@ -46,6 +46,7 @@
#include "opencv2/gpu/device/vec_math.hpp"
#include "opencv2/gpu/device/vec_math.hpp"
#include "opencv2/gpu/device/saturate_cast.hpp"
#include "opencv2/gpu/device/saturate_cast.hpp"
#include "opencv2/gpu/device/filters.hpp"
#include "opencv2/gpu/device/filters.hpp"
# include <cfloat>
namespace cv { namespace gpu { namespace device
namespace cv { namespace gpu { namespace device
{
{
...
@@ -65,6 +66,17 @@ namespace cv { namespace gpu { namespace device
...
@@ -65,6 +66,17 @@ namespace cv { namespace gpu { namespace device
}
}
}
}
template <typename Ptr2D, typename T> __global__ void resize_area(const Ptr2D src, float fx, float fy, DevMem2D_<T> dst)
{
const int x = blockDim.x * blockIdx.x + threadIdx.x;
const int y = blockDim.y * blockIdx.y + threadIdx.y;
if (x < dst.cols && y < dst.rows)
{
dst(y, x) = saturate_cast<T>(src(y, x));
}
}
template <template <typename> class Filter, typename T> struct ResizeDispatcherStream
template <template <typename> class Filter, typename T> struct ResizeDispatcherStream
{
{
static void call(DevMem2D_<T> src, float fx, float fy, DevMem2D_<T> dst, cudaStream_t stream)
static void call(DevMem2D_<T> src, float fx, float fy, DevMem2D_<T> dst, cudaStream_t stream)
...
@@ -74,13 +86,43 @@ namespace cv { namespace gpu { namespace device
...
@@ -74,13 +86,43 @@ namespace cv { namespace gpu { namespace device
BrdReplicate<T> brd(src.rows, src.cols);
BrdReplicate<T> brd(src.rows, src.cols);
BorderReader< PtrStep<T>, BrdReplicate<T> > brdSrc(src, brd);
BorderReader< PtrStep<T>, BrdReplicate<T> > brdSrc(src, brd);
Filter< BorderReader< PtrStep<T>, BrdReplicate<T> > > filteredSrc(brdSrc);
Filter< BorderReader< PtrStep<T>, BrdReplicate<T> > > filteredSrc(brdSrc
, fx, fy
);
resize<<<grid, block, 0, stream>>>(filteredSrc, fx, fy, dst);
resize<<<grid, block, 0, stream>>>(filteredSrc, fx, fy, dst);
cudaSafeCall( cudaGetLastError() );
cudaSafeCall( cudaGetLastError() );
}
}
};
};
template <typename T> struct ResizeDispatcherStream<AreaFilter, T>
{
static void call(DevMem2D_<T> src, float fx, float fy, DevMem2D_<T> dst, cudaStream_t stream)
{
dim3 block(32, 8);
dim3 grid(divUp(dst.cols, block.x), divUp(dst.rows, block.y));
BrdConstant<T> brd(src.rows, src.cols);
BorderReader< PtrStep<T>, BrdConstant<T> > brdSrc(src, brd);
AreaFilter< BorderReader< PtrStep<T>, BrdConstant<T> > > filteredSrc(brdSrc, fx, fy);
resize_area<<<grid, block, 0, stream>>>(filteredSrc, fx, fy, dst);
cudaSafeCall( cudaGetLastError() );
}
};
template <typename T> struct ResizeDispatcherStream<IntegerAreaFilter, T>
{
static void call(DevMem2D_<T> src, float fx, float fy, DevMem2D_<T> dst, cudaStream_t stream)
{
dim3 block(32, 8);
dim3 grid(divUp(dst.cols, block.x), divUp(dst.rows, block.y));
BrdConstant<T> brd(src.rows, src.cols);
BorderReader< PtrStep<T>, BrdConstant<T> > brdSrc(src, brd);
IntegerAreaFilter< BorderReader< PtrStep<T>, BrdConstant<T> > > filteredSrc(brdSrc, fx, fy);
resize_area<<<grid, block, 0, stream>>>(filteredSrc, fx, fy, dst);
cudaSafeCall( cudaGetLastError() );
}
};
template <template <typename> class Filter, typename T> struct ResizeDispatcherNonStream
template <template <typename> class Filter, typename T> struct ResizeDispatcherNonStream
{
{
static void call(DevMem2D_<T> src, DevMem2D_<T> srcWhole, int xoff, int yoff, float fx, float fy, DevMem2D_<T> dst)
static void call(DevMem2D_<T> src, DevMem2D_<T> srcWhole, int xoff, int yoff, float fx, float fy, DevMem2D_<T> dst)
...
@@ -169,14 +211,31 @@ namespace cv { namespace gpu { namespace device
...
@@ -169,14 +211,31 @@ namespace cv { namespace gpu { namespace device
}
}
};
};
template <typename T> struct ResizeDispatcher<AreaFilter, T>
{
static void call(DevMem2D_<T> src, DevMem2D_<T> srcWhole, int xoff, int yoff, float fx, float fy, DevMem2D_<T> dst, cudaStream_t stream)
{
int iscale_x = round(fx);
int iscale_y = round(fy);
if( std::abs(fx - iscale_x) < FLT_MIN && std::abs(fy - iscale_y) < FLT_MIN)
ResizeDispatcherStream<IntegerAreaFilter, T>::call(src, fx, fy, dst, stream);
else
ResizeDispatcherStream<AreaFilter, T>::call(src, fx, fy, dst, stream);
}
};
template <typename T> void resize_gpu(DevMem2Db src, DevMem2Db srcWhole, int xoff, int yoff, float fx, float fy,
template <typename T> void resize_gpu(DevMem2Db src, DevMem2Db srcWhole, int xoff, int yoff, float fx, float fy,
DevMem2Db dst, int interpolation, cudaStream_t stream)
DevMem2Db dst, int interpolation, cudaStream_t stream)
{
{
typedef void (*caller_t)(DevMem2D_<T> src, DevMem2D_<T> srcWhole, int xoff, int yoff, float fx, float fy, DevMem2D_<T> dst, cudaStream_t stream);
typedef void (*caller_t)(DevMem2D_<T> src, DevMem2D_<T> srcWhole, int xoff, int yoff, float fx, float fy, DevMem2D_<T> dst, cudaStream_t stream);
static const caller_t callers[
3] =
static const caller_t callers[
4] =
{
{
ResizeDispatcher<PointFilter, T>::call, ResizeDispatcher<LinearFilter, T>::call, ResizeDispatcher<CubicFilter, T>::call
ResizeDispatcher<PointFilter, T>::call,
ResizeDispatcher<LinearFilter, T>::call,
ResizeDispatcher<CubicFilter, T>::call,
ResizeDispatcher<AreaFilter, T>::call
};
};
callers[interpolation](static_cast< DevMem2D_<T> >(src), static_cast< DevMem2D_<T> >(srcWhole), xoff, yoff, fx, fy,
callers[interpolation](static_cast< DevMem2D_<T> >(src), static_cast< DevMem2D_<T> >(srcWhole), xoff, yoff, fx, fy,
...
...
modules/gpu/src/opencv2/gpu/device/filters.hpp
View file @
d192117e
...
@@ -55,7 +55,7 @@ namespace cv { namespace gpu { namespace device
...
@@ -55,7 +55,7 @@ namespace cv { namespace gpu { namespace device
typedef
typename
Ptr2D
::
elem_type
elem_type
;
typedef
typename
Ptr2D
::
elem_type
elem_type
;
typedef
float
index_type
;
typedef
float
index_type
;
explicit
__host__
__device__
__forceinline__
PointFilter
(
const
Ptr2D
&
src_
)
:
src
(
src_
)
{}
explicit
__host__
__device__
__forceinline__
PointFilter
(
const
Ptr2D
&
src_
,
float
fx
=
0.
f
,
float
fy
=
0.
f
)
:
src
(
src_
)
{}
__device__
__forceinline__
elem_type
operator
()(
float
y
,
float
x
)
const
__device__
__forceinline__
elem_type
operator
()(
float
y
,
float
x
)
const
{
{
...
@@ -70,7 +70,7 @@ namespace cv { namespace gpu { namespace device
...
@@ -70,7 +70,7 @@ namespace cv { namespace gpu { namespace device
typedef
typename
Ptr2D
::
elem_type
elem_type
;
typedef
typename
Ptr2D
::
elem_type
elem_type
;
typedef
float
index_type
;
typedef
float
index_type
;
explicit
__host__
__device__
__forceinline__
LinearFilter
(
const
Ptr2D
&
src_
)
:
src
(
src_
)
{}
explicit
__host__
__device__
__forceinline__
LinearFilter
(
const
Ptr2D
&
src_
,
float
fx
=
0.
f
,
float
fy
=
0.
f
)
:
src
(
src_
)
{}
__device__
__forceinline__
elem_type
operator
()(
float
y
,
float
x
)
const
__device__
__forceinline__
elem_type
operator
()(
float
y
,
float
x
)
const
{
{
...
@@ -107,7 +107,7 @@ namespace cv { namespace gpu { namespace device
...
@@ -107,7 +107,7 @@ namespace cv { namespace gpu { namespace device
typedef
float
index_type
;
typedef
float
index_type
;
typedef
typename
TypeVec
<
float
,
VecTraits
<
elem_type
>::
cn
>::
vec_type
work_type
;
typedef
typename
TypeVec
<
float
,
VecTraits
<
elem_type
>::
cn
>::
vec_type
work_type
;
explicit
__host__
__device__
__forceinline__
CubicFilter
(
const
Ptr2D
&
src_
)
:
src
(
src_
)
{}
explicit
__host__
__device__
__forceinline__
CubicFilter
(
const
Ptr2D
&
src_
,
float
fx
=
0.
f
,
float
fy
=
0.
f
)
:
src
(
src_
)
{}
static
__device__
__forceinline__
float
bicubicCoeff
(
float
x_
)
static
__device__
__forceinline__
float
bicubicCoeff
(
float
x_
)
{
{
...
@@ -154,6 +154,111 @@ namespace cv { namespace gpu { namespace device
...
@@ -154,6 +154,111 @@ namespace cv { namespace gpu { namespace device
const
Ptr2D
src
;
const
Ptr2D
src
;
};
};
// for integer scaling
template
<
typename
Ptr2D
>
struct
IntegerAreaFilter
{
typedef
typename
Ptr2D
::
elem_type
elem_type
;
typedef
float
index_type
;
explicit
__host__
__device__
__forceinline__
IntegerAreaFilter
(
const
Ptr2D
&
src_
,
float
scale_x_
,
float
scale_y_
)
:
src
(
src_
),
scale_x
(
scale_x_
),
scale_y
(
scale_y_
),
scale
(
1.
f
/
(
scale_x
*
scale_y
))
{}
__device__
__forceinline__
elem_type
operator
()(
float
y
,
float
x
)
const
{
float
fsx1
=
x
*
scale_x
;
float
fsx2
=
fsx1
+
scale_x
;
int
sx1
=
__float2int_ru
(
fsx1
);
int
sx2
=
__float2int_rd
(
fsx2
);
float
fsy1
=
y
*
scale_y
;
float
fsy2
=
fsy1
+
scale_y
;
int
sy1
=
__float2int_ru
(
fsy1
);
int
sy2
=
__float2int_rd
(
fsy2
);
typedef
typename
TypeVec
<
float
,
VecTraits
<
elem_type
>::
cn
>::
vec_type
work_type
;
work_type
out
=
VecTraits
<
work_type
>::
all
(
0.
f
);
for
(
int
dy
=
sy1
;
dy
<
sy2
;
++
dy
)
for
(
int
dx
=
sx1
;
dx
<
sx2
;
++
dx
)
{
out
=
out
+
src
(
dy
,
dx
)
*
scale
;
}
return
saturate_cast
<
elem_type
>
(
out
);
}
const
Ptr2D
src
;
float
scale_x
,
scale_y
,
scale
;
};
template
<
typename
Ptr2D
>
struct
AreaFilter
{
typedef
typename
Ptr2D
::
elem_type
elem_type
;
typedef
float
index_type
;
explicit
__host__
__device__
__forceinline__
AreaFilter
(
const
Ptr2D
&
src_
,
float
scale_x_
,
float
scale_y_
)
:
src
(
src_
),
scale_x
(
scale_x_
),
scale_y
(
scale_y_
){}
__device__
__forceinline__
elem_type
operator
()(
float
y
,
float
x
)
const
{
float
fsx1
=
x
*
scale_x
;
float
fsx2
=
fsx1
+
scale_x
;
int
sx1
=
__float2int_ru
(
fsx1
);
int
sx2
=
__float2int_rd
(
fsx2
);
float
fsy1
=
y
*
scale_y
;
float
fsy2
=
fsy1
+
scale_y
;
int
sy1
=
__float2int_ru
(
fsy1
);
int
sy2
=
__float2int_rd
(
fsy2
);
float
scale
=
1.
f
/
(
fminf
(
scale_x
,
src
.
width
-
fsx1
)
*
fminf
(
scale_y
,
src
.
height
-
fsy1
));
typedef
typename
TypeVec
<
float
,
VecTraits
<
elem_type
>::
cn
>::
vec_type
work_type
;
work_type
out
=
VecTraits
<
work_type
>::
all
(
0.
f
);
for
(
int
dy
=
sy1
;
dy
<
sy2
;
++
dy
)
{
for
(
int
dx
=
sx1
;
dx
<
sx2
;
++
dx
)
out
=
out
+
src
(
dy
,
dx
)
*
scale
;
if
(
sx1
>
fsx1
)
out
=
out
+
src
(
dy
,
(
sx1
-
1
)
)
*
((
sx1
-
fsx1
)
*
scale
);
if
(
sx2
<
fsx2
)
out
=
out
+
src
(
dy
,
sx2
)
*
((
fsx2
-
sx2
)
*
scale
);
}
if
(
sy1
>
fsy1
)
for
(
int
dx
=
sx1
;
dx
<
sx2
;
++
dx
)
out
=
out
+
src
(
(
sy1
-
1
)
,
dx
)
*
((
sy1
-
fsy1
)
*
scale
);
if
(
sy2
<
fsy2
)
for
(
int
dx
=
sx1
;
dx
<
sx2
;
++
dx
)
out
=
out
+
src
(
sy2
,
dx
)
*
((
fsy2
-
sy2
)
*
scale
);
if
((
sy1
>
fsy1
)
&&
(
sx1
>
fsx1
))
out
=
out
+
src
(
(
sy1
-
1
)
,
(
sx1
-
1
))
*
((
sy1
-
fsy1
)
*
(
sx1
-
fsx1
)
*
scale
);
if
((
sy1
>
fsy1
)
&&
(
sx2
<
fsx2
))
out
=
out
+
src
(
(
sy1
-
1
)
,
sx2
)
*
((
sy1
-
fsy1
)
*
(
fsx2
-
sx2
)
*
scale
);
if
((
sy2
<
fsy2
)
&&
(
sx2
<
fsx2
))
out
=
out
+
src
(
sy2
,
sx2
)
*
((
fsy2
-
sy2
)
*
(
fsx2
-
sx2
)
*
scale
);
if
((
sy2
<
fsy2
)
&&
(
sx1
>
fsx1
))
out
=
out
+
src
(
sy2
,
(
sx1
-
1
))
*
((
fsy2
-
sy2
)
*
(
sx1
-
fsx1
)
*
scale
);
return
saturate_cast
<
elem_type
>
(
out
);
}
const
Ptr2D
src
;
float
scale_x
,
scale_y
;
int
width
,
haight
;
};
}}}
// namespace cv { namespace gpu { namespace device
}}}
// namespace cv { namespace gpu { namespace device
#endif // __OPENCV_GPU_FILTERS_HPP__
#endif // __OPENCV_GPU_FILTERS_HPP__
modules/gpu/src/opencv2/gpu/device/vec_traits.hpp
View file @
d192117e
...
@@ -221,7 +221,7 @@ namespace cv { namespace gpu { namespace device
...
@@ -221,7 +221,7 @@ namespace cv { namespace gpu { namespace device
template
<>
struct
VecTraits
<
char
>
template
<>
struct
VecTraits
<
char
>
{
{
typedef
char
elem_type
;
typedef
char
elem_type
;
enum
{
cn
=
1
};
enum
{
cn
=
1
};
static
__device__
__host__
__forceinline__
char
all
(
char
v
)
{
return
v
;}
static
__device__
__host__
__forceinline__
char
all
(
char
v
)
{
return
v
;}
static
__device__
__host__
__forceinline__
char
make
(
char
x
)
{
return
x
;}
static
__device__
__host__
__forceinline__
char
make
(
char
x
)
{
return
x
;}
...
@@ -229,7 +229,7 @@ namespace cv { namespace gpu { namespace device
...
@@ -229,7 +229,7 @@ namespace cv { namespace gpu { namespace device
};
};
template
<>
struct
VecTraits
<
schar
>
template
<>
struct
VecTraits
<
schar
>
{
{
typedef
schar
elem_type
;
typedef
schar
elem_type
;
enum
{
cn
=
1
};
enum
{
cn
=
1
};
static
__device__
__host__
__forceinline__
schar
all
(
schar
v
)
{
return
v
;}
static
__device__
__host__
__forceinline__
schar
all
(
schar
v
)
{
return
v
;}
static
__device__
__host__
__forceinline__
schar
make
(
schar
x
)
{
return
x
;}
static
__device__
__host__
__forceinline__
schar
make
(
schar
x
)
{
return
x
;}
...
...
modules/gpu/src/resize.cpp
View file @
d192117e
...
@@ -61,7 +61,8 @@ namespace cv { namespace gpu { namespace device
...
@@ -61,7 +61,8 @@ namespace cv { namespace gpu { namespace device
void
cv
::
gpu
::
resize
(
const
GpuMat
&
src
,
GpuMat
&
dst
,
Size
dsize
,
double
fx
,
double
fy
,
int
interpolation
,
Stream
&
s
)
void
cv
::
gpu
::
resize
(
const
GpuMat
&
src
,
GpuMat
&
dst
,
Size
dsize
,
double
fx
,
double
fy
,
int
interpolation
,
Stream
&
s
)
{
{
CV_Assert
(
src
.
depth
()
<=
CV_32F
&&
src
.
channels
()
<=
4
);
CV_Assert
(
src
.
depth
()
<=
CV_32F
&&
src
.
channels
()
<=
4
);
CV_Assert
(
interpolation
==
INTER_NEAREST
||
interpolation
==
INTER_LINEAR
||
interpolation
==
INTER_CUBIC
);
CV_Assert
(
interpolation
==
INTER_NEAREST
||
interpolation
==
INTER_LINEAR
||
interpolation
==
INTER_CUBIC
||
interpolation
==
INTER_AREA
);
CV_Assert
(
!
(
dsize
==
Size
())
||
(
fx
>
0
&&
fy
>
0
));
CV_Assert
(
!
(
dsize
==
Size
())
||
(
fx
>
0
&&
fy
>
0
));
if
(
dsize
==
Size
())
if
(
dsize
==
Size
())
...
...
modules/gpu/test/test_resize.cpp
View file @
d192117e
...
@@ -48,7 +48,8 @@
...
@@ -48,7 +48,8 @@
namespace
namespace
{
{
template
<
typename
T
,
template
<
typename
>
class
Interpolator
>
void
resizeImpl
(
const
cv
::
Mat
&
src
,
cv
::
Mat
&
dst
,
double
fx
,
double
fy
)
template
<
typename
T
,
template
<
typename
>
class
Interpolator
>
void
resizeImpl
(
const
cv
::
Mat
&
src
,
cv
::
Mat
&
dst
,
double
fx
,
double
fy
)
{
{
const
int
cn
=
src
.
channels
();
const
int
cn
=
src
.
channels
();
...
@@ -156,6 +157,51 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Resize, testing::Combine(
...
@@ -156,6 +157,51 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Resize, testing::Combine(
testing
::
Values
(
Interpolation
(
cv
::
INTER_NEAREST
),
Interpolation
(
cv
::
INTER_LINEAR
),
Interpolation
(
cv
::
INTER_CUBIC
)),
testing
::
Values
(
Interpolation
(
cv
::
INTER_NEAREST
),
Interpolation
(
cv
::
INTER_LINEAR
),
Interpolation
(
cv
::
INTER_CUBIC
)),
WHOLE_SUBMAT
));
WHOLE_SUBMAT
));
/////////////////
PARAM_TEST_CASE
(
ResizeArea
,
cv
::
gpu
::
DeviceInfo
,
cv
::
Size
,
MatType
,
double
,
Interpolation
,
UseRoi
)
{
cv
::
gpu
::
DeviceInfo
devInfo
;
cv
::
Size
size
;
double
coeff
;
int
interpolation
;
int
type
;
bool
useRoi
;
virtual
void
SetUp
()
{
devInfo
=
GET_PARAM
(
0
);
size
=
GET_PARAM
(
1
);
type
=
GET_PARAM
(
2
);
coeff
=
GET_PARAM
(
3
);
interpolation
=
GET_PARAM
(
4
);
useRoi
=
GET_PARAM
(
5
);
cv
::
gpu
::
setDevice
(
devInfo
.
deviceID
());
}
};
TEST_P
(
ResizeArea
,
Accuracy
)
{
cv
::
Mat
src
=
randomMat
(
size
,
type
);
cv
::
gpu
::
GpuMat
dst
=
createMat
(
cv
::
Size
(
cv
::
saturate_cast
<
int
>
(
src
.
cols
*
coeff
),
cv
::
saturate_cast
<
int
>
(
src
.
rows
*
coeff
)),
type
,
useRoi
);
cv
::
gpu
::
resize
(
loadMat
(
src
,
useRoi
),
dst
,
cv
::
Size
(),
coeff
,
coeff
,
interpolation
);
cv
::
Mat
dst_cpu
;
cv
::
resize
(
src
,
dst_cpu
,
cv
::
Size
(),
coeff
,
coeff
,
interpolation
);
EXPECT_MAT_NEAR
(
dst_cpu
,
dst
,
src
.
depth
()
==
CV_32F
?
1e-2
:
1.0
);
}
INSTANTIATE_TEST_CASE_P
(
GPU_ImgProc
,
ResizeArea
,
testing
::
Combine
(
ALL_DEVICES
,
DIFFERENT_SIZES
,
testing
::
Values
(
MatType
(
CV_8UC3
),
MatType
(
CV_16UC1
),
MatType
(
CV_16UC3
),
MatType
(
CV_16UC4
),
MatType
(
CV_32FC1
),
MatType
(
CV_32FC3
),
MatType
(
CV_32FC4
)),
testing
::
Values
(
/*0.3,*/
0.5
),
testing
::
Values
(
Interpolation
(
cv
::
INTER_AREA
)),
WHOLE_SUBMAT
));
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// Test NPP
// Test NPP
...
...
modules/gpu/test/utility.hpp
View file @
d192117e
...
@@ -277,7 +277,7 @@ IMPLEMENT_PARAM_CLASS(Channels, int)
...
@@ -277,7 +277,7 @@ IMPLEMENT_PARAM_CLASS(Channels, int)
CV_ENUM
(
NormCode
,
cv
::
NORM_INF
,
cv
::
NORM_L1
,
cv
::
NORM_L2
,
cv
::
NORM_TYPE_MASK
,
cv
::
NORM_RELATIVE
,
cv
::
NORM_MINMAX
)
CV_ENUM
(
NormCode
,
cv
::
NORM_INF
,
cv
::
NORM_L1
,
cv
::
NORM_L2
,
cv
::
NORM_TYPE_MASK
,
cv
::
NORM_RELATIVE
,
cv
::
NORM_MINMAX
)
CV_ENUM
(
Interpolation
,
cv
::
INTER_NEAREST
,
cv
::
INTER_LINEAR
,
cv
::
INTER_CUBIC
)
CV_ENUM
(
Interpolation
,
cv
::
INTER_NEAREST
,
cv
::
INTER_LINEAR
,
cv
::
INTER_CUBIC
,
cv
::
INTER_AREA
)
CV_ENUM
(
BorderType
,
cv
::
BORDER_REFLECT101
,
cv
::
BORDER_REPLICATE
,
cv
::
BORDER_CONSTANT
,
cv
::
BORDER_REFLECT
,
cv
::
BORDER_WRAP
)
CV_ENUM
(
BorderType
,
cv
::
BORDER_REFLECT101
,
cv
::
BORDER_REPLICATE
,
cv
::
BORDER_CONSTANT
,
cv
::
BORDER_REFLECT
,
cv
::
BORDER_WRAP
)
#define ALL_BORDER_TYPES testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP))
#define ALL_BORDER_TYPES testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP))
...
...
modules/imgproc/src/imgwarp.cpp
View file @
d192117e
...
@@ -878,8 +878,8 @@ struct VResizeLinear
...
@@ -878,8 +878,8 @@ struct VResizeLinear
VecOp
vecOp
;
VecOp
vecOp
;
int
x
=
vecOp
((
const
uchar
**
)
src
,
(
uchar
*
)
dst
,
(
const
uchar
*
)
beta
,
width
);
int
x
=
vecOp
((
const
uchar
**
)
src
,
(
uchar
*
)
dst
,
(
const
uchar
*
)
beta
,
width
);
#if CV_ENABLE_UNROLLED
#if CV_ENABLE_UNROLLED
for
(
;
x
<=
width
-
4
;
x
+=
4
)
for
(
;
x
<=
width
-
4
;
x
+=
4
)
{
{
WT
t0
,
t1
;
WT
t0
,
t1
;
t0
=
S0
[
x
]
*
b0
+
S1
[
x
]
*
b1
;
t0
=
S0
[
x
]
*
b0
+
S1
[
x
]
*
b1
;
...
@@ -1035,7 +1035,7 @@ struct VResizeLanczos4
...
@@ -1035,7 +1035,7 @@ struct VResizeLanczos4
CastOp
castOp
;
CastOp
castOp
;
VecOp
vecOp
;
VecOp
vecOp
;
int
k
,
x
=
vecOp
((
const
uchar
**
)
src
,
(
uchar
*
)
dst
,
(
const
uchar
*
)
beta
,
width
);
int
k
,
x
=
vecOp
((
const
uchar
**
)
src
,
(
uchar
*
)
dst
,
(
const
uchar
*
)
beta
,
width
);
#if CV_ENABLE_UNROLLED
#if CV_ENABLE_UNROLLED
for
(
;
x
<=
width
-
4
;
x
+=
4
)
for
(
;
x
<=
width
-
4
;
x
+=
4
)
{
{
WT
b
=
beta
[
0
];
WT
b
=
beta
[
0
];
...
@@ -1130,7 +1130,7 @@ static void resizeGeneric_( const Mat& src, Mat& dst,
...
@@ -1130,7 +1130,7 @@ static void resizeGeneric_( const Mat& src, Mat& dst,
if
(
k0
<
ksize
)
if
(
k0
<
ksize
)
hresize
(
srows
+
k0
,
rows
+
k0
,
ksize
-
k0
,
xofs
,
alpha
,
hresize
(
srows
+
k0
,
rows
+
k0
,
ksize
-
k0
,
xofs
,
alpha
,
ssize
.
width
,
dsize
.
width
,
cn
,
xmin
,
xmax
);
ssize
.
width
,
dsize
.
width
,
cn
,
xmin
,
xmax
);
vresize
(
(
const
WT
**
)
rows
,
(
T
*
)(
dst
.
data
+
dst
.
step
*
dy
),
beta
,
dsize
.
width
);
vresize
(
(
const
WT
**
)
rows
,
(
T
*
)(
dst
.
data
+
dst
.
step
*
dy
),
beta
,
dsize
.
width
);
}
}
}
}
...
@@ -1163,8 +1163,8 @@ static void resizeAreaFast_( const Mat& src, Mat& dst, const int* ofs, const int
...
@@ -1163,8 +1163,8 @@ static void resizeAreaFast_( const Mat& src, Mat& dst, const int* ofs, const int
{
{
const
T
*
S
=
(
const
T
*
)(
src
.
data
+
src
.
step
*
sy0
)
+
xofs
[
dx
];
const
T
*
S
=
(
const
T
*
)(
src
.
data
+
src
.
step
*
sy0
)
+
xofs
[
dx
];
WT
sum
=
0
;
WT
sum
=
0
;
k
=
0
;
k
=
0
;
#if CV_ENABLE_UNROLLED
#if CV_ENABLE_UNROLLED
for
(
;
k
<=
area
-
4
;
k
+=
4
)
for
(
;
k
<=
area
-
4
;
k
+=
4
)
sum
+=
S
[
ofs
[
k
]]
+
S
[
ofs
[
k
+
1
]]
+
S
[
ofs
[
k
+
2
]]
+
S
[
ofs
[
k
+
3
]];
sum
+=
S
[
ofs
[
k
]]
+
S
[
ofs
[
k
+
1
]]
+
S
[
ofs
[
k
+
2
]]
+
S
[
ofs
[
k
+
3
]];
#endif
#endif
...
@@ -1329,11 +1329,11 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
...
@@ -1329,11 +1329,11 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
resizeGeneric_
<
resizeGeneric_
<
HResizeLinear
<
uchar
,
int
,
short
,
HResizeLinear
<
uchar
,
int
,
short
,
INTER_RESIZE_COEF_SCALE
,
INTER_RESIZE_COEF_SCALE
,
HResizeLinearVec_8u32s
>
,
HResizeLinearVec_8u32s
>
,
VResizeLinear
<
uchar
,
int
,
short
,
VResizeLinear
<
uchar
,
int
,
short
,
FixedPtCast
<
int
,
uchar
,
INTER_RESIZE_COEF_BITS
*
2
>
,
FixedPtCast
<
int
,
uchar
,
INTER_RESIZE_COEF_BITS
*
2
>
,
VResizeLinearVec_32s8u
>
>
,
VResizeLinearVec_32s8u
>
>
,
0
,
0
,
resizeGeneric_
<
resizeGeneric_
<
HResizeLinear
<
ushort
,
float
,
float
,
1
,
HResizeLinear
<
ushort
,
float
,
float
,
1
,
HResizeLinearVec_16u32f
>
,
HResizeLinearVec_16u32f
>
,
...
@@ -1344,7 +1344,7 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
...
@@ -1344,7 +1344,7 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
HResizeLinearVec_16s32f
>
,
HResizeLinearVec_16s32f
>
,
VResizeLinear
<
short
,
float
,
float
,
Cast
<
float
,
short
>
,
VResizeLinear
<
short
,
float
,
float
,
Cast
<
float
,
short
>
,
VResizeLinearVec_32f16s
>
>
,
VResizeLinearVec_32f16s
>
>
,
0
,
0
,
resizeGeneric_
<
resizeGeneric_
<
HResizeLinear
<
float
,
float
,
float
,
1
,
HResizeLinear
<
float
,
float
,
float
,
1
,
HResizeLinearVec_32f
>
,
HResizeLinearVec_32f
>
,
...
@@ -1374,7 +1374,7 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
...
@@ -1374,7 +1374,7 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
HResizeCubic
<
short
,
float
,
float
>
,
HResizeCubic
<
short
,
float
,
float
>
,
VResizeCubic
<
short
,
float
,
float
,
Cast
<
float
,
short
>
,
VResizeCubic
<
short
,
float
,
float
,
Cast
<
float
,
short
>
,
VResizeCubicVec_32f16s
>
>
,
VResizeCubicVec_32f16s
>
>
,
0
,
0
,
resizeGeneric_
<
resizeGeneric_
<
HResizeCubic
<
float
,
float
,
float
>
,
HResizeCubic
<
float
,
float
,
float
>
,
VResizeCubic
<
float
,
float
,
float
,
Cast
<
float
,
float
>
,
VResizeCubic
<
float
,
float
,
float
,
Cast
<
float
,
float
>
,
...
@@ -1396,10 +1396,10 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
...
@@ -1396,10 +1396,10 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
resizeGeneric_
<
HResizeLanczos4
<
ushort
,
float
,
float
>
,
resizeGeneric_
<
HResizeLanczos4
<
ushort
,
float
,
float
>
,
VResizeLanczos4
<
ushort
,
float
,
float
,
Cast
<
float
,
ushort
>
,
VResizeLanczos4
<
ushort
,
float
,
float
,
Cast
<
float
,
ushort
>
,
VResizeNoVec
>
>
,
VResizeNoVec
>
>
,
resizeGeneric_
<
HResizeLanczos4
<
short
,
float
,
float
>
,
resizeGeneric_
<
HResizeLanczos4
<
short
,
float
,
float
>
,
VResizeLanczos4
<
short
,
float
,
float
,
Cast
<
float
,
short
>
,
VResizeLanczos4
<
short
,
float
,
float
,
Cast
<
float
,
short
>
,
VResizeNoVec
>
>
,
VResizeNoVec
>
>
,
0
,
0
,
resizeGeneric_
<
HResizeLanczos4
<
float
,
float
,
float
>
,
resizeGeneric_
<
HResizeLanczos4
<
float
,
float
,
float
>
,
VResizeLanczos4
<
float
,
float
,
float
,
Cast
<
float
,
float
>
,
VResizeLanczos4
<
float
,
float
,
float
,
Cast
<
float
,
float
>
,
VResizeNoVec
>
>
,
VResizeNoVec
>
>
,
...
@@ -1412,8 +1412,8 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
...
@@ -1412,8 +1412,8 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
static
ResizeAreaFastFunc
areafast_tab
[]
=
static
ResizeAreaFastFunc
areafast_tab
[]
=
{
{
resizeAreaFast_
<
uchar
,
int
>
,
0
,
resizeAreaFast_
<
uchar
,
int
>
,
0
,
resizeAreaFast_
<
ushort
,
float
>
,
resizeAreaFast_
<
ushort
,
float
>
,
resizeAreaFast_
<
short
,
float
>
,
resizeAreaFast_
<
short
,
float
>
,
0
,
0
,
resizeAreaFast_
<
float
,
float
>
,
resizeAreaFast_
<
float
,
float
>
,
resizeAreaFast_
<
double
,
double
>
,
resizeAreaFast_
<
double
,
double
>
,
...
@@ -1528,7 +1528,7 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
...
@@ -1528,7 +1528,7 @@ void cv::resize( InputArray _src, OutputArray _dst, Size dsize,
assert
(
k
<
ssize
.
width
*
2
);
assert
(
k
<
ssize
.
width
*
2
);
xofs
[
k
].
di
=
dx
*
cn
;
xofs
[
k
].
di
=
dx
*
cn
;
xofs
[
k
].
si
=
sx2
*
cn
;
xofs
[
k
].
si
=
sx2
*
cn
;
xofs
[
k
++
].
alpha
=
(
float
)(
(
fsx2
-
sx2
)
*
scale
);
xofs
[
k
++
].
alpha
=
(
float
)(
min
(
fsx2
-
sx2
,
1.
)
*
scale
);
}
}
}
}
...
@@ -3480,7 +3480,7 @@ void cvLinearPolar( const CvArr* srcarr, CvArr* dstarr,
...
@@ -3480,7 +3480,7 @@ void cvLinearPolar( const CvArr* srcarr, CvArr* dstarr,
if
(
!
CV_ARE_TYPES_EQ
(
src
,
dst
))
if
(
!
CV_ARE_TYPES_EQ
(
src
,
dst
))
CV_Error
(
CV_StsUnmatchedFormats
,
""
);
CV_Error
(
CV_StsUnmatchedFormats
,
""
);
ssize
.
width
=
src
->
cols
;
ssize
.
width
=
src
->
cols
;
ssize
.
height
=
src
->
rows
;
ssize
.
height
=
src
->
rows
;
dsize
.
width
=
dst
->
cols
;
dsize
.
width
=
dst
->
cols
;
dsize
.
height
=
dst
->
rows
;
dsize
.
height
=
dst
->
rows
;
...
...
modules/imgproc/test/test_imgwarp.cpp
View file @
d192117e
...
@@ -1462,6 +1462,40 @@ TEST(Imgproc_fitLine_Mat_3dC1, regression)
...
@@ -1462,6 +1462,40 @@ TEST(Imgproc_fitLine_Mat_3dC1, regression)
ASSERT_EQ
(
line2
.
size
(),
(
size_t
)
6
);
ASSERT_EQ
(
line2
.
size
(),
(
size_t
)
6
);
}
}
TEST
(
Imgproc_resize_area
,
regression
)
{
static
ushort
input_data
[
16
*
16
]
=
{
90
,
94
,
80
,
3
,
231
,
2
,
186
,
245
,
188
,
165
,
10
,
19
,
201
,
169
,
8
,
228
,
86
,
5
,
203
,
120
,
136
,
185
,
24
,
94
,
81
,
150
,
163
,
137
,
88
,
105
,
132
,
132
,
236
,
48
,
250
,
218
,
19
,
52
,
54
,
221
,
159
,
112
,
45
,
11
,
152
,
153
,
112
,
134
,
78
,
133
,
136
,
83
,
65
,
76
,
82
,
250
,
9
,
235
,
148
,
26
,
236
,
179
,
200
,
50
,
99
,
51
,
103
,
142
,
201
,
65
,
176
,
33
,
49
,
226
,
177
,
109
,
46
,
21
,
67
,
130
,
54
,
125
,
107
,
154
,
145
,
51
,
199
,
189
,
161
,
142
,
231
,
240
,
139
,
162
,
240
,
22
,
231
,
86
,
79
,
106
,
92
,
47
,
146
,
156
,
36
,
207
,
71
,
33
,
2
,
244
,
221
,
71
,
44
,
127
,
71
,
177
,
75
,
126
,
68
,
119
,
200
,
129
,
191
,
251
,
6
,
236
,
247
,
6
,
133
,
175
,
56
,
239
,
147
,
221
,
243
,
154
,
242
,
82
,
106
,
99
,
77
,
158
,
60
,
229
,
2
,
42
,
24
,
174
,
27
,
198
,
14
,
204
,
246
,
251
,
141
,
31
,
114
,
163
,
29
,
147
,
121
,
53
,
74
,
31
,
147
,
189
,
42
,
98
,
202
,
17
,
228
,
123
,
209
,
40
,
77
,
49
,
112
,
203
,
30
,
12
,
205
,
25
,
19
,
106
,
145
,
185
,
163
,
201
,
237
,
223
,
247
,
38
,
33
,
105
,
243
,
117
,
92
,
179
,
204
,
248
,
160
,
90
,
73
,
126
,
2
,
41
,
213
,
204
,
6
,
124
,
195
,
201
,
230
,
187
,
210
,
167
,
48
,
79
,
123
,
159
,
145
,
218
,
105
,
209
,
240
,
152
,
136
,
235
,
235
,
164
,
157
,
9
,
152
,
38
,
27
,
209
,
120
,
77
,
238
,
196
,
240
,
233
,
10
,
241
,
90
,
67
,
12
,
79
,
0
,
43
,
58
,
27
,
83
,
199
,
190
,
182
};
static
ushort
expected_data
=
{
// row 1
120
,
100
,
151
,
101
,
103
,
//?
// row 2
106
,
115
,
141
,
130
,
suturate_cast
<
ushort
>
(
0
),
// row 3
91
,
136
,
170
,
114
,
suturate_cast
<
ushort
>
(
0
),
// row 4
104
,
122
,
131
,
147
,
suturate_cast
<
ushort
>
(
0
),
// row 5
suturate_cast
<
ushort
>
(
0
),
suturate_cast
<
ushort
>
(
0
),
suturate_cast
<
ushort
>
(
0
),
suturate_cast
<
ushort
>
(
0
),
suturate_cast
<
ushort
>
(
0
)
};
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
TEST
(
Imgproc_Resize
,
accuracy
)
{
CV_ResizeTest
test
;
test
.
safe_run
();
}
TEST
(
Imgproc_Resize
,
accuracy
)
{
CV_ResizeTest
test
;
test
.
safe_run
();
}
...
...
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