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
fbd9bfba
Commit
fbd9bfba
authored
Sep 10, 2012
by
Ilya Lavrenov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed some warnings and errors on windows
parent
b1b5e392
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
120 additions
and
122 deletions
+120
-122
test_imgwarp_strict.cpp
modules/imgproc/test/test_imgwarp_strict.cpp
+120
-122
No files found.
modules/imgproc/test/test_imgwarp_strict.cpp
View file @
fbd9bfba
...
@@ -58,7 +58,7 @@ namespace internal
...
@@ -58,7 +58,7 @@ namespace internal
cvtest
::
TS
::
ptr
()
->
printf
(
cvtest
::
TS
::
SUMMARY
,
buffer
);
cvtest
::
TS
::
ptr
()
->
printf
(
cvtest
::
TS
::
SUMMARY
,
buffer
);
va_end
(
args
);
va_end
(
args
);
}
}
#define PRINT_TO_LOG __wrap_printf_func
#define PRINT_TO_LOG __wrap_printf_func
}
}
...
@@ -78,7 +78,7 @@ public:
...
@@ -78,7 +78,7 @@ public:
CV_ImageWarpBaseTest
();
CV_ImageWarpBaseTest
();
virtual
~
CV_ImageWarpBaseTest
();
virtual
~
CV_ImageWarpBaseTest
();
virtual
void
run
(
int
);
virtual
void
run
(
int
);
protected
:
protected
:
virtual
void
generate_test_data
();
virtual
void
generate_test_data
();
...
@@ -89,7 +89,7 @@ protected:
...
@@ -89,7 +89,7 @@ protected:
virtual
void
prepare_test_data_for_reference_func
();
virtual
void
prepare_test_data_for_reference_func
();
Size
randSize
(
RNG
&
rng
)
const
;
Size
randSize
(
RNG
&
rng
)
const
;
const
char
*
interpolation_to_string
(
int
inter_type
)
const
;
const
char
*
interpolation_to_string
(
int
inter_type
)
const
;
int
interpolation
;
int
interpolation
;
...
@@ -130,8 +130,8 @@ const char* CV_ImageWarpBaseTest::interpolation_to_string(int inter) const
...
@@ -130,8 +130,8 @@ const char* CV_ImageWarpBaseTest::interpolation_to_string(int inter) const
Size
CV_ImageWarpBaseTest
::
randSize
(
RNG
&
rng
)
const
Size
CV_ImageWarpBaseTest
::
randSize
(
RNG
&
rng
)
const
{
{
Size
size
;
Size
size
;
size
.
width
=
s
aturate_cast
<
u
int
>
(
std
::
exp
(
rng
.
uniform
(
1.0
f
,
7.0
f
)));
size
.
width
=
s
tatic_cast
<
int
>
(
std
::
exp
(
rng
.
uniform
(
1.0
f
,
7.0
f
)));
size
.
height
=
s
aturate_cast
<
u
int
>
(
std
::
exp
(
rng
.
uniform
(
1.0
f
,
7.0
f
)));
size
.
height
=
s
tatic_cast
<
int
>
(
std
::
exp
(
rng
.
uniform
(
1.0
f
,
7.0
f
)));
return
size
;
return
size
;
}
}
...
@@ -150,7 +150,7 @@ void CV_ImageWarpBaseTest::generate_test_data()
...
@@ -150,7 +150,7 @@ void CV_ImageWarpBaseTest::generate_test_data()
int
cn
=
rng
.
uniform
(
1
,
4
);
int
cn
=
rng
.
uniform
(
1
,
4
);
while
(
cn
==
2
)
while
(
cn
==
2
)
cn
=
rng
.
uniform
(
1
,
4
);
cn
=
rng
.
uniform
(
1
,
4
);
src
.
create
(
ssize
,
CV_MAKE_TYPE
(
depth
,
cn
));
src
.
create
(
ssize
,
CV_MAKE_TYPE
(
depth
,
cn
));
// generating the src matrix
// generating the src matrix
...
@@ -170,10 +170,10 @@ void CV_ImageWarpBaseTest::generate_test_data()
...
@@ -170,10 +170,10 @@ void CV_ImageWarpBaseTest::generate_test_data()
for
(
x
=
cell_size
;
x
<
src
.
cols
;
x
+=
cell_size
)
for
(
x
=
cell_size
;
x
<
src
.
cols
;
x
+=
cell_size
)
line
(
src
,
Point2i
(
x
,
0
),
Point2i
(
x
,
src
.
rows
),
Scalar
::
all
(
0
),
1
);
line
(
src
,
Point2i
(
x
,
0
),
Point2i
(
x
,
src
.
rows
),
Scalar
::
all
(
0
),
1
);
}
}
// generating an interpolation type
// generating an interpolation type
interpolation
=
rng
.
uniform
(
0
,
CV_INTER_LANCZOS4
+
1
);
interpolation
=
rng
.
uniform
(
0
,
CV_INTER_LANCZOS4
+
1
);
// generating the dst matrix structure
// generating the dst matrix structure
double
scale_x
=
2
,
scale_y
=
2
;
double
scale_x
=
2
,
scale_y
=
2
;
if
(
interpolation
==
INTER_AREA
)
if
(
interpolation
==
INTER_AREA
)
...
@@ -196,13 +196,13 @@ void CV_ImageWarpBaseTest::generate_test_data()
...
@@ -196,13 +196,13 @@ void CV_ImageWarpBaseTest::generate_test_data()
scale_y
=
rng
.
uniform
(
0.4
,
4.0
);
scale_y
=
rng
.
uniform
(
0.4
,
4.0
);
}
}
CV_Assert
(
scale_x
>
0.0
f
&&
scale_y
>
0.0
f
);
CV_Assert
(
scale_x
>
0.0
f
&&
scale_y
>
0.0
f
);
dsize
.
width
=
saturate_cast
<
int
>
((
ssize
.
width
+
scale_x
-
1
)
/
scale_x
);
dsize
.
width
=
saturate_cast
<
int
>
((
ssize
.
width
+
scale_x
-
1
)
/
scale_x
);
dsize
.
height
=
saturate_cast
<
int
>
((
ssize
.
height
+
scale_y
-
1
)
/
scale_y
);
dsize
.
height
=
saturate_cast
<
int
>
((
ssize
.
height
+
scale_y
-
1
)
/
scale_y
);
dst
=
Mat
::
zeros
(
dsize
,
src
.
type
());
dst
=
Mat
::
zeros
(
dsize
,
src
.
type
());
reference_dst
=
Mat
::
zeros
(
dst
.
size
(),
CV_MAKE_TYPE
(
CV_32F
,
dst
.
channels
()));
reference_dst
=
Mat
::
zeros
(
dst
.
size
(),
CV_MAKE_TYPE
(
CV_32F
,
dst
.
channels
()));
if
(
interpolation
==
INTER_AREA
&&
(
scale_x
<
1.0
||
scale_y
<
1.0
))
if
(
interpolation
==
INTER_AREA
&&
(
scale_x
<
1.0
||
scale_y
<
1.0
))
interpolation
=
INTER_LINEAR
;
interpolation
=
INTER_LINEAR
;
}
}
...
@@ -228,7 +228,7 @@ void CV_ImageWarpBaseTest::validate_results() const
...
@@ -228,7 +228,7 @@ void CV_ImageWarpBaseTest::validate_results() const
{
{
Mat
_dst
;
Mat
_dst
;
dst
.
convertTo
(
_dst
,
reference_dst
.
depth
());
dst
.
convertTo
(
_dst
,
reference_dst
.
depth
());
Size
dsize
=
dst
.
size
(),
ssize
=
src
.
size
();
Size
dsize
=
dst
.
size
(),
ssize
=
src
.
size
();
int
cn
=
_dst
.
channels
();
int
cn
=
_dst
.
channels
();
dsize
.
width
*=
cn
;
dsize
.
width
*=
cn
;
...
@@ -241,12 +241,12 @@ void CV_ImageWarpBaseTest::validate_results() const
...
@@ -241,12 +241,12 @@ void CV_ImageWarpBaseTest::validate_results() const
t
=
1.0
f
;
t
=
1.0
f
;
else
if
(
interpolation
==
INTER_AREA
)
else
if
(
interpolation
==
INTER_AREA
)
t
=
2.0
f
;
t
=
2.0
f
;
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
{
{
const
float
*
rD
=
reference_dst
.
ptr
<
float
>
(
dy
);
const
float
*
rD
=
reference_dst
.
ptr
<
float
>
(
dy
);
const
float
*
D
=
_dst
.
ptr
<
float
>
(
dy
);
const
float
*
D
=
_dst
.
ptr
<
float
>
(
dy
);
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
if
(
fabs
(
rD
[
dx
]
-
D
[
dx
])
>
t
&&
if
(
fabs
(
rD
[
dx
]
-
D
[
dx
])
>
t
&&
// fabs(rD[dx] - D[dx]) < 250.0f &&
// fabs(rD[dx] - D[dx]) < 250.0f &&
...
@@ -257,7 +257,7 @@ void CV_ImageWarpBaseTest::validate_results() const
...
@@ -257,7 +257,7 @@ void CV_ImageWarpBaseTest::validate_results() const
PRINT_TO_LOG
(
"Tuple (rD, D): (%f, %f)
\n
"
,
rD
[
dx
],
D
[
dx
]);
PRINT_TO_LOG
(
"Tuple (rD, D): (%f, %f)
\n
"
,
rD
[
dx
],
D
[
dx
]);
PRINT_TO_LOG
(
"Dsize: (%d, %d)
\n
"
,
dsize
.
width
/
cn
,
dsize
.
height
);
PRINT_TO_LOG
(
"Dsize: (%d, %d)
\n
"
,
dsize
.
width
/
cn
,
dsize
.
height
);
PRINT_TO_LOG
(
"Ssize: (%d, %d)
\n
"
,
src
.
cols
,
src
.
rows
);
PRINT_TO_LOG
(
"Ssize: (%d, %d)
\n
"
,
src
.
cols
,
src
.
rows
);
float
scale_x
=
static_cast
<
float
>
(
ssize
.
width
)
/
dsize
.
width
,
float
scale_x
=
static_cast
<
float
>
(
ssize
.
width
)
/
dsize
.
width
,
scale_y
=
static_cast
<
float
>
(
ssize
.
height
)
/
dsize
.
height
;
scale_y
=
static_cast
<
float
>
(
ssize
.
height
)
/
dsize
.
height
;
PRINT_TO_LOG
(
"Interpolation: %s
\n
"
,
interpolation_to_string
(
interpolation
==
INTER_AREA
&&
PRINT_TO_LOG
(
"Interpolation: %s
\n
"
,
interpolation_to_string
(
interpolation
==
INTER_AREA
&&
...
@@ -266,32 +266,32 @@ void CV_ImageWarpBaseTest::validate_results() const
...
@@ -266,32 +266,32 @@ void CV_ImageWarpBaseTest::validate_results() const
PRINT_TO_LOG
(
"Scale (x, y): (%lf, %lf)
\n
"
,
scale_x
,
scale_y
);
PRINT_TO_LOG
(
"Scale (x, y): (%lf, %lf)
\n
"
,
scale_x
,
scale_y
);
PRINT_TO_LOG
(
"Elemsize: %d
\n
"
,
src
.
elemSize1
());
PRINT_TO_LOG
(
"Elemsize: %d
\n
"
,
src
.
elemSize1
());
PRINT_TO_LOG
(
"Channels: %d
\n
"
,
cn
);
PRINT_TO_LOG
(
"Channels: %d
\n
"
,
cn
);
#ifdef SHOW_IMAGE
#ifdef SHOW_IMAGE
const
std
::
string
w1
(
"OpenCV impl (run func)"
),
w2
(
"Reference func"
),
w3
(
"Src image"
),
w4
(
"Diff"
);
const
std
::
string
w1
(
"OpenCV impl (run func)"
),
w2
(
"Reference func"
),
w3
(
"Src image"
),
w4
(
"Diff"
);
namedWindow
(
w1
,
CV_WINDOW_KEEPRATIO
);
namedWindow
(
w1
,
CV_WINDOW_KEEPRATIO
);
namedWindow
(
w2
,
CV_WINDOW_KEEPRATIO
);
namedWindow
(
w2
,
CV_WINDOW_KEEPRATIO
);
namedWindow
(
w3
,
CV_WINDOW_KEEPRATIO
);
namedWindow
(
w3
,
CV_WINDOW_KEEPRATIO
);
namedWindow
(
w4
,
CV_WINDOW_KEEPRATIO
);
namedWindow
(
w4
,
CV_WINDOW_KEEPRATIO
);
Mat
diff
;
Mat
diff
;
absdiff
(
reference_dst
,
_dst
,
diff
);
absdiff
(
reference_dst
,
_dst
,
diff
);
imshow
(
w1
,
dst
);
imshow
(
w1
,
dst
);
imshow
(
w2
,
reference_dst
);
imshow
(
w2
,
reference_dst
);
imshow
(
w3
,
src
);
imshow
(
w3
,
src
);
imshow
(
w4
,
diff
);
imshow
(
w4
,
diff
);
waitKey
();
waitKey
();
#endif
#endif
const
int
radius
=
3
;
const
int
radius
=
3
;
int
rmin
=
MAX
(
dy
-
radius
,
0
),
rmax
=
MIN
(
dy
+
radius
,
dsize
.
height
);
int
rmin
=
MAX
(
dy
-
radius
,
0
),
rmax
=
MIN
(
dy
+
radius
,
dsize
.
height
);
int
cmin
=
MAX
(
dx
/
cn
-
radius
,
0
),
cmax
=
MIN
(
dx
/
cn
+
radius
,
dsize
.
width
);
int
cmin
=
MAX
(
dx
/
cn
-
radius
,
0
),
cmax
=
MIN
(
dx
/
cn
+
radius
,
dsize
.
width
);
std
::
cout
<<
"opencv result:
\n
"
<<
dst
(
Range
(
rmin
,
rmax
),
Range
(
cmin
,
cmax
))
<<
std
::
endl
;
std
::
cout
<<
"opencv result:
\n
"
<<
dst
(
Range
(
rmin
,
rmax
),
Range
(
cmin
,
cmax
))
<<
std
::
endl
;
std
::
cout
<<
"reference result:
\n
"
<<
reference_dst
(
Range
(
rmin
,
rmax
),
Range
(
cmin
,
cmax
))
<<
std
::
endl
;
std
::
cout
<<
"reference result:
\n
"
<<
reference_dst
(
Range
(
rmin
,
rmax
),
Range
(
cmin
,
cmax
))
<<
std
::
endl
;
ts
->
set_failed_test_info
(
cvtest
::
TS
::
FAIL_BAD_ACCURACY
);
ts
->
set_failed_test_info
(
cvtest
::
TS
::
FAIL_BAD_ACCURACY
);
return
;
return
;
}
}
...
@@ -324,7 +324,7 @@ protected:
...
@@ -324,7 +324,7 @@ protected:
virtual
void
run_func
();
virtual
void
run_func
();
virtual
void
run_reference_func
();
virtual
void
run_reference_func
();
private
:
private
:
double
scale_x
;
double
scale_x
;
double
scale_y
;
double
scale_y
;
...
@@ -333,7 +333,7 @@ private:
...
@@ -333,7 +333,7 @@ private:
void
resize_generic
();
void
resize_generic
();
void
resize_area
();
void
resize_area
();
double
getWeight
(
double
a
,
double
b
,
int
x
);
double
getWeight
(
double
a
,
double
b
,
int
x
);
typedef
std
::
vector
<
std
::
pair
<
int
,
double
>
>
dim
;
typedef
std
::
vector
<
std
::
pair
<
int
,
double
>
>
dim
;
void
generate_buffer
(
double
scale
,
dim
&
_dim
);
void
generate_buffer
(
double
scale
,
dim
&
_dim
);
void
resize_1d
(
const
Mat
&
_src
,
Mat
&
_dst
,
int
dy
,
const
dim
&
_dim
);
void
resize_1d
(
const
Mat
&
_src
,
Mat
&
_dst
,
int
dy
,
const
dim
&
_dim
);
...
@@ -356,23 +356,23 @@ namespace internal
...
@@ -356,23 +356,23 @@ namespace internal
coeffs
[
0
]
=
1.
f
-
x
;
coeffs
[
0
]
=
1.
f
-
x
;
coeffs
[
1
]
=
x
;
coeffs
[
1
]
=
x
;
}
}
void
interpolateCubic
(
float
x
,
float
*
coeffs
)
void
interpolateCubic
(
float
x
,
float
*
coeffs
)
{
{
const
float
A
=
-
0.75
f
;
const
float
A
=
-
0.75
f
;
coeffs
[
0
]
=
((
A
*
(
x
+
1
)
-
5
*
A
)
*
(
x
+
1
)
+
8
*
A
)
*
(
x
+
1
)
-
4
*
A
;
coeffs
[
0
]
=
((
A
*
(
x
+
1
)
-
5
*
A
)
*
(
x
+
1
)
+
8
*
A
)
*
(
x
+
1
)
-
4
*
A
;
coeffs
[
1
]
=
((
A
+
2
)
*
x
-
(
A
+
3
))
*
x
*
x
+
1
;
coeffs
[
1
]
=
((
A
+
2
)
*
x
-
(
A
+
3
))
*
x
*
x
+
1
;
coeffs
[
2
]
=
((
A
+
2
)
*
(
1
-
x
)
-
(
A
+
3
))
*
(
1
-
x
)
*
(
1
-
x
)
+
1
;
coeffs
[
2
]
=
((
A
+
2
)
*
(
1
-
x
)
-
(
A
+
3
))
*
(
1
-
x
)
*
(
1
-
x
)
+
1
;
coeffs
[
3
]
=
1.
f
-
coeffs
[
0
]
-
coeffs
[
1
]
-
coeffs
[
2
];
coeffs
[
3
]
=
1.
f
-
coeffs
[
0
]
-
coeffs
[
1
]
-
coeffs
[
2
];
}
}
void
interpolateLanczos4
(
float
x
,
float
*
coeffs
)
void
interpolateLanczos4
(
float
x
,
float
*
coeffs
)
{
{
static
const
double
s45
=
0.70710678118654752440084436210485
;
static
const
double
s45
=
0.70710678118654752440084436210485
;
static
const
double
cs
[][
2
]
=
static
const
double
cs
[][
2
]
=
{{
1
,
0
},
{
-
s45
,
-
s45
},
{
0
,
1
},
{
s45
,
-
s45
},
{
-
1
,
0
},
{
s45
,
s45
},
{
0
,
-
1
},
{
-
s45
,
s45
}};
{{
1
,
0
},
{
-
s45
,
-
s45
},
{
0
,
1
},
{
s45
,
-
s45
},
{
-
1
,
0
},
{
s45
,
s45
},
{
0
,
-
1
},
{
-
s45
,
s45
}};
if
(
x
<
FLT_EPSILON
)
if
(
x
<
FLT_EPSILON
)
{
{
for
(
int
i
=
0
;
i
<
8
;
i
++
)
for
(
int
i
=
0
;
i
<
8
;
i
++
)
...
@@ -380,7 +380,7 @@ namespace internal
...
@@ -380,7 +380,7 @@ namespace internal
coeffs
[
3
]
=
1
;
coeffs
[
3
]
=
1
;
return
;
return
;
}
}
float
sum
=
0
;
float
sum
=
0
;
double
y0
=-
(
x
+
3
)
*
CV_PI
*
0.25
,
s0
=
sin
(
y0
),
c0
=
cos
(
y0
);
double
y0
=-
(
x
+
3
)
*
CV_PI
*
0.25
,
s0
=
sin
(
y0
),
c0
=
cos
(
y0
);
for
(
int
i
=
0
;
i
<
8
;
i
++
)
for
(
int
i
=
0
;
i
<
8
;
i
++
)
...
@@ -389,12 +389,12 @@ namespace internal
...
@@ -389,12 +389,12 @@ namespace internal
coeffs
[
i
]
=
(
float
)((
cs
[
i
][
0
]
*
s0
+
cs
[
i
][
1
]
*
c0
)
/
(
y
*
y
));
coeffs
[
i
]
=
(
float
)((
cs
[
i
][
0
]
*
s0
+
cs
[
i
][
1
]
*
c0
)
/
(
y
*
y
));
sum
+=
coeffs
[
i
];
sum
+=
coeffs
[
i
];
}
}
sum
=
1.
f
/
sum
;
sum
=
1.
f
/
sum
;
for
(
int
i
=
0
;
i
<
8
;
i
++
)
for
(
int
i
=
0
;
i
<
8
;
i
++
)
coeffs
[
i
]
*=
sum
;
coeffs
[
i
]
*=
sum
;
}
}
typedef
void
(
*
interpolate_method
)(
float
x
,
float
*
coeffs
);
typedef
void
(
*
interpolate_method
)(
float
x
,
float
*
coeffs
);
interpolate_method
inter_array
[]
=
{
&
interpolateLinear
,
&
interpolateCubic
,
&
interpolateLanczos4
};
interpolate_method
inter_array
[]
=
{
&
interpolateLinear
,
&
interpolateCubic
,
&
interpolateLanczos4
};
}
}
...
@@ -402,10 +402,10 @@ namespace internal
...
@@ -402,10 +402,10 @@ namespace internal
void
CV_Resize_Test
::
generate_test_data
()
void
CV_Resize_Test
::
generate_test_data
()
{
{
CV_ImageWarpBaseTest
::
generate_test_data
();
CV_ImageWarpBaseTest
::
generate_test_data
();
scale_x
=
src
.
cols
/
static_cast
<
double
>
(
dst
.
cols
);
scale_x
=
src
.
cols
/
static_cast
<
double
>
(
dst
.
cols
);
scale_y
=
src
.
rows
/
static_cast
<
double
>
(
dst
.
rows
);
scale_y
=
src
.
rows
/
static_cast
<
double
>
(
dst
.
rows
);
area_fast
=
interpolation
==
INTER_AREA
&&
area_fast
=
interpolation
==
INTER_AREA
&&
fabs
(
scale_x
-
cvRound
(
scale_x
))
<
FLT_EPSILON
&&
fabs
(
scale_x
-
cvRound
(
scale_x
))
<
FLT_EPSILON
&&
fabs
(
scale_y
-
cvRound
(
scale_y
))
<
FLT_EPSILON
;
fabs
(
scale_y
-
cvRound
(
scale_y
))
<
FLT_EPSILON
;
...
@@ -424,7 +424,7 @@ void CV_Resize_Test::run_func()
...
@@ -424,7 +424,7 @@ void CV_Resize_Test::run_func()
void
CV_Resize_Test
::
run_reference_func
()
void
CV_Resize_Test
::
run_reference_func
()
{
{
CV_ImageWarpBaseTest
::
prepare_test_data_for_reference_func
();
CV_ImageWarpBaseTest
::
prepare_test_data_for_reference_func
();
if
(
interpolation
==
INTER_AREA
)
if
(
interpolation
==
INTER_AREA
)
resize_area
();
resize_area
();
else
else
...
@@ -433,7 +433,7 @@ void CV_Resize_Test::run_reference_func()
...
@@ -433,7 +433,7 @@ void CV_Resize_Test::run_reference_func()
double
CV_Resize_Test
::
getWeight
(
double
a
,
double
b
,
int
x
)
double
CV_Resize_Test
::
getWeight
(
double
a
,
double
b
,
int
x
)
{
{
float
w
=
std
::
min
<
double
>
(
x
+
1
,
b
)
-
std
::
max
<
double
>
(
x
,
a
);
float
w
=
std
::
min
(
static_cast
<
double
>
(
x
+
1
),
b
)
-
std
::
max
(
static_cast
<
double
>
(
x
)
,
a
);
CV_Assert
(
w
>=
0
);
CV_Assert
(
w
>=
0
);
return
w
;
return
w
;
}
}
...
@@ -441,28 +441,28 @@ double CV_Resize_Test::getWeight(double a, double b, int x)
...
@@ -441,28 +441,28 @@ double CV_Resize_Test::getWeight(double a, double b, int x)
void
CV_Resize_Test
::
resize_area
()
void
CV_Resize_Test
::
resize_area
()
{
{
Size
ssize
=
src
.
size
(),
dsize
=
reference_dst
.
size
();
Size
ssize
=
src
.
size
(),
dsize
=
reference_dst
.
size
();
CV_Assert
(
ssize
.
area
()
>
0
&&
dsize
.
area
()
>
0
);
CV_Assert
(
ssize
.
area
()
>
0
&&
dsize
.
area
()
>
0
);
int
cn
=
src
.
channels
();
int
cn
=
src
.
channels
();
CV_Assert
(
scale_x
>=
1.0
&&
scale_y
>=
1.0
);
CV_Assert
(
scale_x
>=
1.0
&&
scale_y
>=
1.0
);
double
fsy0
=
0
,
fsy1
=
scale_y
;
double
fsy0
=
0
,
fsy1
=
scale_y
;
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
{
{
float
*
yD
=
reference_dst
.
ptr
<
float
>
(
dy
);
float
*
yD
=
reference_dst
.
ptr
<
float
>
(
dy
);
int
isy0
=
cvFloor
(
fsy0
),
isy1
=
std
::
min
(
cvFloor
(
fsy1
),
ssize
.
height
-
1
);
int
isy0
=
cvFloor
(
fsy0
),
isy1
=
std
::
min
(
cvFloor
(
fsy1
),
ssize
.
height
-
1
);
CV_Assert
(
isy1
<=
ssize
.
height
&&
isy0
<
ssize
.
height
);
CV_Assert
(
isy1
<=
ssize
.
height
&&
isy0
<
ssize
.
height
);
float
fsx0
=
0
,
fsx1
=
scale_x
;
double
fsx0
=
0
,
fsx1
=
scale_x
;
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
{
{
float
*
xyD
=
yD
+
cn
*
dx
;
float
*
xyD
=
yD
+
cn
*
dx
;
int
isx0
=
cvFloor
(
fsx0
),
isx1
=
std
::
min
(
ssize
.
width
-
1
,
cvFloor
(
fsx1
));
int
isx0
=
cvFloor
(
fsx0
),
isx1
=
std
::
min
(
ssize
.
width
-
1
,
cvFloor
(
fsx1
));
CV_Assert
(
isx1
<=
ssize
.
width
);
CV_Assert
(
isx1
<=
ssize
.
width
);
CV_Assert
(
isx0
<
ssize
.
width
);
CV_Assert
(
isx0
<
ssize
.
width
);
// for each pixel of dst
// for each pixel of dst
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
{
{
...
@@ -476,37 +476,37 @@ void CV_Resize_Test::resize_area()
...
@@ -476,37 +476,37 @@ void CV_Resize_Test::resize_area()
double
wy
=
getWeight
(
fsy0
,
fsy1
,
sy
);
double
wy
=
getWeight
(
fsy0
,
fsy1
,
sy
);
double
wx
=
getWeight
(
fsx0
,
fsx1
,
sx
);
double
wx
=
getWeight
(
fsx0
,
fsx1
,
sx
);
double
w
=
wx
*
wy
;
double
w
=
wx
*
wy
;
xyD
[
r
]
+=
yS
[
sx
*
cn
+
r
]
*
w
;
xyD
[
r
]
+=
static_cast
<
float
>
(
yS
[
sx
*
cn
+
r
]
*
w
)
;
area
+=
w
;
area
+=
w
;
}
}
}
}
CV_Assert
(
area
!=
0
);
CV_Assert
(
area
!=
0
);
// norming pixel
// norming pixel
xyD
[
r
]
/=
area
;
xyD
[
r
]
=
static_cast
<
float
>
(
xyD
[
r
]
/
area
)
;
}
}
fsx1
=
std
::
min
<
double
>
((
fsx0
=
fsx1
)
+
scale_x
,
ssize
.
width
);
fsx1
=
std
::
min
((
fsx0
=
fsx1
)
+
scale_x
,
static_cast
<
double
>
(
ssize
.
width
)
);
}
}
fsy1
=
std
::
min
<
double
>
((
fsy0
=
fsy1
)
+
scale_y
,
ssize
.
height
);
fsy1
=
std
::
min
((
fsy0
=
fsy1
)
+
scale_y
,
static_cast
<
double
>
(
ssize
.
height
)
);
}
}
}
}
// for interpolation type : INTER_LINEAR, INTER_LINEAR, INTER_CUBIC, INTER_LANCZOS4
// for interpolation type : INTER_LINEAR, INTER_LINEAR, INTER_CUBIC, INTER_LANCZOS4
void
CV_Resize_Test
::
resize_1d
(
const
Mat
&
_src
,
Mat
&
_dst
,
int
dy
,
const
dim
&
_dim
)
void
CV_Resize_Test
::
resize_1d
(
const
Mat
&
_src
,
Mat
&
_dst
,
int
dy
,
const
dim
&
_dim
)
{
{
Size
dsize
=
_dst
.
size
();
Size
dsize
=
_dst
.
size
();
int
cn
=
_dst
.
channels
();
int
cn
=
_dst
.
channels
();
float
*
yD
=
_dst
.
ptr
<
float
>
(
dy
);
float
*
yD
=
_dst
.
ptr
<
float
>
(
dy
);
if
(
interpolation
==
INTER_NEAREST
)
if
(
interpolation
==
INTER_NEAREST
)
{
{
const
float
*
yS
=
_src
.
ptr
<
float
>
(
dy
);
const
float
*
yS
=
_src
.
ptr
<
float
>
(
dy
);
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
{
{
int
isx
=
_dim
[
dx
].
first
;
int
isx
=
_dim
[
dx
].
first
;
const
float
*
xyS
=
yS
+
isx
*
cn
;
const
float
*
xyS
=
yS
+
isx
*
cn
;
float
*
xyD
=
yD
+
dx
*
cn
;
float
*
xyD
=
yD
+
dx
*
cn
;
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
xyD
[
r
]
=
xyS
[
r
];
xyD
[
r
]
=
xyS
[
r
];
}
}
...
@@ -515,13 +515,13 @@ void CV_Resize_Test::resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _d
...
@@ -515,13 +515,13 @@ void CV_Resize_Test::resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _d
{
{
internal
::
interpolate_method
inter_func
=
internal
::
inter_array
[
interpolation
-
(
interpolation
==
INTER_LANCZOS4
?
2
:
1
)];
internal
::
interpolate_method
inter_func
=
internal
::
inter_array
[
interpolation
-
(
interpolation
==
INTER_LANCZOS4
?
2
:
1
)];
int
elemsize
=
_src
.
elemSize
();
int
elemsize
=
_src
.
elemSize
();
int
ofs
=
0
,
ksize
=
2
;
int
ofs
=
0
,
ksize
=
2
;
if
(
interpolation
==
INTER_CUBIC
)
if
(
interpolation
==
INTER_CUBIC
)
ofs
=
1
,
ksize
=
4
;
ofs
=
1
,
ksize
=
4
;
else
if
(
interpolation
==
INTER_LANCZOS4
)
else
if
(
interpolation
==
INTER_LANCZOS4
)
ofs
=
3
,
ksize
=
8
;
ofs
=
3
,
ksize
=
8
;
Mat
_extended_src_row
(
1
,
_src
.
cols
+
ksize
*
2
,
_src
.
type
());
Mat
_extended_src_row
(
1
,
_src
.
cols
+
ksize
*
2
,
_src
.
type
());
uchar
*
srow
=
_src
.
data
+
dy
*
_src
.
step
;
uchar
*
srow
=
_src
.
data
+
dy
*
_src
.
step
;
memcpy
(
_extended_src_row
.
data
+
elemsize
*
ksize
,
srow
,
_src
.
step
);
memcpy
(
_extended_src_row
.
data
+
elemsize
*
ksize
,
srow
,
_src
.
step
);
...
@@ -530,7 +530,7 @@ void CV_Resize_Test::resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _d
...
@@ -530,7 +530,7 @@ void CV_Resize_Test::resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _d
memcpy
(
_extended_src_row
.
data
+
k
*
elemsize
,
srow
,
elemsize
);
memcpy
(
_extended_src_row
.
data
+
k
*
elemsize
,
srow
,
elemsize
);
memcpy
(
_extended_src_row
.
data
+
(
ksize
+
k
)
*
elemsize
+
_src
.
step
,
srow
+
_src
.
step
-
elemsize
,
elemsize
);
memcpy
(
_extended_src_row
.
data
+
(
ksize
+
k
)
*
elemsize
+
_src
.
step
,
srow
+
_src
.
step
-
elemsize
,
elemsize
);
}
}
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
{
{
int
isx
=
_dim
[
dx
].
first
;
int
isx
=
_dim
[
dx
].
first
;
...
@@ -539,8 +539,8 @@ void CV_Resize_Test::resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _d
...
@@ -539,8 +539,8 @@ void CV_Resize_Test::resize_1d(const Mat& _src, Mat& _dst, int dy, const dim& _d
float
*
xyD
=
yD
+
dx
*
cn
;
float
*
xyD
=
yD
+
dx
*
cn
;
const
float
*
xyS
=
_extended_src_row
.
ptr
<
float
>
(
0
)
+
(
isx
+
ksize
-
ofs
)
*
cn
;
const
float
*
xyS
=
_extended_src_row
.
ptr
<
float
>
(
0
)
+
(
isx
+
ksize
-
ofs
)
*
cn
;
float
w
[
ksize
];
float
w
[
8
];
inter_func
(
fsx
,
w
);
inter_func
(
static_cast
<
float
>
(
fsx
)
,
w
);
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
{
{
...
@@ -559,7 +559,7 @@ void CV_Resize_Test::generate_buffer(double scale, dim& _dim)
...
@@ -559,7 +559,7 @@ void CV_Resize_Test::generate_buffer(double scale, dim& _dim)
{
{
int
length
=
_dim
.
size
();
int
length
=
_dim
.
size
();
for
(
int
dx
=
0
;
dx
<
length
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
length
;
++
dx
)
{
{
double
fsx
=
scale
*
(
dx
+
0.5
f
)
-
0.5
f
;
double
fsx
=
scale
*
(
dx
+
0.5
f
)
-
0.5
f
;
int
isx
=
cvFloor
(
fsx
);
int
isx
=
cvFloor
(
fsx
);
_dim
[
dx
]
=
std
::
make_pair
(
isx
,
fsx
-
isx
);
_dim
[
dx
]
=
std
::
make_pair
(
isx
,
fsx
-
isx
);
...
@@ -570,12 +570,12 @@ void CV_Resize_Test::resize_generic()
...
@@ -570,12 +570,12 @@ void CV_Resize_Test::resize_generic()
{
{
Size
dsize
=
reference_dst
.
size
(),
ssize
=
src
.
size
();
Size
dsize
=
reference_dst
.
size
(),
ssize
=
src
.
size
();
CV_Assert
(
dsize
.
area
()
>
0
&&
ssize
.
area
()
>
0
);
CV_Assert
(
dsize
.
area
()
>
0
&&
ssize
.
area
()
>
0
);
dim
dims
[]
=
{
dim
(
dsize
.
width
),
dim
(
dsize
.
height
)
};
dim
dims
[]
=
{
dim
(
dsize
.
width
),
dim
(
dsize
.
height
)
};
if
(
interpolation
==
INTER_NEAREST
)
if
(
interpolation
==
INTER_NEAREST
)
{
{
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
dims
[
0
][
dx
].
first
=
std
::
min
(
cvFloor
(
dx
*
scale_x
),
ssize
.
width
-
1
);
dims
[
0
][
dx
].
first
=
std
::
min
(
cvFloor
(
dx
*
scale_x
),
ssize
.
width
-
1
);
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
dims
[
1
][
dy
].
first
=
std
::
min
(
cvFloor
(
dy
*
scale_y
),
ssize
.
height
-
1
);
dims
[
1
][
dy
].
first
=
std
::
min
(
cvFloor
(
dy
*
scale_y
),
ssize
.
height
-
1
);
}
}
...
@@ -584,14 +584,14 @@ void CV_Resize_Test::resize_generic()
...
@@ -584,14 +584,14 @@ void CV_Resize_Test::resize_generic()
generate_buffer
(
scale_x
,
dims
[
0
]);
generate_buffer
(
scale_x
,
dims
[
0
]);
generate_buffer
(
scale_y
,
dims
[
1
]);
generate_buffer
(
scale_y
,
dims
[
1
]);
}
}
Mat
tmp
(
ssize
.
height
,
dsize
.
width
,
reference_dst
.
type
());
Mat
tmp
(
ssize
.
height
,
dsize
.
width
,
reference_dst
.
type
());
for
(
int
dy
=
0
;
dy
<
tmp
.
rows
;
++
dy
)
for
(
int
dy
=
0
;
dy
<
tmp
.
rows
;
++
dy
)
resize_1d
(
src
,
tmp
,
dy
,
dims
[
0
]);
resize_1d
(
src
,
tmp
,
dy
,
dims
[
0
]);
transpose
(
tmp
,
tmp
);
transpose
(
tmp
,
tmp
);
transpose
(
reference_dst
,
reference_dst
);
transpose
(
reference_dst
,
reference_dst
);
for
(
int
dy
=
0
;
dy
<
tmp
.
rows
;
++
dy
)
for
(
int
dy
=
0
;
dy
<
tmp
.
rows
;
++
dy
)
resize_1d
(
tmp
,
reference_dst
,
dy
,
dims
[
1
]);
resize_1d
(
tmp
,
reference_dst
,
dy
,
dims
[
1
]);
transpose
(
reference_dst
,
reference_dst
);
transpose
(
reference_dst
,
reference_dst
);
...
@@ -624,7 +624,7 @@ protected:
...
@@ -624,7 +624,7 @@ protected:
Scalar
borderValue
;
Scalar
borderValue
;
remap_func
funcs
[
2
];
remap_func
funcs
[
2
];
private
:
private
:
void
remap_nearest
(
const
Mat
&
,
Mat
&
);
void
remap_nearest
(
const
Mat
&
,
Mat
&
);
void
remap_generic
(
const
Mat
&
,
Mat
&
);
void
remap_generic
(
const
Mat
&
,
Mat
&
);
...
@@ -661,7 +661,7 @@ void CV_Remap_Test::generate_test_data()
...
@@ -661,7 +661,7 @@ void CV_Remap_Test::generate_test_data()
const
int
n
=
std
::
min
(
std
::
min
(
src
.
cols
,
src
.
rows
)
/
10
+
1
,
2
);
const
int
n
=
std
::
min
(
std
::
min
(
src
.
cols
,
src
.
rows
)
/
10
+
1
,
2
);
float
_n
=
0
;
//static_cast<float>(-n);
float
_n
=
0
;
//static_cast<float>(-n);
switch
(
mapx
.
type
())
switch
(
mapx
.
type
())
{
{
case
CV_16SC2
:
case
CV_16SC2
:
...
@@ -669,8 +669,8 @@ void CV_Remap_Test::generate_test_data()
...
@@ -669,8 +669,8 @@ void CV_Remap_Test::generate_test_data()
MatIterator_
<
Vec2s
>
begin_x
=
mapx
.
begin
<
Vec2s
>
(),
end_x
=
mapx
.
end
<
Vec2s
>
();
MatIterator_
<
Vec2s
>
begin_x
=
mapx
.
begin
<
Vec2s
>
(),
end_x
=
mapx
.
end
<
Vec2s
>
();
for
(
;
begin_x
!=
end_x
;
++
begin_x
)
for
(
;
begin_x
!=
end_x
;
++
begin_x
)
{
{
begin_x
[
0
]
=
rng
.
uniform
(
static_cast
<
int
>
(
_n
),
std
::
max
(
src
.
cols
+
n
-
1
,
0
));
begin_x
[
0
]
=
static_cast
<
short
>
(
rng
.
uniform
(
static_cast
<
int
>
(
_n
),
std
::
max
(
src
.
cols
+
n
-
1
,
0
)
));
begin_x
[
1
]
=
rng
.
uniform
(
static_cast
<
int
>
(
_n
),
std
::
max
(
src
.
rows
+
n
-
1
,
0
));
begin_x
[
1
]
=
static_cast
<
short
>
(
rng
.
uniform
(
static_cast
<
int
>
(
_n
),
std
::
max
(
src
.
rows
+
n
-
1
,
0
)
));
}
}
if
(
interpolation
!=
INTER_NEAREST
)
if
(
interpolation
!=
INTER_NEAREST
)
...
@@ -684,7 +684,7 @@ void CV_Remap_Test::generate_test_data()
...
@@ -684,7 +684,7 @@ void CV_Remap_Test::generate_test_data()
{
{
MatIterator_
<
ushort
>
begin_y
=
mapy
.
begin
<
ushort
>
(),
end_y
=
mapy
.
end
<
ushort
>
();
MatIterator_
<
ushort
>
begin_y
=
mapy
.
begin
<
ushort
>
(),
end_y
=
mapy
.
end
<
ushort
>
();
for
(
;
begin_y
!=
end_y
;
++
begin_y
)
for
(
;
begin_y
!=
end_y
;
++
begin_y
)
begin_y
[
0
]
=
rng
.
uniform
(
0
,
1024
);
begin_y
[
0
]
=
static_cast
<
short
>
(
rng
.
uniform
(
0
,
1024
)
);
}
}
break
;
break
;
...
@@ -692,7 +692,7 @@ void CV_Remap_Test::generate_test_data()
...
@@ -692,7 +692,7 @@ void CV_Remap_Test::generate_test_data()
{
{
MatIterator_
<
short
>
begin_y
=
mapy
.
begin
<
short
>
(),
end_y
=
mapy
.
end
<
short
>
();
MatIterator_
<
short
>
begin_y
=
mapy
.
begin
<
short
>
(),
end_y
=
mapy
.
end
<
short
>
();
for
(
;
begin_y
!=
end_y
;
++
begin_y
)
for
(
;
begin_y
!=
end_y
;
++
begin_y
)
begin_y
[
0
]
=
rng
.
uniform
(
0
,
1024
);
begin_y
[
0
]
=
static_cast
<
short
>
(
rng
.
uniform
(
0
,
1024
)
);
}
}
break
;
break
;
}
}
...
@@ -727,7 +727,7 @@ void CV_Remap_Test::generate_test_data()
...
@@ -727,7 +727,7 @@ void CV_Remap_Test::generate_test_data()
}
}
}
}
break
;
break
;
default
:
default
:
assert
(
0
);
assert
(
0
);
break
;
break
;
...
@@ -746,10 +746,10 @@ void CV_Remap_Test::convert_maps()
...
@@ -746,10 +746,10 @@ void CV_Remap_Test::convert_maps()
else
if
(
interpolation
!=
INTER_NEAREST
)
else
if
(
interpolation
!=
INTER_NEAREST
)
if
(
mapy
.
type
()
!=
CV_16UC1
)
if
(
mapy
.
type
()
!=
CV_16UC1
)
mapy
.
clone
().
convertTo
(
mapy
,
CV_16UC1
);
mapy
.
clone
().
convertTo
(
mapy
,
CV_16UC1
);
if
(
interpolation
==
INTER_NEAREST
)
if
(
interpolation
==
INTER_NEAREST
)
mapy
=
Mat
();
mapy
=
Mat
();
CV_Assert
((
(
interpolation
==
INTER_NEAREST
&&
!
mapy
.
data
)
||
mapy
.
type
()
==
CV_16UC1
||
CV_Assert
(((
interpolation
==
INTER_NEAREST
&&
!
mapy
.
data
)
||
mapy
.
type
()
==
CV_16UC1
||
mapy
.
type
()
==
CV_16SC1
)
&&
mapx
.
type
()
==
CV_16SC2
);
mapy
.
type
()
==
CV_16SC1
)
&&
mapx
.
type
()
==
CV_16SC2
);
}
}
...
@@ -793,7 +793,7 @@ void CV_Remap_Test::run_reference_func()
...
@@ -793,7 +793,7 @@ void CV_Remap_Test::run_reference_func()
if
(
interpolation
==
INTER_AREA
)
if
(
interpolation
==
INTER_AREA
)
interpolation
=
INTER_LINEAR
;
interpolation
=
INTER_LINEAR
;
int
index
=
interpolation
==
INTER_NEAREST
?
0
:
1
;
int
index
=
interpolation
==
INTER_NEAREST
?
0
:
1
;
(
this
->*
funcs
[
index
])(
src
,
reference_dst
);
(
this
->*
funcs
[
index
])(
src
,
reference_dst
);
}
}
...
@@ -811,7 +811,7 @@ void CV_Remap_Test::remap_nearest(const Mat& _src, Mat& _dst)
...
@@ -811,7 +811,7 @@ void CV_Remap_Test::remap_nearest(const Mat& _src, Mat& _dst)
{
{
const
short
*
yM
=
mapx
.
ptr
<
short
>
(
dy
);
const
short
*
yM
=
mapx
.
ptr
<
short
>
(
dy
);
float
*
yD
=
_dst
.
ptr
<
float
>
(
dy
);
float
*
yD
=
_dst
.
ptr
<
float
>
(
dy
);
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
{
{
float
*
xyD
=
yD
+
cn
*
dx
;
float
*
xyD
=
yD
+
cn
*
dx
;
...
@@ -828,7 +828,7 @@ void CV_Remap_Test::remap_nearest(const Mat& _src, Mat& _dst)
...
@@ -828,7 +828,7 @@ void CV_Remap_Test::remap_nearest(const Mat& _src, Mat& _dst)
{
{
if
(
borderType
==
BORDER_CONSTANT
)
if
(
borderType
==
BORDER_CONSTANT
)
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
for
(
int
r
=
0
;
r
<
cn
;
++
r
)
xyD
[
r
]
=
borderValue
[
r
]
;
xyD
[
r
]
=
saturate_cast
<
float
>
(
borderValue
[
r
])
;
else
else
{
{
sx
=
borderInterpolate
(
sx
,
ssize
.
width
,
borderType
);
sx
=
borderInterpolate
(
sx
,
ssize
.
width
,
borderType
);
...
@@ -848,19 +848,16 @@ void CV_Remap_Test::remap_nearest(const Mat& _src, Mat& _dst)
...
@@ -848,19 +848,16 @@ void CV_Remap_Test::remap_nearest(const Mat& _src, Mat& _dst)
void
CV_Remap_Test
::
remap_generic
(
const
Mat
&
_src
,
Mat
&
_dst
)
void
CV_Remap_Test
::
remap_generic
(
const
Mat
&
_src
,
Mat
&
_dst
)
{
{
CV_Assert
(
mapx
.
type
()
==
CV_16SC2
&&
mapy
.
type
()
==
CV_16UC1
);
CV_Assert
(
mapx
.
type
()
==
CV_16SC2
&&
mapy
.
type
()
==
CV_16UC1
);
int
ksize
;
int
ksize
=
2
;
if
(
interpolation
==
INTER_LINEAR
)
if
(
interpolation
==
INTER_CUBIC
)
ksize
=
2
;
else
if
(
interpolation
==
INTER_CUBIC
)
ksize
=
4
;
ksize
=
4
;
else
if
(
interpolation
==
INTER_LANCZOS4
)
else
if
(
interpolation
==
INTER_LANCZOS4
)
ksize
=
8
;
ksize
=
8
;
else
else
if
(
interpolation
!=
INTER_LINEAR
)
ksize
=
0
;
assert
(
0
);
assert
(
ksize
);
int
ofs
=
(
ksize
/
2
)
-
1
;
int
ofs
=
(
ksize
/
2
)
-
1
;
CV_Assert
(
_src
.
depth
()
==
CV_32F
&&
_dst
.
type
()
==
_src
.
type
());
CV_Assert
(
_src
.
depth
()
==
CV_32F
&&
_dst
.
type
()
==
_src
.
type
());
Size
ssize
=
_src
.
size
(),
dsize
=
_dst
.
size
();
Size
ssize
=
_src
.
size
(),
dsize
=
_dst
.
size
();
int
cn
=
_src
.
channels
(),
width1
=
std
::
max
(
ssize
.
width
-
ksize
+
1
,
0
),
int
cn
=
_src
.
channels
(),
width1
=
std
::
max
(
ssize
.
width
-
ksize
+
1
,
0
),
...
@@ -875,7 +872,7 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
...
@@ -875,7 +872,7 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
const
ushort
*
yMy
=
mapy
.
ptr
<
ushort
>
(
dy
);
const
ushort
*
yMy
=
mapy
.
ptr
<
ushort
>
(
dy
);
float
*
yD
=
_dst
.
ptr
<
float
>
(
dy
);
float
*
yD
=
_dst
.
ptr
<
float
>
(
dy
);
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
)
{
{
float
*
xyD
=
yD
+
dx
*
cn
;
float
*
xyD
=
yD
+
dx
*
cn
;
...
@@ -884,7 +881,7 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
...
@@ -884,7 +881,7 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
inter_func
((
yMy
[
dx
]
&
(
INTER_TAB_SIZE
-
1
))
/
static_cast
<
float
>
(
INTER_TAB_SIZE
),
w
);
inter_func
((
yMy
[
dx
]
&
(
INTER_TAB_SIZE
-
1
))
/
static_cast
<
float
>
(
INTER_TAB_SIZE
),
w
);
inter_func
(((
yMy
[
dx
]
>>
INTER_BITS
)
&
(
INTER_TAB_SIZE
-
1
))
/
static_cast
<
float
>
(
INTER_TAB_SIZE
),
w
+
ksize
);
inter_func
(((
yMy
[
dx
]
>>
INTER_BITS
)
&
(
INTER_TAB_SIZE
-
1
))
/
static_cast
<
float
>
(
INTER_TAB_SIZE
),
w
+
ksize
);
isx
-=
ofs
;
isx
-=
ofs
;
isy
-=
ofs
;
isy
-=
ofs
;
...
@@ -908,7 +905,7 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
...
@@ -908,7 +905,7 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
else
if
(
borderType
!=
BORDER_TRANSPARENT
)
else
if
(
borderType
!=
BORDER_TRANSPARENT
)
{
{
int
ar_x
[
8
],
ar_y
[
8
];
int
ar_x
[
8
],
ar_y
[
8
];
for
(
int
k
=
0
;
k
<
ksize
;
k
++
)
for
(
int
k
=
0
;
k
<
ksize
;
k
++
)
{
{
ar_x
[
k
]
=
borderInterpolate
(
isx
+
k
,
ssize
.
width
,
borderType
)
*
cn
;
ar_x
[
k
]
=
borderInterpolate
(
isx
+
k
,
ssize
.
width
,
borderType
)
*
cn
;
...
@@ -925,14 +922,14 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
...
@@ -925,14 +922,14 @@ void CV_Remap_Test::remap_generic(const Mat& _src, Mat& _dst)
{
{
const
float
*
yS
=
_src
.
ptr
<
float
>
(
ar_y
[
i
]);
const
float
*
yS
=
_src
.
ptr
<
float
>
(
ar_y
[
i
]);
for
(
int
j
=
0
;
j
<
ksize
;
++
j
)
for
(
int
j
=
0
;
j
<
ksize
;
++
j
)
ix
[
i
]
+=
(
ar_x
[
j
]
>=
0
?
yS
[
ar_x
[
j
]
+
r
]
:
borderValue
[
r
])
*
w
[
j
]
;
ix
[
i
]
+=
saturate_cast
<
float
>
((
ar_x
[
j
]
>=
0
?
yS
[
ar_x
[
j
]
+
r
]
:
borderValue
[
r
])
*
w
[
j
])
;
}
}
else
else
for
(
int
j
=
0
;
j
<
ksize
;
++
j
)
for
(
int
j
=
0
;
j
<
ksize
;
++
j
)
ix
[
i
]
+=
borderValue
[
r
]
*
w
[
j
]
;
ix
[
i
]
+=
saturate_cast
<
float
>
(
borderValue
[
r
]
*
w
[
j
])
;
}
}
for
(
int
i
=
0
;
i
<
ksize
;
++
i
)
for
(
int
i
=
0
;
i
<
ksize
;
++
i
)
xyD
[
r
]
+=
w
[
ksize
+
i
]
*
ix
[
i
]
;
xyD
[
r
]
+=
saturate_cast
<
float
>
(
w
[
ksize
+
i
]
*
ix
[
i
])
;
}
}
}
}
}
}
...
@@ -1002,7 +999,7 @@ void CV_WarpAffine_Test::generate_test_data()
...
@@ -1002,7 +999,7 @@ void CV_WarpAffine_Test::generate_test_data()
M
.
convertTo
(
tmp
,
depth
);
M
.
convertTo
(
tmp
,
depth
);
M
=
tmp
;
M
=
tmp
;
}
}
// warp_matrix is inverse
// warp_matrix is inverse
if
(
rng
.
uniform
(
0.
,
1.
)
>
0
)
if
(
rng
.
uniform
(
0.
,
1.
)
>
0
)
interpolation
|=
CV_WARP_INVERSE_MAP
;
interpolation
|=
CV_WARP_INVERSE_MAP
;
...
@@ -1035,7 +1032,7 @@ void CV_WarpAffine_Test::warpAffine(const Mat& _src, Mat& _dst)
...
@@ -1035,7 +1032,7 @@ void CV_WarpAffine_Test::warpAffine(const Mat& _src, Mat& _dst)
Mat
tM
;
Mat
tM
;
M
.
convertTo
(
tM
,
CV_64F
);
M
.
convertTo
(
tM
,
CV_64F
);
int
inter
=
interpolation
&
INTER_MAX
;
int
inter
=
interpolation
&
INTER_MAX
;
if
(
inter
==
INTER_AREA
)
if
(
inter
==
INTER_AREA
)
inter
=
INTER_LINEAR
;
inter
=
INTER_LINEAR
;
...
@@ -1045,35 +1042,35 @@ void CV_WarpAffine_Test::warpAffine(const Mat& _src, Mat& _dst)
...
@@ -1045,35 +1042,35 @@ void CV_WarpAffine_Test::warpAffine(const Mat& _src, Mat& _dst)
mapy
.
create
(
dsize
,
CV_16SC1
);
mapy
.
create
(
dsize
,
CV_16SC1
);
else
else
mapy
=
Mat
();
mapy
=
Mat
();
if
(
!
(
interpolation
&
CV_WARP_INVERSE_MAP
))
if
(
!
(
interpolation
&
CV_WARP_INVERSE_MAP
))
invertAffineTransform
(
tM
.
clone
(),
tM
);
invertAffineTransform
(
tM
.
clone
(),
tM
);
const
int
AB_BITS
=
MAX
(
10
,
(
int
)
INTER_BITS
);
const
int
AB_BITS
=
MAX
(
10
,
(
int
)
INTER_BITS
);
const
int
AB_SCALE
=
1
<<
AB_BITS
;
const
int
AB_SCALE
=
1
<<
AB_BITS
;
int
round_delta
=
(
inter
==
INTER_NEAREST
)
?
AB_SCALE
/
2
:
(
AB_SCALE
/
INTER_TAB_SIZE
/
2
);
int
round_delta
=
(
inter
==
INTER_NEAREST
)
?
AB_SCALE
/
2
:
(
AB_SCALE
/
INTER_TAB_SIZE
/
2
);
const
double
*
data_tM
=
tM
.
ptr
<
double
>
(
0
);
const
double
*
data_tM
=
tM
.
ptr
<
double
>
(
0
);
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
{
{
short
*
yM
=
mapx
.
ptr
<
short
>
(
dy
);
short
*
yM
=
mapx
.
ptr
<
short
>
(
dy
);
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
,
yM
+=
2
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
,
yM
+=
2
)
{
{
int
v1
=
saturate_cast
<
int
>
(
saturate_cast
<
int
>
(
data_tM
[
0
]
*
dx
*
AB_SCALE
)
+
int
v1
=
saturate_cast
<
int
>
(
saturate_cast
<
int
>
(
data_tM
[
0
]
*
dx
*
AB_SCALE
)
+
saturate_cast
<
int
>
((
data_tM
[
1
]
*
dy
+
data_tM
[
2
])
*
AB_SCALE
)
+
round_delta
),
saturate_cast
<
int
>
((
data_tM
[
1
]
*
dy
+
data_tM
[
2
])
*
AB_SCALE
)
+
round_delta
),
v2
=
saturate_cast
<
int
>
(
saturate_cast
<
int
>
(
data_tM
[
3
]
*
dx
*
AB_SCALE
)
+
v2
=
saturate_cast
<
int
>
(
saturate_cast
<
int
>
(
data_tM
[
3
]
*
dx
*
AB_SCALE
)
+
saturate_cast
<
int
>
((
data_tM
[
4
]
*
dy
+
data_tM
[
5
])
*
AB_SCALE
)
+
round_delta
);
saturate_cast
<
int
>
((
data_tM
[
4
]
*
dy
+
data_tM
[
5
])
*
AB_SCALE
)
+
round_delta
);
v1
>>=
AB_BITS
-
INTER_BITS
;
v1
>>=
AB_BITS
-
INTER_BITS
;
v2
>>=
AB_BITS
-
INTER_BITS
;
v2
>>=
AB_BITS
-
INTER_BITS
;
yM
[
0
]
=
saturate_cast
<
short
>
(
v1
>>
INTER_BITS
);
yM
[
0
]
=
saturate_cast
<
short
>
(
v1
>>
INTER_BITS
);
yM
[
1
]
=
saturate_cast
<
short
>
(
v2
>>
INTER_BITS
);
yM
[
1
]
=
saturate_cast
<
short
>
(
v2
>>
INTER_BITS
);
if
(
inter
!=
INTER_NEAREST
)
if
(
inter
!=
INTER_NEAREST
)
mapy
.
ptr
<
short
>
(
dy
)[
dx
]
=
((
v2
&
(
INTER_TAB_SIZE
-
1
))
*
INTER_TAB_SIZE
+
(
v1
&
(
INTER_TAB_SIZE
-
1
)));
mapy
.
ptr
<
short
>
(
dy
)[
dx
]
=
((
v2
&
(
INTER_TAB_SIZE
-
1
))
*
INTER_TAB_SIZE
+
(
v1
&
(
INTER_TAB_SIZE
-
1
)));
}
}
}
}
CV_Assert
(
mapx
.
type
()
==
CV_16SC2
&&
((
inter
==
INTER_NEAREST
&&
!
mapy
.
data
)
||
mapy
.
type
()
==
CV_16SC1
));
CV_Assert
(
mapx
.
type
()
==
CV_16SC2
&&
((
inter
==
INTER_NEAREST
&&
!
mapy
.
data
)
||
mapy
.
type
()
==
CV_16SC1
));
cv
::
remap
(
_src
,
_dst
,
mapx
,
mapy
,
inter
,
borderType
,
borderValue
);
cv
::
remap
(
_src
,
_dst
,
mapx
,
mapy
,
inter
,
borderType
,
borderValue
);
}
}
...
@@ -1099,7 +1096,7 @@ protected:
...
@@ -1099,7 +1096,7 @@ protected:
private
:
private
:
void
warpPerspective
(
const
Mat
&
,
Mat
&
);
void
warpPerspective
(
const
Mat
&
,
Mat
&
);
};
};
CV_WarpPerspective_Test
::
CV_WarpPerspective_Test
()
:
CV_WarpPerspective_Test
::
CV_WarpPerspective_Test
()
:
CV_WarpAffine_Test
()
CV_WarpAffine_Test
()
{
{
...
@@ -1116,11 +1113,12 @@ void CV_WarpPerspective_Test::generate_test_data()
...
@@ -1116,11 +1113,12 @@ void CV_WarpPerspective_Test::generate_test_data()
// generating the M 3x3 matrix
// generating the M 3x3 matrix
RNG
&
rng
=
ts
->
get_rng
();
RNG
&
rng
=
ts
->
get_rng
();
Point2f
sp
[]
=
{
Point2f
(
0
,
0
),
Point2f
(
src
.
cols
,
0
),
Point2f
(
0
,
src
.
rows
),
Point2f
(
src
.
cols
,
src
.
rows
)
};
float
cols
=
static_cast
<
float
>
(
src
.
cols
),
rows
=
static_cast
<
float
>
(
src
.
rows
);
Point2f
dp
[]
=
{
Point2f
(
rng
.
uniform
(
0
,
src
.
cols
),
rng
.
uniform
(
0
,
src
.
rows
)),
Point2f
sp
[]
=
{
Point2f
(
0.0
f
,
0.0
f
),
Point2f
(
cols
,
0.0
f
),
Point2f
(
0.0
f
,
rows
),
Point2f
(
cols
,
rows
)
};
Point2f
(
rng
.
uniform
(
0
,
src
.
cols
),
rng
.
uniform
(
0
,
src
.
rows
)),
Point2f
dp
[]
=
{
Point2f
(
rng
.
uniform
(
0.0
f
,
cols
),
rng
.
uniform
(
0.0
f
,
rows
)),
Point2f
(
rng
.
uniform
(
0
,
src
.
cols
),
rng
.
uniform
(
0
,
src
.
rows
)),
Point2f
(
rng
.
uniform
(
0.0
f
,
cols
),
rng
.
uniform
(
0.0
f
,
rows
)),
Point2f
(
rng
.
uniform
(
0
,
src
.
cols
),
rng
.
uniform
(
0
,
src
.
rows
))
};
Point2f
(
rng
.
uniform
(
0.0
f
,
cols
),
rng
.
uniform
(
0.0
f
,
rows
)),
Point2f
(
rng
.
uniform
(
0.0
f
,
cols
),
rng
.
uniform
(
0.0
f
,
rows
))
};
M
=
getPerspectiveTransform
(
sp
,
dp
);
M
=
getPerspectiveTransform
(
sp
,
dp
);
static
const
int
depths
[]
=
{
CV_32F
,
CV_64F
};
static
const
int
depths
[]
=
{
CV_32F
,
CV_64F
};
...
@@ -1148,24 +1146,24 @@ void CV_WarpPerspective_Test::warpPerspective(const Mat& _src, Mat& _dst)
...
@@ -1148,24 +1146,24 @@ void CV_WarpPerspective_Test::warpPerspective(const Mat& _src, Mat& _dst)
CV_Assert
(
dsize
.
area
()
>
0
);
CV_Assert
(
dsize
.
area
()
>
0
);
CV_Assert
(
_src
.
type
()
==
_dst
.
type
());
CV_Assert
(
_src
.
type
()
==
_dst
.
type
());
if
(
M
.
depth
()
!=
CV_64F
)
if
(
M
.
depth
()
!=
CV_64F
)
{
{
Mat
tmp
;
Mat
tmp
;
M
.
convertTo
(
tmp
,
CV_64F
);
M
.
convertTo
(
tmp
,
CV_64F
);
M
=
tmp
;
M
=
tmp
;
}
}
if
(
!
(
interpolation
&
CV_WARP_INVERSE_MAP
))
if
(
!
(
interpolation
&
CV_WARP_INVERSE_MAP
))
{
{
Mat
tmp
;
Mat
tmp
;
invert
(
M
,
tmp
);
invert
(
M
,
tmp
);
M
=
tmp
;
M
=
tmp
;
}
}
int
inter
=
interpolation
&
INTER_MAX
;
int
inter
=
interpolation
&
INTER_MAX
;
if
(
inter
==
INTER_AREA
)
if
(
inter
==
INTER_AREA
)
inter
=
INTER_LINEAR
;
inter
=
INTER_LINEAR
;
mapx
.
create
(
dsize
,
CV_16SC2
);
mapx
.
create
(
dsize
,
CV_16SC2
);
if
(
inter
!=
INTER_NEAREST
)
if
(
inter
!=
INTER_NEAREST
)
mapy
.
create
(
dsize
,
CV_16SC1
);
mapy
.
create
(
dsize
,
CV_16SC1
);
...
@@ -1176,30 +1174,30 @@ void CV_WarpPerspective_Test::warpPerspective(const Mat& _src, Mat& _dst)
...
@@ -1176,30 +1174,30 @@ void CV_WarpPerspective_Test::warpPerspective(const Mat& _src, Mat& _dst)
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
for
(
int
dy
=
0
;
dy
<
dsize
.
height
;
++
dy
)
{
{
short
*
yMx
=
mapx
.
ptr
<
short
>
(
dy
);
short
*
yMx
=
mapx
.
ptr
<
short
>
(
dy
);
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
,
yMx
+=
2
)
for
(
int
dx
=
0
;
dx
<
dsize
.
width
;
++
dx
,
yMx
+=
2
)
{
{
double
den
=
tM
[
6
]
*
dx
+
tM
[
7
]
*
dy
+
tM
[
8
];
double
den
=
tM
[
6
]
*
dx
+
tM
[
7
]
*
dy
+
tM
[
8
];
den
=
den
?
1.0
/
den
:
0.0
;
den
=
den
?
1.0
/
den
:
0.0
;
if
(
inter
==
INTER_NEAREST
)
if
(
inter
==
INTER_NEAREST
)
{
{
yMx
[
0
]
=
saturate_cast
<
short
>
((
tM
[
0
]
*
dx
+
tM
[
1
]
*
dy
+
tM
[
2
])
*
den
);
yMx
[
0
]
=
saturate_cast
<
short
>
((
tM
[
0
]
*
dx
+
tM
[
1
]
*
dy
+
tM
[
2
])
*
den
);
yMx
[
1
]
=
saturate_cast
<
short
>
((
tM
[
3
]
*
dx
+
tM
[
4
]
*
dy
+
tM
[
5
])
*
den
);
yMx
[
1
]
=
saturate_cast
<
short
>
((
tM
[
3
]
*
dx
+
tM
[
4
]
*
dy
+
tM
[
5
])
*
den
);
continue
;
continue
;
}
}
den
*=
INTER_TAB_SIZE
;
den
*=
INTER_TAB_SIZE
;
int
v0
=
saturate_cast
<
int
>
((
tM
[
0
]
*
dx
+
tM
[
1
]
*
dy
+
tM
[
2
])
*
den
);
int
v0
=
saturate_cast
<
int
>
((
tM
[
0
]
*
dx
+
tM
[
1
]
*
dy
+
tM
[
2
])
*
den
);
int
v1
=
saturate_cast
<
int
>
((
tM
[
3
]
*
dx
+
tM
[
4
]
*
dy
+
tM
[
5
])
*
den
);
int
v1
=
saturate_cast
<
int
>
((
tM
[
3
]
*
dx
+
tM
[
4
]
*
dy
+
tM
[
5
])
*
den
);
yMx
[
0
]
=
saturate_cast
<
short
>
(
v0
>>
INTER_BITS
);
yMx
[
0
]
=
saturate_cast
<
short
>
(
v0
>>
INTER_BITS
);
yMx
[
1
]
=
saturate_cast
<
short
>
(
v1
>>
INTER_BITS
);
yMx
[
1
]
=
saturate_cast
<
short
>
(
v1
>>
INTER_BITS
);
mapy
.
ptr
<
short
>
(
dy
)[
dx
]
=
saturate_cast
<
short
>
((
v1
&
(
INTER_TAB_SIZE
-
1
))
*
mapy
.
ptr
<
short
>
(
dy
)[
dx
]
=
saturate_cast
<
short
>
((
v1
&
(
INTER_TAB_SIZE
-
1
))
*
INTER_TAB_SIZE
+
(
v0
&
(
INTER_TAB_SIZE
-
1
)));
INTER_TAB_SIZE
+
(
v0
&
(
INTER_TAB_SIZE
-
1
)));
}
}
}
}
CV_Assert
(
mapx
.
type
()
==
CV_16SC2
&&
((
inter
==
INTER_NEAREST
&&
!
mapy
.
data
)
||
mapy
.
type
()
==
CV_16SC1
));
CV_Assert
(
mapx
.
type
()
==
CV_16SC2
&&
((
inter
==
INTER_NEAREST
&&
!
mapy
.
data
)
||
mapy
.
type
()
==
CV_16SC1
));
cv
::
remap
(
_src
,
_dst
,
mapx
,
mapy
,
inter
,
borderType
,
borderValue
);
cv
::
remap
(
_src
,
_dst
,
mapx
,
mapy
,
inter
,
borderType
,
borderValue
);
}
}
...
...
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