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
473dba11
Commit
473dba11
authored
Sep 13, 2016
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #7208 from terfendail:openvx_hal_impl
parents
ca9183d5
311a232a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
883 additions
and
10 deletions
+883
-10
openvx_hal.hpp
3rdparty/openvx/include/openvx_hal.hpp
+882
-9
hal_replacement.hpp
modules/imgproc/src/hal_replacement.hpp
+1
-1
No files found.
3rdparty/openvx/include/openvx_hal.hpp
View file @
473dba11
...
@@ -7,6 +7,10 @@
...
@@ -7,6 +7,10 @@
#include "VX/vxu.h"
#include "VX/vxu.h"
#include <string>
#include <string>
#include <vector>
#include <algorithm>
#include <opencv2/core/saturate.hpp>
//==================================================================================================
//==================================================================================================
// utility
// utility
...
@@ -52,7 +56,8 @@ template <typename T>
...
@@ -52,7 +56,8 @@ template <typename T>
struct
VX_Traits
struct
VX_Traits
{
{
enum
{
enum
{
Type
=
0
ImgType
=
0
,
DataType
=
0
};
};
};
};
...
@@ -60,7 +65,8 @@ template <>
...
@@ -60,7 +65,8 @@ template <>
struct
VX_Traits
<
uchar
>
struct
VX_Traits
<
uchar
>
{
{
enum
{
enum
{
Type
=
VX_DF_IMAGE_U8
ImgType
=
VX_DF_IMAGE_U8
,
DataType
=
VX_TYPE_UINT8
};
};
};
};
...
@@ -68,7 +74,8 @@ template <>
...
@@ -68,7 +74,8 @@ template <>
struct
VX_Traits
<
ushort
>
struct
VX_Traits
<
ushort
>
{
{
enum
{
enum
{
Type
=
VX_DF_IMAGE_U16
ImgType
=
VX_DF_IMAGE_U16
,
DataType
=
VX_TYPE_UINT16
};
};
};
};
...
@@ -76,7 +83,17 @@ template <>
...
@@ -76,7 +83,17 @@ template <>
struct
VX_Traits
<
short
>
struct
VX_Traits
<
short
>
{
{
enum
{
enum
{
Type
=
VX_DF_IMAGE_S16
ImgType
=
VX_DF_IMAGE_S16
,
DataType
=
VX_TYPE_INT16
};
};
template
<>
struct
VX_Traits
<
float
>
{
enum
{
ImgType
=
0
,
DataType
=
VX_TYPE_FLOAT32
};
};
};
};
...
@@ -108,6 +125,14 @@ struct vxErr
...
@@ -108,6 +125,14 @@ struct vxErr
{
{
vxErr
(
vxGetStatus
((
vx_reference
)
img
),
"image check"
).
check
();
vxErr
(
vxGetStatus
((
vx_reference
)
img
),
"image check"
).
check
();
}
}
static
void
check
(
vx_matrix
mtx
)
{
vxErr
(
vxGetStatus
((
vx_reference
)
mtx
),
"matrix check"
).
check
();
}
static
void
check
(
vx_convolution
cnv
)
{
vxErr
(
vxGetStatus
((
vx_reference
)
cnv
),
"convolution check"
).
check
();
}
static
void
check
(
vx_status
s
)
static
void
check
(
vx_status
s
)
{
{
vxErr
(
s
,
"status check"
).
check
();
vxErr
(
s
,
"status check"
).
check
();
...
@@ -145,28 +170,176 @@ struct vxImage
...
@@ -145,28 +170,176 @@ struct vxImage
addr
.
dim_x
=
w
;
addr
.
dim_x
=
w
;
addr
.
dim_y
=
h
;
addr
.
dim_y
=
h
;
addr
.
stride_x
=
sizeof
(
T
);
addr
.
stride_x
=
sizeof
(
T
);
addr
.
stride_y
=
step
;
addr
.
stride_y
=
(
vx_int32
)
step
;
addr
.
scale_x
=
VX_SCALE_UNITY
;
addr
.
scale_x
=
VX_SCALE_UNITY
;
addr
.
scale_y
=
VX_SCALE_UNITY
;
addr
.
scale_y
=
VX_SCALE_UNITY
;
addr
.
step_x
=
1
;
addr
.
step_x
=
1
;
addr
.
step_y
=
1
;
addr
.
step_y
=
1
;
void
*
ptrs
[]
=
{
(
void
*
)
data
};
void
*
ptrs
[]
=
{
(
void
*
)
data
};
img
=
vxCreateImageFromHandle
(
ctx
.
ctx
,
VX_Traits
<
T
>::
Type
,
&
addr
,
ptrs
,
VX_MEMORY_TYPE_HOST
);
img
=
vxCreateImageFromHandle
(
ctx
.
ctx
,
VX_Traits
<
T
>::
ImgType
,
&
addr
,
ptrs
,
VX_MEMORY_TYPE_HOST
);
vxErr
::
check
(
img
);
}
vxImage
(
vxContext
&
ctx
,
int
imgType
,
const
uchar
*
data
,
size_t
step
,
int
w
,
int
h
)
{
if
(
h
==
1
)
step
=
w
;
vx_imagepatch_addressing_t
addr
[
4
];
void
*
ptrs
[
4
];
switch
(
imgType
)
{
case
VX_DF_IMAGE_U8
:
case
VX_DF_IMAGE_U16
:
case
VX_DF_IMAGE_S16
:
case
VX_DF_IMAGE_U32
:
case
VX_DF_IMAGE_S32
:
case
VX_DF_IMAGE_RGB
:
case
VX_DF_IMAGE_RGBX
:
case
VX_DF_IMAGE_UYVY
:
case
VX_DF_IMAGE_YUYV
:
addr
[
0
].
dim_x
=
w
;
addr
[
0
].
dim_y
=
h
;
addr
[
0
].
stride_x
=
imgType
==
VX_DF_IMAGE_U8
?
1
:
imgType
==
VX_DF_IMAGE_RGB
?
3
:
(
imgType
==
VX_DF_IMAGE_U16
||
imgType
==
VX_DF_IMAGE_S16
)
?
2
:
4
;
addr
[
0
].
stride_y
=
(
vx_int32
)
step
;
addr
[
0
].
scale_x
=
VX_SCALE_UNITY
;
addr
[
0
].
scale_y
=
VX_SCALE_UNITY
;
addr
[
0
].
step_x
=
(
imgType
==
VX_DF_IMAGE_UYVY
||
imgType
==
VX_DF_IMAGE_YUYV
)
?
2
:
1
;
addr
[
0
].
step_y
=
1
;
ptrs
[
0
]
=
(
void
*
)
data
;
break
;
case
VX_DF_IMAGE_NV12
:
case
VX_DF_IMAGE_NV21
:
addr
[
0
].
dim_x
=
w
;
addr
[
0
].
dim_y
=
h
;
addr
[
0
].
stride_x
=
1
;
addr
[
0
].
stride_y
=
(
vx_int32
)
step
;
addr
[
0
].
scale_x
=
VX_SCALE_UNITY
;
addr
[
0
].
scale_y
=
VX_SCALE_UNITY
;
addr
[
0
].
step_x
=
1
;
addr
[
0
].
step_y
=
1
;
ptrs
[
0
]
=
(
void
*
)
data
;
addr
[
1
].
dim_x
=
(
w
+
1
)
/
2
;
addr
[
1
].
dim_y
=
(
h
+
1
)
/
2
;
addr
[
1
].
stride_x
=
2
;
addr
[
1
].
stride_y
=
(
vx_int32
)
step
;
addr
[
1
].
scale_x
=
VX_SCALE_UNITY
;
addr
[
1
].
scale_y
=
VX_SCALE_UNITY
;
addr
[
1
].
step_x
=
2
;
addr
[
1
].
step_y
=
2
;
ptrs
[
1
]
=
(
void
*
)(
data
+
h
*
step
);
break
;
case
VX_DF_IMAGE_IYUV
:
case
VX_DF_IMAGE_YUV4
:
addr
[
0
].
dim_x
=
w
;
addr
[
0
].
dim_y
=
h
;
addr
[
0
].
stride_x
=
1
;
addr
[
0
].
stride_y
=
(
vx_int32
)
step
;
addr
[
0
].
scale_x
=
VX_SCALE_UNITY
;
addr
[
0
].
scale_y
=
VX_SCALE_UNITY
;
addr
[
0
].
step_x
=
1
;
addr
[
0
].
step_y
=
1
;
ptrs
[
0
]
=
(
void
*
)
data
;
addr
[
1
].
dim_x
=
imgType
==
VX_DF_IMAGE_YUV4
?
w
:
(
w
+
1
)
/
2
;
addr
[
1
].
dim_y
=
imgType
==
VX_DF_IMAGE_YUV4
?
h
:
(
h
+
1
)
/
2
;
addr
[
1
].
stride_x
=
1
;
addr
[
1
].
stride_y
=
(
vx_int32
)
step
;
addr
[
1
].
scale_x
=
VX_SCALE_UNITY
;
addr
[
1
].
scale_y
=
VX_SCALE_UNITY
;
addr
[
1
].
step_x
=
imgType
==
VX_DF_IMAGE_YUV4
?
1
:
2
;
addr
[
1
].
step_y
=
imgType
==
VX_DF_IMAGE_YUV4
?
1
:
2
;
ptrs
[
1
]
=
(
void
*
)(
data
+
h
*
step
);
addr
[
2
].
dim_x
=
addr
[
1
].
dim_x
;
addr
[
2
].
dim_y
=
addr
[
1
].
dim_y
;
addr
[
2
].
stride_x
=
1
;
addr
[
2
].
stride_y
=
(
vx_int32
)
step
;
addr
[
2
].
scale_x
=
VX_SCALE_UNITY
;
addr
[
2
].
scale_y
=
VX_SCALE_UNITY
;
addr
[
2
].
step_x
=
addr
[
1
].
step_x
;
addr
[
2
].
step_y
=
addr
[
1
].
step_y
;
ptrs
[
2
]
=
(
void
*
)(
data
+
(
h
+
addr
[
1
].
dim_y
)
*
step
);
break
;
default
:
vxErr
(
VX_ERROR_INVALID_PARAMETERS
,
"Bad image format"
).
check
();
}
img
=
vxCreateImageFromHandle
(
ctx
.
ctx
,
imgType
,
addr
,
ptrs
,
VX_MEMORY_TYPE_HOST
);
vxErr
::
check
(
img
);
vxErr
::
check
(
img
);
}
}
~
vxImage
()
~
vxImage
()
{
{
vx
SwapImageHandle
(
img
,
NULL
,
NULL
,
1
);
vx
Err
::
check
(
vxSwapImageHandle
(
img
,
NULL
,
NULL
,
1
)
);
vxReleaseImage
(
&
img
);
vxReleaseImage
(
&
img
);
}
}
};
};
struct
vxMatrix
{
vx_matrix
mtx
;
template
<
typename
T
>
vxMatrix
(
vxContext
&
ctx
,
const
T
*
data
,
int
w
,
int
h
)
{
mtx
=
vxCreateMatrix
(
ctx
.
ctx
,
VX_Traits
<
T
>::
DataType
,
w
,
h
);
vxErr
::
check
(
mtx
);
vxErr
::
check
(
vxCopyMatrix
(
mtx
,
const_cast
<
T
*>
(
data
),
VX_WRITE_ONLY
,
VX_MEMORY_TYPE_HOST
));
}
~
vxMatrix
()
{
vxReleaseMatrix
(
&
mtx
);
}
};
struct
vxConvolution
{
vx_convolution
cnv
;
vxConvolution
(
vxContext
&
ctx
,
const
short
*
data
,
int
w
,
int
h
)
{
cnv
=
vxCreateConvolution
(
ctx
.
ctx
,
w
,
h
);
vxErr
::
check
(
cnv
);
vxErr
::
check
(
vxCopyConvolutionCoefficients
(
cnv
,
const_cast
<
short
*>
(
data
),
VX_WRITE_ONLY
,
VX_MEMORY_TYPE_HOST
));
}
~
vxConvolution
()
{
vxReleaseConvolution
(
&
cnv
);
}
};
//==================================================================================================
//==================================================================================================
// real code starts here
// real code starts here
// ...
// ...
#define OVX_BINARY_OP(hal_func, ovx_call) \
template <typename T> \
inline int ovx_hal_##hal_func(const T *a, size_t astep, const T *b, size_t bstep, T *c, size_t cstep, int w, int h) \
{ \
try \
{ \
vxContext * ctx = vxContext::getContext(); \
vxImage ia(*ctx, a, astep, w, h); \
vxImage ib(*ctx, b, bstep, w, h); \
vxImage ic(*ctx, c, cstep, w, h); \
ovx_call \
} \
catch (vxErr & e) \
{ \
e.print(); \
return CV_HAL_ERROR_UNKNOWN; \
} \
return CV_HAL_ERROR_OK; \
}
OVX_BINARY_OP
(
add
,
{
vxErr
::
check
(
vxuAdd
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
VX_CONVERT_POLICY_SATURATE
,
ic
.
img
));})
OVX_BINARY_OP
(
sub
,
{
vxErr
::
check
(
vxuSubtract
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
VX_CONVERT_POLICY_SATURATE
,
ic
.
img
));})
OVX_BINARY_OP
(
absdiff
,
{
vxErr
::
check
(
vxuAbsDiff
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
ic
.
img
));})
OVX_BINARY_OP
(
and
,
{
vxErr
::
check
(
vxuAnd
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
ic
.
img
));})
OVX_BINARY_OP
(
or
,
{
vxErr
::
check
(
vxuOr
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
ic
.
img
));})
OVX_BINARY_OP
(
xor
,
{
vxErr
::
check
(
vxuXor
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
ic
.
img
));})
template
<
typename
T
>
template
<
typename
T
>
inline
int
ovx_hal_
add
(
const
T
*
a
,
size_t
astep
,
const
T
*
b
,
size_t
bstep
,
T
*
c
,
size_t
cstep
,
int
w
,
int
h
)
inline
int
ovx_hal_
mul
(
const
T
*
a
,
size_t
astep
,
const
T
*
b
,
size_t
bstep
,
T
*
c
,
size_t
cstep
,
int
w
,
int
h
,
double
scale
)
{
{
try
try
{
{
...
@@ -174,7 +347,208 @@ inline int ovx_hal_add(const T *a, size_t astep, const T *b, size_t bstep, T *c,
...
@@ -174,7 +347,208 @@ inline int ovx_hal_add(const T *a, size_t astep, const T *b, size_t bstep, T *c,
vxImage
ia
(
*
ctx
,
a
,
astep
,
w
,
h
);
vxImage
ia
(
*
ctx
,
a
,
astep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
b
,
bstep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
b
,
bstep
,
w
,
h
);
vxImage
ic
(
*
ctx
,
c
,
cstep
,
w
,
h
);
vxImage
ic
(
*
ctx
,
c
,
cstep
,
w
,
h
);
vxErr
::
check
(
vxuAdd
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
VX_CONVERT_POLICY_SATURATE
,
ic
.
img
));
vxErr
::
check
(
vxuMultiply
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
(
float
)
scale
,
VX_CONVERT_POLICY_SATURATE
,
VX_ROUND_POLICY_TO_ZERO
,
ic
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_not
(
const
uchar
*
a
,
size_t
astep
,
uchar
*
c
,
size_t
cstep
,
int
w
,
int
h
)
{
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
a
,
astep
,
w
,
h
);
vxImage
ic
(
*
ctx
,
c
,
cstep
,
w
,
h
);
vxErr
::
check
(
vxuNot
(
ctx
->
ctx
,
ia
.
img
,
ic
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_merge8u
(
const
uchar
**
src_data
,
uchar
*
dst_data
,
int
len
,
int
cn
)
{
if
(
cn
!=
3
&&
cn
!=
4
)
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
src_data
[
0
],
len
,
len
,
1
);
vxImage
ib
(
*
ctx
,
src_data
[
1
],
len
,
len
,
1
);
vxImage
ic
(
*
ctx
,
src_data
[
2
],
len
,
len
,
1
);
vxImage
id
(
*
ctx
,
cn
==
4
?
VX_DF_IMAGE_RGBX
:
VX_DF_IMAGE_RGB
,
dst_data
,
len
,
len
,
1
);
vxErr
::
check
(
vxuChannelCombine
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
ic
.
img
,
cn
==
4
?
vxImage
(
*
ctx
,
src_data
[
3
],
len
,
len
,
1
).
img
:
NULL
,
id
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
#if defined OPENCV_IMGPROC_HAL_INTERFACE_H
#define CV_HAL_INTER_NEAREST 0
#define CV_HAL_INTER_LINEAR 1
#define CV_HAL_INTER_CUBIC 2
#define CV_HAL_INTER_AREA 3
#define CV_HAL_INTER_LANCZOS4 4
#define MORPH_ERODE 0
#define MORPH_DILATE 1
inline
int
ovx_hal_resize
(
int
atype
,
const
uchar
*
a
,
size_t
astep
,
int
aw
,
int
ah
,
uchar
*
b
,
size_t
bstep
,
int
bw
,
int
bh
,
double
inv_scale_x
,
double
inv_scale_y
,
int
interpolation
)
{
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
a
,
astep
,
aw
,
ah
);
vxImage
ib
(
*
ctx
,
b
,
bstep
,
bw
,
bh
);
if
(
!
((
atype
==
CV_8UC1
||
atype
==
CV_8SC1
)
&&
inv_scale_x
>
0
&&
inv_scale_y
>
0
&&
(
bw
-
0.5
)
/
inv_scale_x
-
0.5
<
aw
&&
(
bh
-
0.5
)
/
inv_scale_y
-
0.5
<
ah
&&
(
bw
+
0.5
)
/
inv_scale_x
+
0.5
>=
aw
&&
(
bh
+
0.5
)
/
inv_scale_y
+
0.5
>=
ah
&&
std
::
abs
(
bw
/
inv_scale_x
-
aw
)
<
0.1
&&
std
::
abs
(
bh
/
inv_scale_y
-
ah
)
<
0.1
))
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
int
mode
;
if
(
interpolation
==
CV_HAL_INTER_LINEAR
)
mode
=
VX_INTERPOLATION_BILINEAR
;
else
if
(
interpolation
==
CV_HAL_INTER_AREA
)
mode
=
VX_INTERPOLATION_AREA
;
else
if
(
interpolation
==
CV_HAL_INTER_NEAREST
)
mode
=
VX_INTERPOLATION_NEAREST_NEIGHBOR
;
else
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
vxErr
::
check
(
vxuScaleImage
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
,
mode
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_warpAffine
(
int
atype
,
const
uchar
*
a
,
size_t
astep
,
int
aw
,
int
ah
,
uchar
*
b
,
size_t
bstep
,
int
bw
,
int
bh
,
const
double
M
[
6
],
int
interpolation
,
int
borderType
,
const
double
borderValue
[
4
])
{
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
a
,
astep
,
aw
,
ah
);
vxImage
ib
(
*
ctx
,
b
,
bstep
,
bw
,
bh
);
if
(
!
(
atype
==
CV_8UC1
||
atype
==
CV_8SC1
))
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
vx_border_t
border
;
switch
(
borderType
)
{
case
CV_HAL_BORDER_CONSTANT
:
border
.
mode
=
VX_BORDER_CONSTANT
;
border
.
constant_value
.
U8
=
(
vx_uint8
)(
borderValue
[
0
]);
break
;
case
CV_HAL_BORDER_REPLICATE
:
border
.
mode
=
VX_BORDER_REPLICATE
;
break
;
default
:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
int
mode
;
if
(
interpolation
==
CV_HAL_INTER_LINEAR
)
mode
=
VX_INTERPOLATION_BILINEAR
;
else
if
(
interpolation
==
CV_HAL_INTER_AREA
)
mode
=
VX_INTERPOLATION_AREA
;
else
if
(
interpolation
==
CV_HAL_INTER_NEAREST
)
mode
=
VX_INTERPOLATION_NEAREST_NEIGHBOR
;
else
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
std
::
vector
<
float
>
data
;
data
.
reserve
(
6
);
for
(
int
j
=
0
;
j
<
3
;
++
j
)
for
(
int
i
=
0
;
i
<
2
;
++
i
)
data
.
push_back
((
float
)(
M
[
i
*
3
+
j
]));
vxMatrix
mtx
(
*
ctx
,
data
.
data
(),
2
,
3
);
//ATTENTION: VX_CONTEXT_IMMEDIATE_BORDER attribute change could lead to strange issues in multi-threaded environments
//since OpenVX standart says nothing about thread-safety for now
vx_border_t
prevBorder
;
vxErr
::
check
(
vxQueryContext
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
border
,
sizeof
(
border
)));
vxErr
::
check
(
vxuWarpAffine
(
ctx
->
ctx
,
ia
.
img
,
mtx
.
mtx
,
mode
,
ib
.
img
));
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_warpPerspectve
(
int
atype
,
const
uchar
*
a
,
size_t
astep
,
int
aw
,
int
ah
,
uchar
*
b
,
size_t
bstep
,
int
bw
,
int
bh
,
const
double
M
[
9
],
int
interpolation
,
int
borderType
,
const
double
borderValue
[
4
])
{
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
a
,
astep
,
aw
,
ah
);
vxImage
ib
(
*
ctx
,
b
,
bstep
,
bw
,
bh
);
if
(
!
(
atype
==
CV_8UC1
||
atype
==
CV_8SC1
))
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
vx_border_t
border
;
switch
(
borderType
)
{
case
CV_HAL_BORDER_CONSTANT
:
border
.
mode
=
VX_BORDER_CONSTANT
;
border
.
constant_value
.
U8
=
(
vx_uint8
)(
borderValue
[
0
]);
break
;
case
CV_HAL_BORDER_REPLICATE
:
border
.
mode
=
VX_BORDER_REPLICATE
;
break
;
default
:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
int
mode
;
if
(
interpolation
==
CV_HAL_INTER_LINEAR
)
mode
=
VX_INTERPOLATION_BILINEAR
;
else
if
(
interpolation
==
CV_HAL_INTER_AREA
)
mode
=
VX_INTERPOLATION_AREA
;
else
if
(
interpolation
==
CV_HAL_INTER_NEAREST
)
mode
=
VX_INTERPOLATION_NEAREST_NEIGHBOR
;
else
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
std
::
vector
<
float
>
data
;
data
.
reserve
(
9
);
for
(
int
j
=
0
;
j
<
3
;
++
j
)
for
(
int
i
=
0
;
i
<
3
;
++
i
)
data
.
push_back
((
float
)(
M
[
i
*
3
+
j
]));
vxMatrix
mtx
(
*
ctx
,
data
.
data
(),
3
,
3
);
//ATTENTION: VX_CONTEXT_IMMEDIATE_BORDER attribute change could lead to strange issues in multi-threaded environments
//since OpenVX standart says nothing about thread-safety for now
vx_border_t
prevBorder
;
vxErr
::
check
(
vxQueryContext
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
border
,
sizeof
(
border
)));
vxErr
::
check
(
vxuWarpPerspective
(
ctx
->
ctx
,
ia
.
img
,
mtx
.
mtx
,
mode
,
ib
.
img
));
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
}
}
catch
(
vxErr
&
e
)
catch
(
vxErr
&
e
)
{
{
...
@@ -184,6 +558,436 @@ inline int ovx_hal_add(const T *a, size_t astep, const T *b, size_t bstep, T *c,
...
@@ -184,6 +558,436 @@ inline int ovx_hal_add(const T *a, size_t astep, const T *b, size_t bstep, T *c,
return
CV_HAL_ERROR_OK
;
return
CV_HAL_ERROR_OK
;
}
}
struct
cvhalFilter2D
;
struct
FilterCtx
{
vxConvolution
cnv
;
vx_border_t
border
;
int
dst_type
;
FilterCtx
(
vxContext
&
ctx
,
const
short
*
data
,
int
w
,
int
h
,
int
_dst_type
,
vx_border_t
&
_border
)
:
cnv
(
ctx
,
data
,
w
,
h
),
dst_type
(
_dst_type
),
border
(
_border
)
{}
};
inline
int
ovx_hal_filterInit
(
cvhalFilter2D
**
filter_context
,
uchar
*
kernel_data
,
size_t
kernel_step
,
int
kernel_type
,
int
kernel_width
,
int
kernel_height
,
int
,
int
,
int
src_type
,
int
dst_type
,
int
borderType
,
double
delta
,
int
anchor_x
,
int
anchor_y
,
bool
allowSubmatrix
,
bool
allowInplace
)
{
if
(
!
filter_context
||
!
kernel_data
||
allowSubmatrix
||
allowInplace
||
delta
!=
0
||
src_type
!=
CV_8UC1
||
(
dst_type
!=
CV_8UC1
&&
dst_type
!=
CV_16SC1
)
||
kernel_width
%
2
==
0
||
kernel_height
%
2
==
0
||
anchor_x
!=
kernel_width
/
2
||
anchor_y
!=
kernel_height
/
2
)
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
vx_border_t
border
;
switch
(
borderType
)
{
case
CV_HAL_BORDER_CONSTANT
:
border
.
mode
=
VX_BORDER_CONSTANT
;
border
.
constant_value
.
U8
=
0
;
break
;
case
CV_HAL_BORDER_REPLICATE
:
border
.
mode
=
VX_BORDER_REPLICATE
;
break
;
default:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
vxContext
*
ctx
=
vxContext
::
getContext
();
std
::
vector
<
short
>
data
;
data
.
reserve
(
kernel_width
*
kernel_height
);
switch
(
kernel_type
)
{
case
CV_8UC1
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
uchar
*
row
=
(
uchar
*
)(
kernel_data
+
kernel_step
*
j
);
for
(
int
i
=
0
;
i
<
kernel_width
;
++
i
)
data
.
push_back
(
row
[
i
]);
}
break
;
case
CV_8SC1
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
schar
*
row
=
(
schar
*
)(
kernel_data
+
kernel_step
*
j
);
for
(
int
i
=
0
;
i
<
kernel_width
;
++
i
)
data
.
push_back
(
row
[
i
]);
}
break
;
case
CV_16SC1
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
short
*
row
=
(
short
*
)(
kernel_data
+
kernel_step
*
j
);
for
(
int
i
=
0
;
i
<
kernel_width
;
++
i
)
data
.
push_back
(
row
[
i
]);
}
default:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
FilterCtx
*
cnv
=
new
FilterCtx
(
*
ctx
,
data
.
data
(),
kernel_width
,
kernel_height
,
dst_type
,
border
);
if
(
!
cnv
)
return
CV_HAL_ERROR_UNKNOWN
;
*
filter_context
=
(
cvhalFilter2D
*
)(
cnv
);
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_filterFree
(
cvhalFilter2D
*
filter_context
)
{
if
(
filter_context
)
{
delete
(
FilterCtx
*
)
filter_context
;
return
CV_HAL_ERROR_OK
;
}
else
{
return
CV_HAL_ERROR_UNKNOWN
;
}
}
inline
int
ovx_hal_filter
(
cvhalFilter2D
*
filter_context
,
uchar
*
a
,
size_t
astep
,
uchar
*
b
,
size_t
bstep
,
int
w
,
int
h
,
int
,
int
,
int
,
int
)
{
try
{
FilterCtx
*
cnv
=
(
FilterCtx
*
)
filter_context
;
if
(
!
cnv
)
vxErr
(
VX_ERROR_INVALID_PARAMETERS
,
"Bad HAL context"
).
check
();
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
a
,
astep
,
w
,
h
);
//ATTENTION: VX_CONTEXT_IMMEDIATE_BORDER attribute change could lead to strange issues in multi-threaded environments
//since OpenVX standart says nothing about thread-safety for now
vx_border_t
prevBorder
;
vxErr
::
check
(
vxQueryContext
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
(
cnv
->
border
),
sizeof
(
cnv
->
border
)));
if
(
cnv
->
dst_type
==
CV_16SC1
)
{
vxImage
ib
(
*
ctx
,
(
short
*
)
b
,
bstep
,
w
,
h
);
vxErr
::
check
(
vxuConvolve
(
ctx
->
ctx
,
ia
.
img
,
cnv
->
cnv
.
cnv
,
ib
.
img
));
}
else
{
vxImage
ib
(
*
ctx
,
b
,
bstep
,
w
,
h
);
vxErr
::
check
(
vxuConvolve
(
ctx
->
ctx
,
ia
.
img
,
cnv
->
cnv
.
cnv
,
ib
.
img
));
}
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_sepFilterInit
(
cvhalFilter2D
**
filter_context
,
int
src_type
,
int
dst_type
,
int
kernel_type
,
uchar
*
kernelx_data
,
int
kernelx_length
,
uchar
*
kernely_data
,
int
kernely_length
,
int
anchor_x
,
int
anchor_y
,
double
delta
,
int
borderType
)
{
if
(
!
filter_context
||
!
kernelx_data
||
!
kernely_data
||
delta
!=
0
||
src_type
!=
CV_8UC1
||
(
dst_type
!=
CV_8UC1
&&
dst_type
!=
CV_16SC1
)
||
kernelx_length
%
2
==
0
||
kernely_length
%
2
==
0
||
anchor_x
!=
kernelx_length
/
2
||
anchor_y
!=
kernely_length
/
2
)
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
vx_border_t
border
;
switch
(
borderType
)
{
case
CV_HAL_BORDER_CONSTANT
:
border
.
mode
=
VX_BORDER_CONSTANT
;
border
.
constant_value
.
U8
=
0
;
break
;
case
CV_HAL_BORDER_REPLICATE
:
border
.
mode
=
VX_BORDER_REPLICATE
;
break
;
default:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
vxContext
*
ctx
=
vxContext
::
getContext
();
//At the moment OpenVX doesn't support separable filters natively so combine kernels to generic convolution
std
::
vector
<
short
>
data
;
data
.
reserve
(
kernelx_length
*
kernely_length
);
switch
(
kernel_type
)
{
case
CV_8UC1
:
for
(
int
j
=
0
;
j
<
kernely_length
;
++
j
)
for
(
int
i
=
0
;
i
<
kernelx_length
;
++
i
)
data
.
push_back
((
short
)(
kernely_data
[
j
])
*
kernelx_data
[
i
]);
break
;
case
CV_8SC1
:
for
(
int
j
=
0
;
j
<
kernely_length
;
++
j
)
for
(
int
i
=
0
;
i
<
kernelx_length
;
++
i
)
data
.
push_back
((
short
)(((
schar
*
)
kernely_data
)[
j
])
*
((
schar
*
)
kernelx_data
)[
i
]);
break
;
default:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
FilterCtx
*
cnv
=
new
FilterCtx
(
*
ctx
,
data
.
data
(),
kernelx_length
,
kernely_length
,
dst_type
,
border
);
if
(
!
cnv
)
return
CV_HAL_ERROR_UNKNOWN
;
*
filter_context
=
(
cvhalFilter2D
*
)(
cnv
);
return
CV_HAL_ERROR_OK
;
}
struct
MorphCtx
{
vxMatrix
mask
;
int
operation
;
vx_border_t
border
;
MorphCtx
(
vxContext
&
ctx
,
const
uchar
*
data
,
int
w
,
int
h
,
int
_operation
,
vx_border_t
&
_border
)
:
mask
(
ctx
,
data
,
w
,
h
),
operation
(
_operation
),
border
(
_border
)
{}
};
inline
int
ovx_hal_morphInit
(
cvhalFilter2D
**
filter_context
,
int
operation
,
int
src_type
,
int
dst_type
,
int
,
int
,
int
kernel_type
,
uchar
*
kernel_data
,
size_t
kernel_step
,
int
kernel_width
,
int
kernel_height
,
int
anchor_x
,
int
anchor_y
,
int
borderType
,
const
double
borderValue
[
4
],
int
iterations
,
bool
allowSubmatrix
,
bool
allowInplace
)
{
if
(
!
filter_context
||
!
kernel_data
||
allowSubmatrix
||
allowInplace
||
iterations
!=
1
||
src_type
!=
CV_8UC1
||
dst_type
!=
CV_8UC1
||
kernel_width
%
2
==
0
||
kernel_height
%
2
==
0
||
anchor_x
!=
kernel_width
/
2
||
anchor_y
!=
kernel_height
/
2
)
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
vx_border_t
border
;
switch
(
borderType
)
{
case
CV_HAL_BORDER_CONSTANT
:
border
.
mode
=
VX_BORDER_CONSTANT
;
if
(
borderValue
[
0
]
==
DBL_MAX
&&
borderValue
[
1
]
==
DBL_MAX
&&
borderValue
[
2
]
==
DBL_MAX
&&
borderValue
[
3
]
==
DBL_MAX
)
{
if
(
operation
==
MORPH_ERODE
)
border
.
constant_value
.
U8
=
UCHAR_MAX
;
else
border
.
constant_value
.
U8
=
0
;
}
else
{
border
.
constant_value
.
U8
=
cv
::
saturate_cast
<
uchar
>
(
borderValue
[
0
]);
}
break
;
case
CV_HAL_BORDER_REPLICATE
:
border
.
mode
=
VX_BORDER_REPLICATE
;
break
;
default:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
vxContext
*
ctx
=
vxContext
::
getContext
();
std
::
vector
<
uchar
>
kernel_mat
;
kernel_mat
.
resize
(
kernel_width
*
kernel_height
);
switch
(
CV_MAT_DEPTH
(
kernel_type
))
{
case
CV_8U
:
case
CV_8S
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
uchar
*
kernel_row
=
kernel_data
+
j
*
kernel_step
;
for
(
int
i
=
0
;
i
<
kernel_height
;
++
i
)
kernel_mat
.
push_back
(
kernel_row
[
i
]
?
255
:
0
);
}
break
;
case
CV_16U
:
case
CV_16S
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
short
*
kernel_row
=
(
short
*
)(
kernel_data
+
j
*
kernel_step
);
for
(
int
i
=
0
;
i
<
kernel_height
;
++
i
)
kernel_mat
.
push_back
(
kernel_row
[
i
]
?
255
:
0
);
}
break
;
case
CV_32S
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
int
*
kernel_row
=
(
int
*
)(
kernel_data
+
j
*
kernel_step
);
for
(
int
i
=
0
;
i
<
kernel_height
;
++
i
)
kernel_mat
.
push_back
(
kernel_row
[
i
]
?
255
:
0
);
}
break
;
case
CV_32F
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
float
*
kernel_row
=
(
float
*
)(
kernel_data
+
j
*
kernel_step
);
for
(
int
i
=
0
;
i
<
kernel_height
;
++
i
)
kernel_mat
.
push_back
(
kernel_row
[
i
]
?
255
:
0
);
}
break
;
case
CV_64F
:
for
(
int
j
=
0
;
j
<
kernel_height
;
++
j
)
{
double
*
kernel_row
=
(
double
*
)(
kernel_data
+
j
*
kernel_step
);
for
(
int
i
=
0
;
i
<
kernel_height
;
++
i
)
kernel_mat
.
push_back
(
kernel_row
[
i
]
?
255
:
0
);
}
break
;
default:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
MorphCtx
*
mat
;
switch
(
operation
)
{
case
MORPH_ERODE
:
mat
=
new
MorphCtx
(
*
ctx
,
kernel_mat
.
data
(),
kernel_width
,
kernel_height
,
VX_NONLINEAR_FILTER_MIN
,
border
);
case
MORPH_DILATE
:
mat
=
new
MorphCtx
(
*
ctx
,
kernel_mat
.
data
(),
kernel_width
,
kernel_height
,
VX_NONLINEAR_FILTER_MAX
,
border
);
break
;
default:
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
}
if
(
!
mat
)
return
CV_HAL_ERROR_UNKNOWN
;
*
filter_context
=
(
cvhalFilter2D
*
)(
mat
);
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_morphFree
(
cvhalFilter2D
*
filter_context
)
{
if
(
filter_context
)
{
delete
(
MorphCtx
*
)
filter_context
;
return
CV_HAL_ERROR_OK
;
}
else
{
return
CV_HAL_ERROR_UNKNOWN
;
}
}
inline
int
ovx_hal_morph
(
cvhalFilter2D
*
filter_context
,
uchar
*
a
,
size_t
astep
,
uchar
*
b
,
size_t
bstep
,
int
w
,
int
h
,
int
,
int
,
int
,
int
,
int
,
int
,
int
,
int
)
{
try
{
MorphCtx
*
mat
=
(
MorphCtx
*
)
filter_context
;
if
(
!
mat
)
vxErr
(
VX_ERROR_INVALID_PARAMETERS
,
"Bad HAL context"
).
check
();
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
a
,
astep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
b
,
bstep
,
w
,
h
);
//ATTENTION: VX_CONTEXT_IMMEDIATE_BORDER attribute change could lead to strange issues in multi-threaded environments
//since OpenVX standart says nothing about thread-safety for now
vx_border_t
prevBorder
;
vxErr
::
check
(
vxQueryContext
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
(
mat
->
border
),
sizeof
(
mat
->
border
)));
vxErr
::
check
(
vxuNonLinearFilter
(
ctx
->
ctx
,
mat
->
operation
,
ia
.
img
,
mat
->
mask
.
mtx
,
ib
.
img
));
vxErr
::
check
(
vxSetContextAttribute
(
ctx
->
ctx
,
VX_CONTEXT_IMMEDIATE_BORDER
,
&
prevBorder
,
sizeof
(
prevBorder
)));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_cvtBGRtoBGR
(
const
uchar
*
a
,
size_t
astep
,
uchar
*
b
,
size_t
bstep
,
int
w
,
int
h
,
int
depth
,
int
acn
,
int
bcn
,
bool
swapBlue
)
{
if
(
depth
!=
CV_8U
||
swapBlue
||
acn
==
bcn
||
(
acn
!=
3
&&
acn
!=
4
)
||
(
bcn
!=
3
&&
bcn
!=
4
))
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
acn
==
3
?
VX_DF_IMAGE_RGB
:
VX_DF_IMAGE_RGBX
,
a
,
astep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
bcn
==
3
?
VX_DF_IMAGE_RGB
:
VX_DF_IMAGE_RGBX
,
b
,
bstep
,
w
,
h
);
vxErr
::
check
(
vxuColorConvert
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_cvtTwoPlaneYUVtoBGR
(
const
uchar
*
a
,
size_t
astep
,
uchar
*
b
,
size_t
bstep
,
int
w
,
int
h
,
int
bcn
,
bool
swapBlue
,
int
uIdx
)
{
if
(
!
swapBlue
||
(
bcn
!=
3
&&
bcn
!=
4
))
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
uIdx
?
VX_DF_IMAGE_NV21
:
VX_DF_IMAGE_NV12
,
a
,
astep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
bcn
==
3
?
VX_DF_IMAGE_RGB
:
VX_DF_IMAGE_RGBX
,
b
,
bstep
,
w
,
h
);
vxErr
::
check
(
vxuColorConvert
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_cvtThreePlaneYUVtoBGR
(
const
uchar
*
a
,
size_t
astep
,
uchar
*
b
,
size_t
bstep
,
int
w
,
int
h
,
int
bcn
,
bool
swapBlue
,
int
uIdx
)
{
if
(
!
swapBlue
||
(
bcn
!=
3
&&
bcn
!=
4
)
||
uIdx
)
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
VX_DF_IMAGE_IYUV
,
a
,
astep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
bcn
==
3
?
VX_DF_IMAGE_RGB
:
VX_DF_IMAGE_RGBX
,
b
,
bstep
,
w
,
h
);
vxErr
::
check
(
vxuColorConvert
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_cvtBGRtoThreePlaneYUV
(
const
uchar
*
a
,
size_t
astep
,
uchar
*
b
,
size_t
bstep
,
int
w
,
int
h
,
int
acn
,
bool
swapBlue
,
int
uIdx
)
{
if
(
!
swapBlue
||
(
acn
!=
3
&&
acn
!=
4
)
||
uIdx
)
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
acn
==
3
?
VX_DF_IMAGE_RGB
:
VX_DF_IMAGE_RGBX
,
a
,
astep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
VX_DF_IMAGE_IYUV
,
b
,
bstep
,
w
,
h
);
vxErr
::
check
(
vxuColorConvert
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
inline
int
ovx_hal_cvtOnePlaneYUVtoBGR
(
const
uchar
*
a
,
size_t
astep
,
uchar
*
b
,
size_t
bstep
,
int
w
,
int
h
,
int
bcn
,
bool
swapBlue
,
int
uIdx
,
int
ycn
)
{
if
(
!
swapBlue
||
(
bcn
!=
3
&&
bcn
!=
4
)
||
uIdx
)
return
CV_HAL_ERROR_NOT_IMPLEMENTED
;
try
{
vxContext
*
ctx
=
vxContext
::
getContext
();
vxImage
ia
(
*
ctx
,
ycn
?
VX_DF_IMAGE_UYVY
:
VX_DF_IMAGE_YUYV
,
a
,
astep
,
w
,
h
);
vxImage
ib
(
*
ctx
,
bcn
==
3
?
VX_DF_IMAGE_RGB
:
VX_DF_IMAGE_RGBX
,
b
,
bstep
,
w
,
h
);
vxErr
::
check
(
vxuColorConvert
(
ctx
->
ctx
,
ia
.
img
,
ib
.
img
));
}
catch
(
vxErr
&
e
)
{
e
.
print
();
return
CV_HAL_ERROR_UNKNOWN
;
}
return
CV_HAL_ERROR_OK
;
}
#endif
//==================================================================================================
//==================================================================================================
// functions redefinition
// functions redefinition
// ...
// ...
...
@@ -192,5 +996,74 @@ inline int ovx_hal_add(const T *a, size_t astep, const T *b, size_t bstep, T *c,
...
@@ -192,5 +996,74 @@ inline int ovx_hal_add(const T *a, size_t astep, const T *b, size_t bstep, T *c,
#define cv_hal_add8u ovx_hal_add<uchar>
#define cv_hal_add8u ovx_hal_add<uchar>
#undef cv_hal_add16s
#undef cv_hal_add16s
#define cv_hal_add16s ovx_hal_add<short>
#define cv_hal_add16s ovx_hal_add<short>
#undef cv_hal_sub8u
#define cv_hal_sub8u ovx_hal_sub<uchar>
#undef cv_hal_sub16s
#define cv_hal_sub16s ovx_hal_sub<short>
#undef cv_hal_absdiff8u
#define cv_hal_absdiff8u ovx_hal_absdiff<uchar>
#undef cv_hal_absdiff16s
#define cv_hal_absdiff16s ovx_hal_absdiff<short>
#undef cv_hal_and8u
#define cv_hal_and8u ovx_hal_and<uchar>
#undef cv_hal_or8u
#define cv_hal_or8u ovx_hal_or<uchar>
#undef cv_hal_xor8u
#define cv_hal_xor8u ovx_hal_xor<uchar>
#undef cv_hal_not8u
#define cv_hal_not8u ovx_hal_not
#undef cv_hal_mul8u
#define cv_hal_mul8u ovx_hal_mul<uchar>
#undef cv_hal_mul16s
#define cv_hal_mul16s ovx_hal_mul<short>
#undef cv_hal_merge8u
#define cv_hal_merge8u ovx_hal_merge8u
#if defined OPENCV_IMGPROC_HAL_INTERFACE_H
#undef cv_hal_resize
#define cv_hal_resize ovx_hal_resize
#undef cv_hal_warpAffine
#define cv_hal_warpAffine ovx_hal_warpAffine
#undef cv_hal_warpPerspective
#define cv_hal_warpPerspective ovx_hal_warpPerspectve
#undef cv_hal_filterInit
#define cv_hal_filterInit ovx_hal_filterInit
#undef cv_hal_filter
#define cv_hal_filter ovx_hal_filter
#undef cv_hal_filterFree
#define cv_hal_filterFree ovx_hal_filterFree
#undef cv_hal_sepFilterInit
#define cv_hal_sepFilterInit ovx_hal_sepFilterInit
#undef cv_hal_sepFilter
#define cv_hal_sepFilter ovx_hal_filter
#undef cv_hal_sepFilterFree
#define cv_hal_sepFilterFree ovx_hal_filterFree
#undef cv_hal_morphInit
#define cv_hal_morphInit ovx_hal_morphInit
#undef cv_hal_morph
#define cv_hal_morph ovx_hal_morph
#undef cv_hal_morphFree
#define cv_hal_morphFree ovx_hal_morphFree
#undef cv_hal_cvtBGRtoBGR
#define cv_hal_cvtBGRtoBGR ovx_hal_cvtBGRtoBGR
#undef cv_hal_cvtTwoPlaneYUVtoBGR
#define cv_hal_cvtTwoPlaneYUVtoBGR ovx_hal_cvtTwoPlaneYUVtoBGR
#undef cv_hal_cvtThreePlaneYUVtoBGR
#define cv_hal_cvtThreePlaneYUVtoBGR ovx_hal_cvtThreePlaneYUVtoBGR
#undef cv_hal_cvtBGRtoThreePlaneYUV
#define cv_hal_cvtBGRtoThreePlaneYUV ovx_hal_cvtBGRtoThreePlaneYUV
#undef cv_hal_cvtOnePlaneYUVtoBGR
#define cv_hal_cvtOnePlaneYUVtoBGR ovx_hal_cvtOnePlaneYUVtoBGR
#endif
#endif
#endif
modules/imgproc/src/hal_replacement.hpp
View file @
473dba11
...
@@ -263,7 +263,7 @@ inline int hal_ni_resize(int src_type, const uchar *src_data, size_t src_step, i
...
@@ -263,7 +263,7 @@ inline int hal_ni_resize(int src_type, const uchar *src_data, size_t src_step, i
@param dst_step destination image step
@param dst_step destination image step
@param dst_width destination image width
@param dst_width destination image width
@param dst_height destination image height
@param dst_height destination image height
@param M
3x2
matrix with transform coefficients
@param M
2x3
matrix with transform coefficients
@param interpolation interpolation mode (CV_HAL_INTER_NEAREST, ...)
@param interpolation interpolation mode (CV_HAL_INTER_NEAREST, ...)
@param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
@param borderType border processing mode (CV_HAL_BORDER_REFLECT, ...)
@param borderValue values to use for CV_HAL_BORDER_CONSTANT mode
@param borderValue values to use for CV_HAL_BORDER_CONSTANT mode
...
...
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