Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/3rdparty/openvx/include/ivx.hpp
16356 views
1
// This file is part of OpenCV project.
2
// It is subject to the license terms in the LICENSE file found in the top-level directory
3
// of this distribution and at http://opencv.org/license.html.
4
5
// Copyright (C) 2016, Intel Corporation, all rights reserved.
6
// Third party copyrights are property of their respective owners.
7
8
/*
9
C++ wrappers over OpenVX 1.x C API
10
Details: TBD
11
*/
12
13
#pragma once
14
#ifndef IVX_HPP
15
#define IVX_HPP
16
17
#ifndef __cplusplus
18
#error This file has to be compiled with C++ compiler
19
#endif
20
21
22
#include <VX/vx.h>
23
#include <VX/vxu.h>
24
25
#ifndef VX_VERSION_1_1
26
// 1.1 to 1.0 backward compatibility defines
27
28
static const vx_enum VX_INTERPOLATION_BILINEAR = VX_INTERPOLATION_TYPE_BILINEAR;
29
static const vx_enum VX_INTERPOLATION_AREA = VX_INTERPOLATION_TYPE_AREA;
30
static const vx_enum VX_INTERPOLATION_NEAREST_NEIGHBOR = VX_INTERPOLATION_TYPE_NEAREST_NEIGHBOR;
31
32
static const vx_enum VX_BORDER_CONSTANT = VX_BORDER_MODE_CONSTANT;
33
static const vx_enum VX_BORDER_REPLICATE = VX_BORDER_MODE_REPLICATE;
34
35
#else
36
37
#ifdef IVX_RENAMED_REFS
38
static const vx_enum VX_REF_ATTRIBUTE_TYPE = VX_REFERENCE_TYPE;
39
#endif
40
41
#endif
42
43
#ifndef IVX_USE_CXX98
44
// checking compiler
45
#if __cplusplus < 201103L && (!defined(_MSC_VER) || _MSC_VER < 1800)
46
#define IVX_USE_CXX98
47
#endif
48
#endif // IVX_USE_CXX98
49
50
#if defined(IVX_USE_CXX98) && !defined(IVX_HIDE_INFO_WARNINGS)
51
#ifdef _MSC_VER
52
#pragma message ("ivx.hpp: The ISO C++ 2011 standard is not enabled, switching to C++98 fallback implementation.")
53
#else
54
#warning The ISO C++ 2011 standard is not enabled, switching to C++98 fallback implementation.
55
#endif
56
#endif // IVX_USE_CXX98
57
58
#ifndef IVX_USE_EXTERNAL_REFCOUNT
59
// checking OpenVX version
60
#ifndef VX_VERSION_1_1
61
#define IVX_USE_EXTERNAL_REFCOUNT
62
#endif
63
#endif // IVX_USE_CXX98
64
65
#if defined(IVX_USE_EXTERNAL_REFCOUNT) && !defined(IVX_HIDE_INFO_WARNINGS)
66
#ifdef _MSC_VER
67
#pragma message ("ivx.hpp: OpenVX version < 1.1, switching to external refcounter implementation.")
68
#else
69
#warning OpenVX version < 1.1, switching to external refcounter implementation.
70
#endif
71
#endif // IVX_USE_EXTERNAL_REFCOUNT
72
73
#include <stdexcept>
74
#include <utility>
75
#include <string>
76
#include <vector>
77
#include <cstdlib>
78
79
#ifndef IVX_USE_CXX98
80
#include <type_traits>
81
namespace ivx
82
{
83
using std::is_same;
84
using std::is_pointer;
85
}
86
#else
87
namespace ivx
88
{
89
// helpers for compile-time type checking
90
91
template<typename, typename> struct is_same { static const bool value = false; };
92
template<typename T> struct is_same<T, T> { static const bool value = true; };
93
94
template<typename T> struct is_pointer { static const bool value = false; };
95
template<typename T> struct is_pointer<T*> { static const bool value = true; };
96
template<typename T> struct is_pointer<const T*> { static const bool value = true; };
97
}
98
#endif
99
100
#ifdef IVX_USE_OPENCV
101
#include "opencv2/core.hpp"
102
#endif
103
104
// disabling false alarm warnings
105
#if defined(_MSC_VER)
106
#pragma warning(push)
107
//#pragma warning( disable : 4??? )
108
#elif defined(__clang__)
109
#pragma clang diagnostic push
110
#pragma clang diagnostic ignored "-Wunused-local-typedef"
111
#pragma clang diagnostic ignored "-Wmissing-prototypes"
112
#elif defined(__GNUC__)
113
#pragma GCC diagnostic push
114
#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
115
#pragma GCC diagnostic ignored "-Wunused-value"
116
#pragma GCC diagnostic ignored "-Wmissing-declarations"
117
#endif // compiler macro
118
119
namespace ivx
120
{
121
122
inline vx_uint16 compiledWithVersion()
123
{ return VX_VERSION; }
124
125
/// Exception class for OpenVX runtime errors
126
class RuntimeError : public std::runtime_error
127
{
128
public:
129
/// Constructor
130
explicit RuntimeError(vx_status st, const std::string& msg = "")
131
: runtime_error(msg), _status(st)
132
{}
133
134
/// OpenVX error code
135
vx_status status() const
136
{ return _status; }
137
138
private:
139
vx_status _status;
140
};
141
142
/// Exception class for wrappers logic errors
143
class WrapperError : public std::logic_error
144
{
145
public:
146
/// Constructor
147
explicit WrapperError(const std::string& msg) : logic_error(msg)
148
{}
149
};
150
151
inline void checkVxStatus(vx_status status, const std::string& func, const std::string& msg)
152
{
153
if(status != VX_SUCCESS) throw RuntimeError( status, func + "() : " + msg );
154
}
155
156
157
/// Helper macro for turning a runtime error in the provided code into a \RuntimeError
158
#define IVX_CHECK_STATUS(code) checkVxStatus(code, __func__, #code)
159
160
161
/// OpenVX enum to type compile-time converter (TODO: add more types)
162
template<vx_enum E> struct EnumToType {};
163
template<> struct EnumToType<VX_TYPE_CHAR> { typedef vx_char type; static const vx_size bytes = sizeof(type); };
164
template<> struct EnumToType<VX_TYPE_INT8> { typedef vx_int8 type; static const vx_size bytes = sizeof(type); };
165
template<> struct EnumToType<VX_TYPE_UINT8> { typedef vx_uint8 type; static const vx_size bytes = sizeof(type); };
166
template<> struct EnumToType<VX_TYPE_INT16> { typedef vx_int16 type; static const vx_size bytes = sizeof(type); };
167
template<> struct EnumToType<VX_TYPE_UINT16> { typedef vx_uint16 type; static const vx_size bytes = sizeof(type); };
168
template<> struct EnumToType<VX_TYPE_INT32> { typedef vx_int32 type; static const vx_size bytes = sizeof(type); };
169
template<> struct EnumToType<VX_TYPE_UINT32> { typedef vx_uint32 type; static const vx_size bytes = sizeof(type); };
170
template<> struct EnumToType<VX_TYPE_INT64> { typedef vx_int64 type; static const vx_size bytes = sizeof(type); };
171
template<> struct EnumToType<VX_TYPE_UINT64> { typedef vx_uint64 type; static const vx_size bytes = sizeof(type); };
172
template<> struct EnumToType<VX_TYPE_FLOAT32> { typedef vx_float32 type; static const vx_size bytes = sizeof(type); };
173
template<> struct EnumToType<VX_TYPE_FLOAT64> { typedef vx_float64 type; static const vx_size bytes = sizeof(type); };
174
template<> struct EnumToType<VX_TYPE_ENUM> { typedef vx_enum type; static const vx_size bytes = sizeof(type); };
175
template<> struct EnumToType<VX_TYPE_SIZE> { typedef vx_size type; static const vx_size bytes = sizeof(type); };
176
template<> struct EnumToType<VX_TYPE_DF_IMAGE> { typedef vx_df_image type; static const vx_size bytes = sizeof(type); };
177
template<> struct EnumToType<VX_TYPE_BOOL> { typedef vx_bool type; static const vx_size bytes = sizeof(type); };
178
template<> struct EnumToType<VX_TYPE_KEYPOINT> { typedef vx_keypoint_t type;static const vx_size bytes = sizeof(type); };
179
#ifndef IVX_USE_CXX98
180
template <vx_enum E> using EnumToType_t = typename EnumToType<E>::type;
181
#endif
182
183
/// Gets size in bytes for the provided OpenVX type enum
184
inline vx_size enumToTypeSize(vx_enum type)
185
{
186
switch (type)
187
{
188
case VX_TYPE_CHAR: return EnumToType<VX_TYPE_CHAR>::bytes;
189
case VX_TYPE_INT8: return EnumToType<VX_TYPE_INT8>::bytes;
190
case VX_TYPE_UINT8: return EnumToType<VX_TYPE_UINT8>::bytes;
191
case VX_TYPE_INT16: return EnumToType<VX_TYPE_INT16>::bytes;
192
case VX_TYPE_UINT16: return EnumToType<VX_TYPE_UINT16>::bytes;
193
case VX_TYPE_INT32: return EnumToType<VX_TYPE_INT32>::bytes;
194
case VX_TYPE_UINT32: return EnumToType<VX_TYPE_UINT32>::bytes;
195
case VX_TYPE_INT64: return EnumToType<VX_TYPE_INT64>::bytes;
196
case VX_TYPE_UINT64: return EnumToType<VX_TYPE_UINT64>::bytes;
197
case VX_TYPE_FLOAT32: return EnumToType<VX_TYPE_FLOAT32>::bytes;
198
case VX_TYPE_FLOAT64: return EnumToType<VX_TYPE_FLOAT64>::bytes;
199
case VX_TYPE_ENUM: return EnumToType<VX_TYPE_ENUM>::bytes;
200
case VX_TYPE_SIZE: return EnumToType<VX_TYPE_SIZE>::bytes;
201
case VX_TYPE_DF_IMAGE: return EnumToType<VX_TYPE_DF_IMAGE>::bytes;
202
case VX_TYPE_BOOL: return EnumToType<VX_TYPE_BOOL>::bytes;
203
case VX_TYPE_KEYPOINT: return EnumToType<VX_TYPE_KEYPOINT>::bytes;
204
default: throw WrapperError(std::string(__func__) + ": unsupported type enum");
205
}
206
}
207
208
/// type to enum compile-time converter (TODO: add more types)
209
template<typename T> struct TypeToEnum {};
210
template<> struct TypeToEnum<vx_char> { static const vx_enum value = VX_TYPE_CHAR; };
211
template<> struct TypeToEnum<vx_int8> { static const vx_enum value = VX_TYPE_INT8; };
212
template<> struct TypeToEnum<vx_uint8> { static const vx_enum value = VX_TYPE_UINT8, imgType = VX_DF_IMAGE_U8; };
213
template<> struct TypeToEnum<vx_int16> { static const vx_enum value = VX_TYPE_INT16, imgType = VX_DF_IMAGE_S16; };
214
template<> struct TypeToEnum<vx_uint16> { static const vx_enum value = VX_TYPE_UINT16, imgType = VX_DF_IMAGE_U16; };
215
template<> struct TypeToEnum<vx_int32> { static const vx_enum value = VX_TYPE_INT32, imgType = VX_DF_IMAGE_S32; };
216
template<> struct TypeToEnum<vx_uint32> { static const vx_enum value = VX_TYPE_UINT32, imgType = VX_DF_IMAGE_U32; };
217
template<> struct TypeToEnum<vx_int64> { static const vx_enum value = VX_TYPE_INT64; };
218
template<> struct TypeToEnum<vx_uint64> { static const vx_enum value = VX_TYPE_UINT64; };
219
template<> struct TypeToEnum<vx_float32> { static const vx_enum value = VX_TYPE_FLOAT32, imgType = VX_DF_IMAGE('F', '0', '3', '2'); };
220
template<> struct TypeToEnum<vx_float64> { static const vx_enum value = VX_TYPE_FLOAT64; };
221
template<> struct TypeToEnum<vx_bool> { static const vx_enum value = VX_TYPE_BOOL; };
222
template<> struct TypeToEnum<vx_keypoint_t> {static const vx_enum value = VX_TYPE_KEYPOINT; };
223
// the commented types are aliases (of integral tyes) and have conflicts with the types above
224
//template<> struct TypeToEnum<vx_enum> { static const vx_enum val = VX_TYPE_ENUM; };
225
//template<> struct TypeToEnum<vx_size> { static const vx_enum val = VX_TYPE_SIZE; };
226
//template<> struct TypeToEnum<vx_df_image> { static const vx_enum val = VX_TYPE_DF_IMAGE; };
227
228
inline bool areTypesCompatible(const vx_enum a, const vx_enum b)
229
{
230
return enumToTypeSize(a) == enumToTypeSize(b);
231
}
232
233
#ifdef IVX_USE_OPENCV
234
inline int enumToCVType(vx_enum type)
235
{
236
switch (type)
237
{
238
case VX_TYPE_CHAR: return CV_8UC1;//While OpenCV support 8S as well, 8U is supported wider
239
case VX_TYPE_INT8: return CV_8SC1;
240
case VX_TYPE_UINT8: return CV_8UC1;
241
case VX_TYPE_INT16: return CV_16SC1;
242
case VX_TYPE_UINT16: return CV_16UC1;
243
case VX_TYPE_INT32: return CV_32SC1;
244
case VX_TYPE_UINT32: return CV_32SC1;//That's not the best option but there is CV_32S type only
245
case VX_TYPE_FLOAT32: return CV_32FC1;
246
case VX_TYPE_FLOAT64: return CV_64FC1;
247
case VX_TYPE_ENUM: return CV_32SC1;
248
case VX_TYPE_BOOL: return CV_32SC1;
249
default: throw WrapperError(std::string(__func__) + ": unsupported type enum");
250
}
251
}
252
#endif
253
254
/// Helper type, provides info for OpenVX 'objects' (vx_reference extending) types
255
template <typename T> struct RefTypeTraits {};
256
257
class Context;
258
template <> struct RefTypeTraits <vx_context>
259
{
260
typedef vx_context vxType;
261
typedef Context wrapperType;
262
static const vx_enum vxTypeEnum = VX_TYPE_CONTEXT;
263
static vx_status release(vxType& ref) { return vxReleaseContext(&ref); }
264
};
265
266
class Graph;
267
template <> struct RefTypeTraits <vx_graph>
268
{
269
typedef vx_graph vxType;
270
typedef Graph wrapperType;
271
static const vx_enum vxTypeEnum = VX_TYPE_GRAPH;
272
static vx_status release(vxType& ref) { return vxReleaseGraph(&ref); }
273
};
274
275
class Node;
276
template <> struct RefTypeTraits <vx_node>
277
{
278
typedef vx_node vxType;
279
typedef Node wrapperType;
280
static const vx_enum vxTypeEnum = VX_TYPE_NODE;
281
static vx_status release(vxType& ref) { return vxReleaseNode(&ref); }
282
};
283
284
class Kernel;
285
template <> struct RefTypeTraits <vx_kernel>
286
{
287
typedef vx_kernel vxType;
288
typedef Kernel wrapperType;
289
static const vx_enum vxTypeEnum = VX_TYPE_KERNEL;
290
static vx_status release(vxType& ref) { return vxReleaseKernel(&ref); }
291
};
292
293
class Param;
294
template <> struct RefTypeTraits <vx_parameter>
295
{
296
typedef vx_parameter vxType;
297
typedef Param wrapperType;
298
static const vx_enum vxTypeEnum = VX_TYPE_PARAMETER;
299
static vx_status release(vxType& ref) { return vxReleaseParameter(&ref); }
300
};
301
302
class Image;
303
template <> struct RefTypeTraits <vx_image>
304
{
305
typedef vx_image vxType;
306
typedef Image wrapperType;
307
static const vx_enum vxTypeEnum = VX_TYPE_IMAGE;
308
static vx_status release(vxType& ref) { return vxReleaseImage(&ref); }
309
};
310
311
class Scalar;
312
template <> struct RefTypeTraits <vx_scalar>
313
{
314
typedef vx_scalar vxType;
315
typedef Scalar wrapperType;
316
static const vx_enum vxTypeEnum = VX_TYPE_SCALAR;
317
static vx_status release(vxType& ref) { return vxReleaseScalar(&ref); }
318
};
319
320
class Array;
321
template <> struct RefTypeTraits <vx_array>
322
{
323
typedef vx_array vxType;
324
typedef Array wrapperType;
325
static const vx_enum vxTypeEnum = VX_TYPE_ARRAY;
326
static vx_status release(vxType& ref) { return vxReleaseArray(&ref); }
327
};
328
329
class Threshold;
330
template <> struct RefTypeTraits <vx_threshold>
331
{
332
typedef vx_threshold vxType;
333
typedef Threshold wrapperType;
334
static const vx_enum vxTypeEnum = VX_TYPE_THRESHOLD;
335
static vx_status release(vxType& ref) { return vxReleaseThreshold(&ref); }
336
};
337
338
class Convolution;
339
template <> struct RefTypeTraits <vx_convolution>
340
{
341
typedef vx_convolution vxType;
342
typedef Convolution wrapperType;
343
static const vx_enum vxTypeEnum = VX_TYPE_CONVOLUTION;
344
static vx_status release(vxType& ref) { return vxReleaseConvolution(&ref); }
345
};
346
347
class Matrix;
348
template <> struct RefTypeTraits <vx_matrix>
349
{
350
typedef vx_matrix vxType;
351
typedef Matrix wrapperType;
352
static const vx_enum vxTypeEnum = VX_TYPE_MATRIX;
353
static vx_status release(vxType& ref) { return vxReleaseMatrix(&ref); }
354
};
355
356
class LUT;
357
template <> struct RefTypeTraits <vx_lut>
358
{
359
typedef vx_lut vxType;
360
typedef LUT wrapperType;
361
static const vx_enum vxTypeEnum = VX_TYPE_LUT;
362
static vx_status release(vxType& ref) { return vxReleaseLUT(&ref); }
363
};
364
365
class Pyramid;
366
template <> struct RefTypeTraits <vx_pyramid>
367
{
368
typedef vx_pyramid vxType;
369
typedef Pyramid wrapperType;
370
static const vx_enum vxTypeEnum = VX_TYPE_PYRAMID;
371
static vx_status release(vxType& ref) { return vxReleasePyramid(&ref); }
372
};
373
374
class Distribution;
375
template <> struct RefTypeTraits <vx_distribution>
376
{
377
typedef vx_distribution vxType;
378
typedef Distribution wrapperType;
379
static const vx_enum vxTypeEnum = VX_TYPE_DISTRIBUTION;
380
static vx_status release(vxType& ref) { return vxReleaseDistribution(&ref); }
381
};
382
383
class Remap;
384
template <> struct RefTypeTraits <vx_remap>
385
{
386
typedef vx_remap vxType;
387
typedef Remap wrapperType;
388
static const vx_enum vxTypeEnum = VX_TYPE_REMAP;
389
static vx_status release(vxType& ref) { return vxReleaseRemap(&ref); }
390
};
391
392
#ifdef IVX_USE_CXX98
393
394
/// Casting to vx_reference with compile-time check
395
396
// takes 'vx_reference' itself and RefWrapper<T> via 'operator vx_reference()'
397
inline vx_reference castToReference(vx_reference ref)
398
{ return ref; }
399
400
// takes vx_reference extensions that have RefTypeTraits<T> specializations
401
template<typename T>
402
inline vx_reference castToReference(const T& ref, typename RefTypeTraits<T>::vxType dummy = 0)
403
{ (void)dummy; return (vx_reference)ref; }
404
405
#else
406
407
template<typename T, typename = void>
408
struct is_ref : std::is_same<T, vx_reference>{}; // allow vx_reference
409
410
// allow RefWrapper<> types
411
template<typename T>
412
#ifndef _MSC_VER
413
struct is_ref<T, decltype(T().operator vx_reference(), void())> : std::true_type {};
414
#else
415
// workarounding VC14 compiler crash
416
struct is_ref<T, decltype(T::vxType(), void())> : std::true_type {};
417
#endif
418
419
// allow vx_reference extensions
420
template<typename T>
421
struct is_ref<T, decltype(RefTypeTraits<T>::vxTypeEnum, void())> : std::true_type {};
422
423
/// Casting to vx_reference with compile-time check
424
425
template<typename T>
426
inline vx_reference castToReference(const T& obj)
427
{
428
static_assert(is_ref<T>::value, "unsupported conversion");
429
return (vx_reference) obj;
430
}
431
432
#endif // IVX_USE_CXX98
433
434
inline void checkVxRef(vx_reference ref, const std::string& func, const std::string& msg)
435
{
436
vx_status status = vxGetStatus(ref);
437
if(status != VX_SUCCESS) throw RuntimeError( status, func + "() : " + msg );
438
}
439
440
/// Helper macro for checking the provided OpenVX 'object' and throwing a \RuntimeError in case of error
441
#define IVX_CHECK_REF(code) checkVxRef(castToReference(code), __func__, #code)
442
443
444
#ifdef IVX_USE_EXTERNAL_REFCOUNT
445
446
/// Base class for OpenVX 'objects' wrappers
447
template <typename T> class RefWrapper
448
{
449
public:
450
typedef T vxType;
451
static const vx_enum vxTypeEnum = RefTypeTraits <T>::vxTypeEnum;
452
453
/// Default constructor
454
RefWrapper() : ref(0), refcount(0)
455
{}
456
457
/// Constructor
458
/// \param r OpenVX 'object' (e.g. vx_image)
459
/// \param retainRef flag indicating whether to increase ref counter in constructor (false by default)
460
explicit RefWrapper(T r, bool retainRef = false) : ref(0), refcount(0)
461
{ reset(r, retainRef); }
462
463
/// Copy constructor
464
RefWrapper(const RefWrapper& r) : ref(r.ref), refcount(r.refcount)
465
{ addRef(); }
466
467
#ifndef IVX_USE_CXX98
468
/// Move constructor
469
RefWrapper(RefWrapper&& rw) noexcept : RefWrapper()
470
{
471
using std::swap;
472
swap(ref, rw.ref);
473
swap(refcount, rw.refcount);
474
}
475
#endif
476
477
/// Casting to the wrapped OpenVX 'object'
478
operator T() const
479
{ return ref; }
480
481
/// Casting to vx_reference since every OpenVX 'object' extends it
482
operator vx_reference() const
483
{ return castToReference(ref); }
484
485
/// Assigning a new value (decreasing ref counter for the old one)
486
/// \param r OpenVX 'object' (e.g. vx_image)
487
/// \param retainRef flag indicating whether to increase ref counter in constructor (false by default)
488
void reset(T r, bool retainRef = false)
489
{
490
release();
491
ref = r;
492
#ifdef VX_VERSION_1_1
493
if(retainRef) addRef();
494
#else
495
// if 'retainRef' -just don't use ref-counting for v 1.0
496
if(!retainRef) refcount = new int(1);
497
#endif
498
checkRef();
499
}
500
501
/// Assigning an empty value (decreasing ref counter for the old one)
502
void reset()
503
{ release(); }
504
505
/// Dropping kept value without releas decreasing ref counter
506
/// \return the value being dropped
507
T detach()
508
{
509
T tmp = ref;
510
ref = 0;
511
release();
512
return tmp;
513
}
514
515
/// Unified assignment operator (covers both copy and move cases)
516
RefWrapper& operator=(RefWrapper r)
517
{
518
using std::swap;
519
swap(ref, r.ref);
520
swap(refcount, r.refcount);
521
return *this;
522
}
523
524
/// Checking for non-empty
525
bool operator !() const
526
{ return ref == 0; }
527
528
#ifndef IVX_USE_CXX98
529
/// Explicit boolean evaluation (called automatically inside conditional operators only)
530
explicit operator bool() const
531
{ return ref != 0; }
532
#endif
533
534
/// Getting a context that is kept in each OpenVX 'object' (call get<Context>())
535
template<typename C>
536
C get() const
537
{
538
typedef int static_assert_context[is_same<C, Context>::value ? 1 : -1];
539
vx_context c = vxGetContext(castToReference(ref));
540
// vxGetContext doesn't increment ref count, let do it in wrapper c-tor
541
return C(c, true);
542
}
543
544
#ifndef IVX_USE_CXX98
545
/// Getting a context that is kept in each OpenVX 'object'
546
template<typename C = Context, typename = typename std::enable_if<std::is_same<C, Context>::value>::type>
547
C getContext() const
548
{
549
vx_context c = vxGetContext(castToReference(ref));
550
// vxGetContext doesn't increment ref count, let do it in wrapper c-tor
551
return C(c, true);
552
}
553
#endif // IVX_USE_CXX98
554
555
protected:
556
T ref;
557
int* refcount;
558
559
void addRef()
560
{
561
#ifdef VX_VERSION_1_1
562
if(ref) IVX_CHECK_STATUS(vxRetainReference(castToReference(ref)));
563
#else //TODO: make thread-safe
564
if(refcount) ++(*refcount);
565
#endif
566
}
567
568
void release()
569
{
570
#ifdef VX_VERSION_1_1
571
if(ref) RefTypeTraits<T>::release(ref);
572
#else //TODO: make thread-safe
573
if(refcount && --(*refcount) == 0)
574
{
575
if(ref) RefTypeTraits<T>::release(ref);
576
ref = 0;
577
delete refcount;
578
refcount = 0;
579
}
580
#endif
581
}
582
583
void checkRef() const
584
{
585
IVX_CHECK_REF(ref);
586
vx_enum type;
587
IVX_CHECK_STATUS(vxQueryReference((vx_reference)ref, VX_REF_ATTRIBUTE_TYPE, &type, sizeof(type)));
588
if (type != vxTypeEnum) throw WrapperError("incompatible reference type");
589
}
590
591
~RefWrapper()
592
{ release(); }
593
};
594
595
#ifdef IVX_USE_CXX98
596
597
#define IVX_REF_STD_CTORS_AND_ASSIGNMENT(Class) \
598
Class() : RefWrapper() {} \
599
explicit Class(Class::vxType _ref, bool retainRef = false) : RefWrapper(_ref, retainRef) {} \
600
Class(const Class& _obj) : RefWrapper(_obj) {} \
601
\
602
Class& operator=(Class _obj) { using std::swap; swap(ref, _obj.ref); swap(refcount, _obj.refcount); return *this; }
603
604
#else
605
606
#define IVX_REF_STD_CTORS_AND_ASSIGNMENT(Class) \
607
Class() : RefWrapper() {} \
608
explicit Class(Class::vxType _ref, bool retainRef = false) : RefWrapper(_ref, retainRef) {} \
609
Class(const Class& _obj) : RefWrapper(_obj) {} \
610
Class(Class&& _obj) : RefWrapper(std::move(_obj)) {} \
611
\
612
Class& operator=(Class _obj) { using std::swap; swap(ref, _obj.ref); swap(refcount, _obj.refcount); return *this; }
613
614
#endif // IVX_USE_CXX98
615
616
#else // not IVX_USE_EXTERNAL_REFCOUNT
617
618
/// Base class for OpenVX 'objects' wrappers
619
template <typename T> class RefWrapper
620
{
621
public:
622
typedef T vxType;
623
static const vx_enum vxTypeEnum = RefTypeTraits <T>::vxTypeEnum;
624
625
/// Default constructor
626
RefWrapper() : ref(0)
627
{}
628
629
/// Constructor
630
/// \param r OpenVX 'object' (e.g. vx_image)
631
/// \param retainRef flag indicating whether to increase ref counter in constructor (false by default)
632
explicit RefWrapper(T r, bool retainRef = false) : ref(0)
633
{ reset(r, retainRef); }
634
635
/// Copy constructor
636
RefWrapper(const RefWrapper& r) : ref(r.ref)
637
{ addRef(); }
638
639
#ifndef IVX_USE_CXX98
640
/// Move constructor
641
RefWrapper(RefWrapper&& rw) noexcept : RefWrapper()
642
{
643
using std::swap;
644
swap(ref, rw.ref);
645
}
646
#endif
647
648
/// Casting to the wrapped OpenVX 'object'
649
operator T() const
650
{ return ref; }
651
652
/// Casting to vx_reference since every OpenVX 'object' extends it
653
operator vx_reference() const
654
{ return castToReference(ref); }
655
656
/// Getting a context that is kept in each OpenVX 'object' (call get<Context>())
657
template<typename C>
658
C get() const
659
{
660
typedef int static_assert_context[is_same<C, Context>::value ? 1 : -1];
661
vx_context c = vxGetContext(castToReference(ref));
662
// vxGetContext doesn't increment ref count, let do it in wrapper c-tor
663
return C(c, true);
664
}
665
666
#ifndef IVX_USE_CXX98
667
/// Getting a context that is kept in each OpenVX 'object'
668
template<typename C = Context, typename = typename std::enable_if<std::is_same<C, Context>::value>::type>
669
C getContext() const
670
{
671
vx_context c = vxGetContext(castToReference(ref));
672
// vxGetContext doesn't increment ref count, let do it in wrapper c-tor
673
return C(c, true);
674
}
675
#endif // IVX_USE_CXX98
676
677
/// Assigning a new value (decreasing ref counter for the old one)
678
/// \param r OpenVX 'object' (e.g. vx_image)
679
/// \param retainRef flag indicating whether to increase ref counter in constructor (false by default)
680
void reset(T r, bool retainRef = false)
681
{
682
release();
683
ref = r;
684
if (retainRef) addRef();
685
checkRef();
686
}
687
688
/// Assigning an empty value (decreasing ref counter for the old one)
689
void reset()
690
{ release(); }
691
692
/// Dropping kept value without releas decreasing ref counter
693
/// \return the value being dropped
694
T detach()
695
{
696
T tmp = ref;
697
ref = 0;
698
return tmp;
699
}
700
701
/// Unified assignment operator (covers both copy and move cases)
702
RefWrapper& operator=(RefWrapper r)
703
{
704
using std::swap;
705
swap(ref, r.ref);
706
return *this;
707
}
708
709
/// Checking for non-empty
710
bool operator !() const
711
{ return ref == 0; }
712
713
#ifndef IVX_USE_CXX98
714
/// Explicit boolean evaluation (called automatically inside conditional operators only)
715
explicit operator bool() const
716
{ return ref != 0; }
717
#endif
718
719
protected:
720
T ref;
721
722
void addRef()
723
{ if (ref) IVX_CHECK_STATUS(vxRetainReference((vx_reference)ref)); }
724
725
void release()
726
{
727
if (ref) RefTypeTraits<T>::release(ref);
728
ref = 0;
729
}
730
731
void checkRef() const
732
{
733
IVX_CHECK_REF(ref);
734
vx_enum type;
735
IVX_CHECK_STATUS(vxQueryReference((vx_reference)ref, VX_REF_ATTRIBUTE_TYPE, &type, sizeof(type)));
736
if (type != vxTypeEnum) throw WrapperError("incompatible reference type");
737
}
738
739
~RefWrapper()
740
{ release(); }
741
};
742
743
#ifdef IVX_USE_CXX98
744
745
#define IVX_REF_STD_CTORS_AND_ASSIGNMENT(Class) \
746
Class() : RefWrapper() {} \
747
explicit Class(Class::vxType _ref, bool retainRef = false) : RefWrapper(_ref, retainRef) {} \
748
Class(const Class& _obj) : RefWrapper(_obj) {} \
749
\
750
Class& operator=(Class _obj) { using std::swap; swap(ref, _obj.ref); return *this; }
751
752
#else
753
754
#define IVX_REF_STD_CTORS_AND_ASSIGNMENT(Class) \
755
Class() : RefWrapper() {} \
756
explicit Class(Class::vxType _ref, bool retainRef = false) : RefWrapper(_ref, retainRef) {} \
757
Class(const Class& _obj) : RefWrapper(_obj) {} \
758
Class(Class&& _obj) : RefWrapper(std::move(_obj)) {} \
759
\
760
Class& operator=(Class _obj) { using std::swap; swap(ref, _obj.ref); return *this; }
761
762
#endif // IVX_USE_CXX98
763
764
#endif // IVX_USE_EXTERNAL_REFCOUNT
765
766
#ifndef VX_VERSION_1_1
767
typedef vx_border_mode_t border_t;
768
#else
769
typedef vx_border_t border_t;
770
#endif
771
772
/// vx_context wrapper
773
class Context : public RefWrapper<vx_context>
774
{
775
public:
776
777
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Context)
778
779
/// vxCreateContext() wrapper
780
static Context create()
781
{ return Context(vxCreateContext()); }
782
783
/// vxGetContext() wrapper
784
template <typename T>
785
static Context getFrom(const T& ref)
786
{
787
vx_context c = vxGetContext(castToReference(ref));
788
// vxGetContext doesn't increment ref count, let do it in wrapper c-tor
789
return Context(c, true);
790
}
791
792
/// vxLoadKernels() wrapper
793
void loadKernels(const std::string& module)
794
{ IVX_CHECK_STATUS( vxLoadKernels(ref, module.c_str()) ); }
795
796
/// vxQueryContext() wrapper
797
template<typename T>
798
void query(vx_enum att, T& value) const
799
{ IVX_CHECK_STATUS(vxQueryContext(ref, att, &value, sizeof(value))); }
800
801
#ifndef VX_VERSION_1_1
802
static const vx_enum
803
VX_CONTEXT_VENDOR_ID = VX_CONTEXT_ATTRIBUTE_VENDOR_ID,
804
VX_CONTEXT_VERSION = VX_CONTEXT_ATTRIBUTE_VERSION,
805
VX_CONTEXT_UNIQUE_KERNELS = VX_CONTEXT_ATTRIBUTE_UNIQUE_KERNELS,
806
VX_CONTEXT_MODULES = VX_CONTEXT_ATTRIBUTE_MODULES,
807
VX_CONTEXT_REFERENCES = VX_CONTEXT_ATTRIBUTE_REFERENCES,
808
VX_CONTEXT_IMPLEMENTATION = VX_CONTEXT_ATTRIBUTE_IMPLEMENTATION,
809
VX_CONTEXT_EXTENSIONS_SIZE = VX_CONTEXT_ATTRIBUTE_EXTENSIONS_SIZE,
810
VX_CONTEXT_EXTENSIONS = VX_CONTEXT_ATTRIBUTE_EXTENSIONS,
811
VX_CONTEXT_CONVOLUTION_MAX_DIMENSION = VX_CONTEXT_ATTRIBUTE_CONVOLUTION_MAXIMUM_DIMENSION,
812
VX_CONTEXT_OPTICAL_FLOW_MAX_WINDOW_DIMENSION = VX_CONTEXT_ATTRIBUTE_OPTICAL_FLOW_WINDOW_MAXIMUM_DIMENSION,
813
VX_CONTEXT_IMMEDIATE_BORDER = VX_CONTEXT_ATTRIBUTE_IMMEDIATE_BORDER_MODE,
814
VX_CONTEXT_UNIQUE_KERNEL_TABLE = VX_CONTEXT_ATTRIBUTE_UNIQUE_KERNEL_TABLE;
815
#endif
816
817
/// vxQueryContext(VX_CONTEXT_VENDOR_ID) wrapper
818
vx_uint16 vendorID() const
819
{
820
vx_uint16 v;
821
query(VX_CONTEXT_VENDOR_ID, v);
822
return v;
823
}
824
825
/// vxQueryContext(VX_CONTEXT_VERSION) wrapper
826
vx_uint16 version() const
827
{
828
vx_uint16 v;
829
query(VX_CONTEXT_VERSION, v);
830
return v;
831
}
832
833
/// vxQueryContext(VX_CONTEXT_UNIQUE_KERNELS) wrapper
834
vx_uint32 uniqueKernelsNum() const
835
{
836
vx_uint32 v;
837
query(VX_CONTEXT_UNIQUE_KERNELS, v);
838
return v;
839
}
840
841
/// vxQueryContext(VX_CONTEXT_MODULES) wrapper
842
vx_uint32 modulesNum() const
843
{
844
vx_uint32 v;
845
query(VX_CONTEXT_MODULES, v);
846
return v;
847
}
848
849
/// vxQueryContext(VX_CONTEXT_REFERENCES) wrapper
850
vx_uint32 refsNum() const
851
{
852
vx_uint32 v;
853
query(VX_CONTEXT_REFERENCES, v);
854
return v;
855
}
856
857
/// vxQueryContext(VX_CONTEXT_EXTENSIONS_SIZE) wrapper
858
vx_size extensionsSize() const
859
{
860
vx_size v;
861
query(VX_CONTEXT_EXTENSIONS_SIZE, v);
862
return v;
863
}
864
865
/// vxQueryContext(VX_CONTEXT_CONVOLUTION_MAX_DIMENSION) wrapper
866
vx_size convolutionMaxDimension() const
867
{
868
vx_size v;
869
query(VX_CONTEXT_CONVOLUTION_MAX_DIMENSION, v);
870
return v;
871
}
872
873
/// vxQueryContext(VX_CONTEXT_OPTICAL_FLOW_MAX_WINDOW_DIMENSION) wrapper
874
vx_size opticalFlowMaxWindowSize() const
875
{
876
vx_size v;
877
query(VX_CONTEXT_OPTICAL_FLOW_MAX_WINDOW_DIMENSION, v);
878
return v;
879
}
880
881
/// vxQueryContext(VX_CONTEXT_IMMEDIATE_BORDER) wrapper
882
border_t immediateBorder() const
883
{
884
border_t v;
885
query(VX_CONTEXT_IMMEDIATE_BORDER, v);
886
return v;
887
}
888
889
/// vxQueryContext(VX_CONTEXT_IMPLEMENTATION) wrapper
890
std::string implName() const
891
{
892
std::vector<vx_char> v(VX_MAX_IMPLEMENTATION_NAME);
893
IVX_CHECK_STATUS(vxQueryContext(ref, VX_CONTEXT_IMPLEMENTATION, &v[0], v.size() * sizeof(vx_char)));
894
return std::string(v.data());
895
}
896
897
/// vxQueryContext(VX_CONTEXT_EXTENSIONS) wrapper
898
std::string extensionsStr() const
899
{
900
std::vector<vx_char> v(extensionsSize());
901
IVX_CHECK_STATUS(vxQueryContext(ref, VX_CONTEXT_EXTENSIONS, &v[0], v.size() * sizeof(vx_char)));
902
return std::string(v.data());
903
}
904
905
/// vxQueryContext(VX_CONTEXT_UNIQUE_KERNEL_TABLE) wrapper
906
std::vector<vx_kernel_info_t> kernelTable() const
907
{
908
std::vector<vx_kernel_info_t> v(uniqueKernelsNum());
909
IVX_CHECK_STATUS(vxQueryContext(ref, VX_CONTEXT_UNIQUE_KERNEL_TABLE, &v[0], v.size() * sizeof(vx_kernel_info_t)));
910
return v;
911
}
912
913
#ifdef VX_VERSION_1_1
914
/// vxQueryContext(VX_CONTEXT_IMMEDIATE_BORDER_POLICY) wrapper
915
vx_enum immediateBorderPolicy() const
916
{
917
vx_enum v;
918
query(VX_CONTEXT_IMMEDIATE_BORDER_POLICY, v);
919
return v;
920
}
921
922
/// vxQueryContext(VX_CONTEXT_NONLINEAR_MAX_DIMENSION) wrapper
923
vx_size nonlinearMaxDimension() const
924
{
925
vx_size v;
926
query(VX_CONTEXT_NONLINEAR_MAX_DIMENSION, v);
927
return v;
928
}
929
#endif
930
931
/// vxSetContextAttribute() wrapper
932
template<typename T>
933
void setAttribute(vx_enum att, const T& value)
934
{ IVX_CHECK_STATUS( vxSetContextAttribute(ref, att, &value, sizeof(value)) ); }
935
936
/// vxSetContextAttribute(BORDER) wrapper
937
void setImmediateBorder(const border_t& bm)
938
{ setAttribute(VX_CONTEXT_IMMEDIATE_BORDER, bm); }
939
940
#ifndef VX_VERSION_1_1
941
/// vxSetContextAttribute(BORDER) wrapper
942
void setImmediateBorder(vx_enum mode, vx_uint32 val = 0)
943
{ border_t bm = {mode, val}; setImmediateBorder(bm); }
944
#else
945
/// vxSetContextAttribute(BORDER) wrapper
946
void setImmediateBorder(vx_enum mode, const vx_pixel_value_t& val)
947
{ border_t bm = {mode, val}; setImmediateBorder(bm); }
948
949
/// vxSetContextAttribute(BORDER) wrapper
950
template <typename T>
951
void setImmediateBorder(vx_enum mode, const T& _val)
952
{
953
vx_pixel_value_t val;
954
switch (TypeToEnum<T>::value)
955
{
956
case VX_TYPE_UINT8:
957
val.U8 = _val;
958
break;
959
case VX_TYPE_INT16:
960
val.S16 = _val;
961
break;
962
case VX_TYPE_UINT16:
963
val.U16 = _val;
964
break;
965
case VX_TYPE_INT32:
966
val.S32 = _val;
967
break;
968
case VX_TYPE_UINT32:
969
val.U32 = _val;
970
break;
971
default:
972
throw WrapperError("Unsupported constant border value type");
973
}
974
setImmediateBorder(mode, val);
975
}
976
977
/// vxSetContextAttribute(BORDER) wrapper
978
void setImmediateBorder(vx_enum mode)
979
{ vx_pixel_value_t val = {}; setImmediateBorder(mode, val); }
980
#endif
981
};
982
983
/// vx_graph wrapper
984
class Graph : public RefWrapper<vx_graph>
985
{
986
public:
987
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Graph);
988
989
/// vxCreateGraph() wrapper
990
static Graph create(vx_context c)
991
{ return Graph(vxCreateGraph(c)); }
992
993
/// vxVerifyGraph() wrapper
994
void verify()
995
{ IVX_CHECK_STATUS( vxVerifyGraph(ref) ); }
996
997
/// vxProcessGraph() wrapper
998
void process()
999
{ IVX_CHECK_STATUS( vxProcessGraph(ref) ); }
1000
1001
/// vxScheduleGraph() wrapper
1002
void schedule()
1003
{ IVX_CHECK_STATUS(vxScheduleGraph(ref) ); }
1004
1005
/// vxWaitGraph() wrapper
1006
void wait()
1007
{ IVX_CHECK_STATUS(vxWaitGraph(ref)); }
1008
};
1009
1010
/// vx_kernel wrapper
1011
class Kernel : public RefWrapper<vx_kernel>
1012
{
1013
public:
1014
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Kernel);
1015
1016
/// vxGetKernelByEnum() wrapper
1017
static Kernel getByEnum(vx_context c, vx_enum kernelID)
1018
{ return Kernel(vxGetKernelByEnum(c, kernelID)); }
1019
1020
/// vxGetKernelByName() wrapper
1021
static Kernel getByName(vx_context c, const std::string& name)
1022
{ return Kernel(vxGetKernelByName(c, name.c_str())); }
1023
};
1024
1025
1026
/// vx_node wrapper
1027
class Node : public RefWrapper<vx_node>
1028
{
1029
public:
1030
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Node);
1031
1032
/// vxCreateGenericNode() wrapper
1033
static Node create(vx_graph g, vx_kernel k)
1034
{ return Node(vxCreateGenericNode(g, k)); }
1035
1036
/// Create node for the kernel and set the parameters
1037
static Node create(vx_graph graph, vx_kernel kernel, const std::vector<vx_reference>& params)
1038
{
1039
Node node = Node::create(graph, kernel);
1040
vx_uint32 i = 0;
1041
for (std::vector<vx_reference>::const_iterator p = params.begin(); p != params.end(); ++p)
1042
node.setParameterByIndex(i++, *p);
1043
return node;
1044
}
1045
1046
/// Create node for the kernel ID and set the parameters
1047
static Node create(vx_graph graph, vx_enum kernelID, const std::vector<vx_reference>& params)
1048
{ return Node::create(graph, Kernel::getByEnum(Context::getFrom(graph), kernelID), params); }
1049
1050
#ifdef IVX_USE_CXX98
1051
/// Create node for the kernel ID and set one parameter
1052
template<typename T0>
1053
static Node create(vx_graph g, vx_enum kernelID,
1054
const T0& arg0)
1055
{
1056
std::vector<vx_reference> params;
1057
params.push_back(castToReference(arg0));
1058
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1059
}
1060
1061
/// Create node for the kernel ID and set two parameters
1062
template<typename T0, typename T1>
1063
static Node create(vx_graph g, vx_enum kernelID,
1064
const T0& arg0, const T1& arg1)
1065
{
1066
std::vector<vx_reference> params;
1067
params.push_back(castToReference(arg0));
1068
params.push_back(castToReference(arg1));
1069
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1070
}
1071
1072
/// Create node for the kernel ID and set three parameters
1073
template<typename T0, typename T1, typename T2>
1074
static Node create(vx_graph g, vx_enum kernelID,
1075
const T0& arg0, const T1& arg1, const T2& arg2)
1076
{
1077
std::vector<vx_reference> params;
1078
params.push_back(castToReference(arg0));
1079
params.push_back(castToReference(arg1));
1080
params.push_back(castToReference(arg2));
1081
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1082
}
1083
1084
/// Create node for the kernel ID and set four parameters
1085
template<typename T0, typename T1, typename T2, typename T3>
1086
static Node create(vx_graph g, vx_enum kernelID,
1087
const T0& arg0, const T1& arg1, const T2& arg2,
1088
const T3& arg3)
1089
{
1090
std::vector<vx_reference> params;
1091
params.push_back(castToReference(arg0));
1092
params.push_back(castToReference(arg1));
1093
params.push_back(castToReference(arg2));
1094
params.push_back(castToReference(arg3));
1095
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1096
}
1097
1098
/// Create node for the kernel ID and set five parameters
1099
template<typename T0, typename T1, typename T2, typename T3, typename T4>
1100
static Node create(vx_graph g, vx_enum kernelID,
1101
const T0& arg0, const T1& arg1, const T2& arg2,
1102
const T3& arg3, const T4& arg4)
1103
{
1104
std::vector<vx_reference> params;
1105
params.push_back(castToReference(arg0));
1106
params.push_back(castToReference(arg1));
1107
params.push_back(castToReference(arg2));
1108
params.push_back(castToReference(arg3));
1109
params.push_back(castToReference(arg4));
1110
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1111
}
1112
1113
/// Create node for the kernel ID and set six parameters
1114
template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5>
1115
static Node create(vx_graph g, vx_enum kernelID,
1116
const T0& arg0, const T1& arg1, const T2& arg2,
1117
const T3& arg3, const T4& arg4, const T5& arg5)
1118
{
1119
std::vector<vx_reference> params;
1120
params.push_back(castToReference(arg0));
1121
params.push_back(castToReference(arg1));
1122
params.push_back(castToReference(arg2));
1123
params.push_back(castToReference(arg3));
1124
params.push_back(castToReference(arg4));
1125
params.push_back(castToReference(arg5));
1126
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1127
}
1128
1129
/// Create node for the kernel ID and set seven parameters
1130
template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
1131
typename T6>
1132
static Node create(vx_graph g, vx_enum kernelID,
1133
const T0& arg0, const T1& arg1, const T2& arg2,
1134
const T3& arg3, const T4& arg4, const T5& arg5,
1135
const T6& arg6)
1136
{
1137
std::vector<vx_reference> params;
1138
params.push_back(castToReference(arg0));
1139
params.push_back(castToReference(arg1));
1140
params.push_back(castToReference(arg2));
1141
params.push_back(castToReference(arg3));
1142
params.push_back(castToReference(arg4));
1143
params.push_back(castToReference(arg5));
1144
params.push_back(castToReference(arg6));
1145
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1146
}
1147
1148
/// Create node for the kernel ID and set eight parameters
1149
template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
1150
typename T6, typename T7>
1151
static Node create(vx_graph g, vx_enum kernelID,
1152
const T0& arg0, const T1& arg1, const T2& arg2,
1153
const T3& arg3, const T4& arg4, const T5& arg5,
1154
const T6& arg6, const T7& arg7)
1155
{
1156
std::vector<vx_reference> params;
1157
params.push_back(castToReference(arg0));
1158
params.push_back(castToReference(arg1));
1159
params.push_back(castToReference(arg2));
1160
params.push_back(castToReference(arg3));
1161
params.push_back(castToReference(arg4));
1162
params.push_back(castToReference(arg5));
1163
params.push_back(castToReference(arg6));
1164
params.push_back(castToReference(arg7));
1165
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1166
}
1167
1168
/// Create node for the kernel ID and set nine parameters
1169
template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
1170
typename T6, typename T7, typename T8>
1171
static Node create(vx_graph g, vx_enum kernelID,
1172
const T0& arg0, const T1& arg1, const T2& arg2,
1173
const T3& arg3, const T4& arg4, const T5& arg5,
1174
const T6& arg6, const T7& arg7, const T8& arg8)
1175
{
1176
std::vector<vx_reference> params;
1177
params.push_back(castToReference(arg0));
1178
params.push_back(castToReference(arg1));
1179
params.push_back(castToReference(arg2));
1180
params.push_back(castToReference(arg3));
1181
params.push_back(castToReference(arg4));
1182
params.push_back(castToReference(arg5));
1183
params.push_back(castToReference(arg6));
1184
params.push_back(castToReference(arg7));
1185
params.push_back(castToReference(arg8));
1186
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1187
}
1188
1189
/// Create node for the kernel ID and set ten parameters
1190
template<typename T0, typename T1, typename T2, typename T3, typename T4, typename T5,
1191
typename T6, typename T7, typename T8, typename T9>
1192
static Node create(vx_graph g, vx_enum kernelID,
1193
const T0& arg0, const T1& arg1, const T2& arg2,
1194
const T3& arg3, const T4& arg4, const T5& arg5,
1195
const T6& arg6, const T7& arg7, const T8& arg8,
1196
const T9& arg9)
1197
{
1198
std::vector<vx_reference> params;
1199
params.push_back(castToReference(arg0));
1200
params.push_back(castToReference(arg1));
1201
params.push_back(castToReference(arg2));
1202
params.push_back(castToReference(arg3));
1203
params.push_back(castToReference(arg4));
1204
params.push_back(castToReference(arg5));
1205
params.push_back(castToReference(arg6));
1206
params.push_back(castToReference(arg7));
1207
params.push_back(castToReference(arg8));
1208
params.push_back(castToReference(arg9));
1209
return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), params);
1210
}
1211
1212
#else // not IVX_USE_CXX98
1213
1214
/// Create node for the kernel ID and set the specified parameters
1215
template<typename...Ts>
1216
static Node create(vx_graph g, vx_enum kernelID, const Ts&...args)
1217
{ return create(g, Kernel::getByEnum(Context::getFrom(g), kernelID), { castToReference(args)... }); }
1218
1219
#endif // IVX_USE_CXX98
1220
1221
/// vxSetParameterByIndex() wrapper
1222
void setParameterByIndex(vx_uint32 index, vx_reference value)
1223
{ IVX_CHECK_STATUS(vxSetParameterByIndex(ref, index, value)); }
1224
1225
/// vxQueryNode() wrapper
1226
template<typename T>
1227
void query(vx_enum att, T& value) const
1228
{ IVX_CHECK_STATUS( vxQueryNode(ref, att, &value, sizeof(value)) ); }
1229
1230
#ifndef VX_VERSION_1_1
1231
static const vx_enum
1232
VX_NODE_STATUS = VX_NODE_ATTRIBUTE_STATUS,
1233
VX_NODE_PERFORMANCE = VX_NODE_ATTRIBUTE_PERFORMANCE,
1234
VX_NODE_BORDER = VX_NODE_ATTRIBUTE_BORDER_MODE,
1235
VX_NODE_LOCAL_DATA_SIZE = VX_NODE_ATTRIBUTE_LOCAL_DATA_SIZE,
1236
VX_NODE_LOCAL_DATA_PTR = VX_NODE_ATTRIBUTE_LOCAL_DATA_PTR,
1237
VX_BORDER_UNDEFINED = VX_BORDER_MODE_UNDEFINED;
1238
#endif
1239
1240
/// vxQueryNode(STATUS) wrapper
1241
vx_status status() const
1242
{
1243
vx_status v;
1244
query(VX_NODE_STATUS, v);
1245
return v;
1246
}
1247
1248
/// vxQueryNode(PERFORMANCE) wrapper
1249
vx_perf_t performance() const
1250
{
1251
vx_perf_t v;
1252
query(VX_NODE_PERFORMANCE, v);
1253
return v;
1254
}
1255
1256
/// vxQueryNode(BORDER) wrapper
1257
border_t border() const
1258
{
1259
border_t v;
1260
v.mode = VX_BORDER_UNDEFINED;
1261
query(VX_NODE_BORDER, v);
1262
return v;
1263
}
1264
1265
/// vxQueryNode(LOCAL_DATA_SIZE) wrapper
1266
vx_size dataSize() const
1267
{
1268
vx_size v;
1269
query(VX_NODE_LOCAL_DATA_SIZE, v);
1270
return v;
1271
}
1272
1273
/// vxQueryNode(LOCAL_DATA_PTR) wrapper
1274
void* dataPtr() const
1275
{
1276
void* v;
1277
query(VX_NODE_LOCAL_DATA_PTR, v);
1278
return v;
1279
}
1280
1281
#ifdef VX_VERSION_1_1
1282
/// vxQueryNode(PARAMETERS) wrapper
1283
vx_uint32 paramsNum() const
1284
{
1285
vx_uint32 v;
1286
query(VX_NODE_PARAMETERS, v);
1287
return v;
1288
}
1289
1290
/// vxQueryNode(REPLICATED) wrapper
1291
vx_bool isReplicated() const
1292
{
1293
vx_bool v;
1294
query(VX_NODE_IS_REPLICATED, v);
1295
return v;
1296
}
1297
1298
/// vxQueryNode(REPLICATE_FLAGS) wrapper
1299
void replicateFlags(std::vector<vx_bool>& flags) const
1300
{
1301
if(flags.empty()) flags.resize(paramsNum(), vx_false_e);
1302
IVX_CHECK_STATUS( vxQueryNode(ref, VX_NODE_REPLICATE_FLAGS, &flags[0], flags.size()*sizeof(flags[0])) );
1303
}
1304
1305
/// vxQueryNode(VX_NODE_VALID_RECT_RESET) wrapper
1306
vx_bool resetValidRect() const
1307
{
1308
vx_bool v;
1309
query(VX_NODE_VALID_RECT_RESET, v);
1310
return v;
1311
}
1312
#endif // VX_VERSION_1_1
1313
1314
/// vxSetNodeAttribute() wrapper
1315
template<typename T>
1316
void setAttribute(vx_enum att, const T& value)
1317
{ IVX_CHECK_STATUS( vxSetNodeAttribute(ref, att, &value, sizeof(value)) ); }
1318
1319
/// vxSetNodeAttribute(BORDER) wrapper
1320
void setBorder(const border_t& bm)
1321
{ setAttribute(VX_NODE_BORDER, bm); }
1322
1323
#ifndef VX_VERSION_1_1
1324
/// vxSetNodeAttribute(BORDER) wrapper
1325
void setBorder(vx_enum mode, vx_uint32 val = 0)
1326
{ vx_border_mode_t bm = {mode, val}; setBorder(bm); }
1327
#else
1328
/// vxSetNodeAttribute(BORDER) wrapper
1329
void setBorder(vx_enum mode, const vx_pixel_value_t& val)
1330
{ vx_border_t bm = {mode, val}; setBorder(bm); }
1331
1332
/// vxSetNodeAttribute(BORDER) wrapper
1333
template <typename T>
1334
void setBorder(vx_enum mode, const T& _val)
1335
{
1336
vx_pixel_value_t val;
1337
switch (TypeToEnum<T>::value)
1338
{
1339
case VX_TYPE_UINT8:
1340
val.U8 = _val;
1341
break;
1342
case VX_TYPE_INT16:
1343
val.S16 = _val;
1344
break;
1345
case VX_TYPE_UINT16:
1346
val.U16 = _val;
1347
break;
1348
case VX_TYPE_INT32:
1349
val.S32 = _val;
1350
break;
1351
case VX_TYPE_UINT32:
1352
val.U32 = _val;
1353
break;
1354
default:
1355
throw WrapperError("Unsupported constant border value type");
1356
}
1357
setBorder(mode, val);
1358
}
1359
1360
/// vxSetNodeAttribute(BORDER) wrapper
1361
void setBorder(vx_enum mode)
1362
{ vx_pixel_value_t val = {}; setBorder(mode, val); }
1363
#endif
1364
1365
/// vxSetNodeAttribute(LOCAL_DATA_SIZE) wrapper
1366
void setDataSize(vx_size size)
1367
{ setAttribute(VX_NODE_LOCAL_DATA_SIZE, size); }
1368
1369
/// vxSetNodeAttribute(LOCAL_DATA_PTR) wrapper
1370
void setDataPtr(void* ptr)
1371
{ setAttribute(VX_NODE_LOCAL_DATA_PTR, ptr); }
1372
};
1373
1374
1375
/// vx_image wrapper
1376
class Image : public RefWrapper<vx_image>
1377
{
1378
public:
1379
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Image);
1380
1381
/// vxCreateImage() wrapper
1382
static Image create(vx_context context, vx_uint32 width, vx_uint32 height, vx_df_image format)
1383
{ return Image(vxCreateImage(context, width, height, format)); }
1384
1385
/// vxCreateVirtualImage() wrapper
1386
static Image createVirtual(vx_graph graph, vx_uint32 width = 0, vx_uint32 height = 0, vx_df_image format = VX_DF_IMAGE_VIRT)
1387
{ return Image(vxCreateVirtualImage(graph, width, height, format)); }
1388
1389
#ifdef VX_VERSION_1_1
1390
/// vxCreateUniformImage() wrapper
1391
static Image createUniform(vx_context context, vx_uint32 width, vx_uint32 height, vx_df_image format, const vx_pixel_value_t& value)
1392
{ return Image(vxCreateUniformImage(context, width, height, format, &value)); }
1393
#else
1394
/// vxCreateUniformImage() wrapper
1395
static Image createUniform(vx_context context, vx_uint32 width, vx_uint32 height, vx_df_image format, const void* value)
1396
{ return Image(vxCreateUniformImage(context, width, height, format, value)); }
1397
#endif
1398
template <typename T>
1399
static Image createUniform(vx_context context, vx_uint32 width, vx_uint32 height, vx_df_image format, const T value)
1400
{
1401
#if VX_VERSION > VX_VERSION_1_0
1402
vx_pixel_value_t pixel;
1403
switch (format)
1404
{
1405
case VX_DF_IMAGE_U8:pixel.U8 = (vx_uint8)value; break;
1406
case VX_DF_IMAGE_S16:pixel.S16 = (vx_int16)value; break;
1407
case VX_DF_IMAGE_U16:pixel.U16 = (vx_uint16)value; break;
1408
case VX_DF_IMAGE_S32:pixel.S32 = (vx_int32)value; break;
1409
case VX_DF_IMAGE_U32:pixel.U32 = (vx_uint32)value; break;
1410
default:throw ivx::WrapperError("uniform image type unsupported by this call");
1411
}
1412
return Image(vxCreateUniformImage(context, width, height, format, &pixel));
1413
#else
1414
return Image(vxCreateUniformImage(context, width, height, format, &value));
1415
#endif
1416
}
1417
1418
/// Planes number for the specified image format (fourcc)
1419
/// \return 0 for unknown formats
1420
static vx_size planes(vx_df_image format)
1421
{
1422
switch (format)
1423
{
1424
case VX_DF_IMAGE_IYUV:
1425
case VX_DF_IMAGE_YUV4: return 3;
1426
case VX_DF_IMAGE_NV12:
1427
case VX_DF_IMAGE_NV21: return 2;
1428
case VX_DF_IMAGE_RGB:
1429
case VX_DF_IMAGE_RGBX:
1430
case VX_DF_IMAGE_UYVY:
1431
case VX_DF_IMAGE_YUYV:
1432
case VX_DF_IMAGE_U8:
1433
case VX_DF_IMAGE_U16:
1434
case VX_DF_IMAGE_S16:
1435
case VX_DF_IMAGE_U32:
1436
case VX_DF_IMAGE_S32:
1437
case /*VX_DF_IMAGE_F32*/VX_DF_IMAGE('F', '0', '3', '2'):
1438
return 1;
1439
default: return 0;
1440
}
1441
}
1442
1443
/// Create vx_imagepatch_addressing_t structure with default values
1444
static vx_imagepatch_addressing_t createAddressing()
1445
{ vx_imagepatch_addressing_t ipa = VX_IMAGEPATCH_ADDR_INIT; return ipa; }
1446
1447
/// Create vx_imagepatch_addressing_t structure with the provided values
1448
static vx_imagepatch_addressing_t createAddressing(
1449
vx_uint32 dimX, vx_uint32 dimY,
1450
vx_int32 strideX, vx_int32 strideY,
1451
vx_uint32 scaleX = VX_SCALE_UNITY, vx_uint32 scaleY = VX_SCALE_UNITY )
1452
{
1453
if (std::abs(strideY) < std::abs(strideX*(vx_int32)dimX))
1454
throw WrapperError(std::string(__func__)+"(): invalid arguments");
1455
vx_imagepatch_addressing_t ipa = VX_IMAGEPATCH_ADDR_INIT;
1456
ipa.dim_x = dimX;
1457
ipa.dim_y = dimY;
1458
ipa.stride_x = strideX;
1459
ipa.stride_y = strideY;
1460
ipa.scale_x = scaleX;
1461
ipa.scale_y = scaleY;
1462
return ipa;
1463
}
1464
1465
/// Create vx_imagepatch_addressing_t structure for the specified image plane and its valid region
1466
vx_imagepatch_addressing_t createAddressing(vx_uint32 planeIdx)
1467
{ return createAddressing(planeIdx, getValidRegion()); }
1468
1469
/// Create vx_imagepatch_addressing_t structure for the specified image plane and the provided region
1470
vx_imagepatch_addressing_t createAddressing(vx_uint32 planeIdx, const vx_rectangle_t& rect)
1471
{
1472
vx_uint32 w = rect.end_x-rect.start_x, h = rect.end_y-rect.start_y;
1473
vx_size patchBytes = computePatchSize(planeIdx, rect);
1474
vx_imagepatch_addressing_t ipa = createAddressing(w, h, (vx_int32)(patchBytes/w/h), (vx_int32)(patchBytes/h));
1475
return ipa;
1476
}
1477
1478
#ifndef VX_VERSION_1_1
1479
static const vx_enum VX_MEMORY_TYPE_HOST = VX_IMPORT_TYPE_HOST;
1480
#endif
1481
/// vxCreateImageFromHandle() wrapper
1482
static Image createFromHandle(
1483
vx_context context, vx_df_image format,
1484
const std::vector<vx_imagepatch_addressing_t>& addrs,
1485
const std::vector<void*>& ptrs, vx_enum memType = VX_MEMORY_TYPE_HOST )
1486
{
1487
vx_size num = planes(format);
1488
if(num == 0)
1489
throw WrapperError(std::string(__func__)+"(): unknown/unexpected planes number for the requested format");
1490
if (addrs.size() != num || ptrs.size() != num)
1491
throw WrapperError(std::string(__func__)+"(): incomplete input");
1492
#ifdef VX_VERSION_1_1
1493
return Image(vxCreateImageFromHandle(context, format, &addrs[0], &ptrs[0], memType));
1494
#else
1495
return Image( vxCreateImageFromHandle(context, format,
1496
const_cast<vx_imagepatch_addressing_t*>(&addrs[0]),
1497
const_cast<void**>(&ptrs[0]), memType) );
1498
#endif
1499
}
1500
1501
/// vxCreateImageFromHandle() wrapper for a single plane image
1502
static Image createFromHandle(vx_context context, vx_df_image format,const vx_imagepatch_addressing_t& addr, void* ptr)
1503
{
1504
if(planes(format) != 1) throw WrapperError(std::string(__func__)+"(): not a single plane format");
1505
return Image(vxCreateImageFromHandle(context, format, const_cast<vx_imagepatch_addressing_t*> (&addr), &ptr, VX_MEMORY_TYPE_HOST));
1506
}
1507
1508
#ifdef VX_VERSION_1_1
1509
/// vxSwapImageHandle() wrapper
1510
/// \param newPtrs keeps addresses of new image planes data, can be of image planes size or empty when new pointers are not provided
1511
/// \param prevPtrs storage for the previous addresses of image planes data, can be of image planes size or empty when previous pointers are not needed
1512
void swapHandle(const std::vector<void*>& newPtrs, std::vector<void*>& prevPtrs)
1513
{
1514
vx_size num = planes();
1515
if(num == 0)
1516
throw WrapperError(std::string(__func__)+"(): unexpected planes number");
1517
if (!newPtrs.empty() && newPtrs.size() != num)
1518
throw WrapperError(std::string(__func__)+"(): unexpected number of input pointers");
1519
if (!prevPtrs.empty() && prevPtrs.size() != num)
1520
throw WrapperError(std::string(__func__)+"(): unexpected number of output pointers");
1521
IVX_CHECK_STATUS( vxSwapImageHandle( ref,
1522
newPtrs.empty() ? 0 : &newPtrs[0],
1523
prevPtrs.empty() ? 0 : &prevPtrs[0],
1524
num ) );
1525
}
1526
1527
/// vxSwapImageHandle() wrapper for a single plane image
1528
/// \param newPtr an address of new image data, can be zero when new pointer is not provided
1529
/// \return the previuos address of image data
1530
void* swapHandle(void* newPtr)
1531
{
1532
if(planes() != 1) throw WrapperError(std::string(__func__)+"(): not a single plane image");
1533
void* prevPtr = 0;
1534
IVX_CHECK_STATUS( vxSwapImageHandle(ref, &newPtr, &prevPtr, 1) );
1535
return prevPtr;
1536
}
1537
1538
/// vxSwapImageHandle() wrapper for the case when no new pointers provided and previous ones are not needed (retrive memory back)
1539
void swapHandle()
1540
{ IVX_CHECK_STATUS( vxSwapImageHandle(ref, 0, 0, 0) ); }
1541
1542
/// vxCreateImageFromChannel() wrapper
1543
Image createFromChannel(vx_enum channel)
1544
{ return Image(vxCreateImageFromChannel(ref, channel)); }
1545
#endif // VX_VERSION_1_1
1546
1547
/// vxQueryImage() wrapper
1548
template<typename T>
1549
void query(vx_enum att, T& value) const
1550
{ IVX_CHECK_STATUS( vxQueryImage(ref, att, &value, sizeof(value)) ); }
1551
1552
#ifndef VX_VERSION_1_1
1553
static const vx_enum
1554
VX_IMAGE_WIDTH = VX_IMAGE_ATTRIBUTE_WIDTH,
1555
VX_IMAGE_HEIGHT = VX_IMAGE_ATTRIBUTE_HEIGHT,
1556
VX_IMAGE_FORMAT = VX_IMAGE_ATTRIBUTE_FORMAT,
1557
VX_IMAGE_PLANES = VX_IMAGE_ATTRIBUTE_PLANES,
1558
VX_IMAGE_SPACE = VX_IMAGE_ATTRIBUTE_SPACE,
1559
VX_IMAGE_RANGE = VX_IMAGE_ATTRIBUTE_RANGE,
1560
VX_IMAGE_SIZE = VX_IMAGE_ATTRIBUTE_SIZE;
1561
#endif
1562
1563
/// vxQueryImage(VX_IMAGE_WIDTH) wrapper
1564
vx_uint32 width() const
1565
{
1566
vx_uint32 v;
1567
query(VX_IMAGE_WIDTH, v);
1568
return v;
1569
}
1570
1571
/// vxQueryImage(VX_IMAGE_HEIGHT) wrapper
1572
vx_uint32 height() const
1573
{
1574
vx_uint32 v;
1575
query(VX_IMAGE_HEIGHT, v);
1576
return v;
1577
}
1578
1579
/// vxQueryImage(VX_IMAGE_FORMAT) wrapper
1580
vx_df_image format() const
1581
{
1582
vx_df_image v;
1583
query(VX_IMAGE_FORMAT, v);
1584
return v;
1585
}
1586
1587
/// vxQueryImage(VX_IMAGE_PLANES) wrapper
1588
vx_size planes() const
1589
{
1590
vx_size v;
1591
query(VX_IMAGE_PLANES, v);
1592
return v;
1593
}
1594
1595
/// vxQueryImage(VX_IMAGE_SPACE) wrapper
1596
vx_enum space() const
1597
{
1598
vx_enum v;
1599
query(VX_IMAGE_SPACE, v);
1600
return v;
1601
}
1602
1603
/// vxQueryImage(VX_IMAGE_RANGE) wrapper
1604
vx_enum range() const
1605
{
1606
vx_enum v;
1607
query(VX_IMAGE_RANGE, v);
1608
return v;
1609
}
1610
1611
/// vxQueryImage(VX_IMAGE_SIZE) wrapper
1612
vx_size size() const
1613
{
1614
vx_size v;
1615
query(VX_IMAGE_SIZE, v);
1616
return v;
1617
}
1618
1619
#ifdef VX_VERSION_1_1
1620
/// vxQueryImage(VX_IMAGE_MEMORY_TYPE) wrapper
1621
vx_memory_type_e memType() const
1622
{
1623
vx_memory_type_e v;
1624
query(VX_IMAGE_MEMORY_TYPE, v);
1625
return v;
1626
}
1627
#endif // VX_VERSION_1_1
1628
1629
/// vxSetImageAttribute() wrapper
1630
template<typename T>
1631
void setAttribute(vx_enum att, T& value) const
1632
{ IVX_CHECK_STATUS(vxSetImageAttribute(ref, att, &value, sizeof(value))); }
1633
1634
/// vxSetImageAttribute(SPACE) wrapper
1635
void setColorSpace(const vx_enum& sp)
1636
{ setAttribute(VX_IMAGE_SPACE, sp); }
1637
1638
/// vxGetValidRegionImage() wrapper
1639
vx_rectangle_t getValidRegion() const
1640
{
1641
vx_rectangle_t rect;
1642
IVX_CHECK_STATUS( vxGetValidRegionImage(ref, &rect) );
1643
return rect;
1644
}
1645
1646
/// vxComputeImagePatchSize(valid region) wrapper
1647
vx_size computePatchSize(vx_uint32 planeIdx)
1648
{ return computePatchSize(planeIdx, getValidRegion()); }
1649
1650
/// vxComputeImagePatchSize() wrapper
1651
vx_size computePatchSize(vx_uint32 planeIdx, const vx_rectangle_t& rect)
1652
{
1653
vx_size bytes = vxComputeImagePatchSize(ref, &rect, planeIdx);
1654
if (bytes == 0) throw WrapperError(std::string(__func__)+"(): vxComputeImagePatchSize returned 0");
1655
return bytes;
1656
}
1657
1658
#ifdef VX_VERSION_1_1
1659
/// vxSetImageValidRectangle() wrapper
1660
void setValidRectangle(const vx_rectangle_t& rect)
1661
{ IVX_CHECK_STATUS( vxSetImageValidRectangle(ref, &rect) ); }
1662
#endif // VX_VERSION_1_1
1663
1664
/// Copy image plane content to the provided memory
1665
void copyTo(vx_uint32 planeIdx, const vx_imagepatch_addressing_t& addr, void* data)
1666
{
1667
if(!data) throw WrapperError(std::string(__func__)+"(): output pointer is 0");
1668
vx_rectangle_t r = getValidRegion();
1669
// TODO: add sizes consistency checks
1670
/*
1671
vx_uint32 w = r.end_x - r.start_x, h = r.end_y - r.start_y;
1672
if (w != addr.dim_x) throw WrapperError("Image::copyTo(): inconsistent dimension X");
1673
if (h != addr.dim_y) throw WrapperError("Image::copyTo(): inconsistent dimension Y");
1674
*/
1675
#ifdef VX_VERSION_1_1
1676
IVX_CHECK_STATUS(vxCopyImagePatch(ref, &r, planeIdx, &addr, data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
1677
#else
1678
vx_imagepatch_addressing_t* a = const_cast<vx_imagepatch_addressing_t*>(&addr);
1679
IVX_CHECK_STATUS(vxAccessImagePatch(ref, &r, planeIdx, a, &data, VX_READ_ONLY));
1680
IVX_CHECK_STATUS(vxCommitImagePatch(ref, 0, planeIdx, a, data));
1681
#endif
1682
}
1683
1684
/// Copy the provided memory data to the specified image plane
1685
void copyFrom(vx_uint32 planeIdx, const vx_imagepatch_addressing_t& addr, const void* data)
1686
{
1687
if (!data) throw WrapperError(std::string(__func__)+"(): input pointer is 0");
1688
vx_rectangle_t r = getValidRegion();
1689
// TODO: add sizes consistency checks
1690
/*
1691
vx_uint32 w = r.end_x - r.start_x, h = r.end_y - r.start_y;
1692
//vx_size patchBytes = vxComputeImagePatchSize(ref, &r, planeIdx);
1693
if (w != addr.dim_x) throw WrapperError("Image::copyFrom(): inconsistent dimension X");
1694
if (h != addr.dim_y) throw WrapperError("Image::copyFrom(): inconsistent dimension Y");
1695
*/
1696
#ifdef VX_VERSION_1_1
1697
IVX_CHECK_STATUS(vxCopyImagePatch(ref, &r, planeIdx, &addr, (void*)data, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
1698
#else
1699
vx_imagepatch_addressing_t* a = const_cast<vx_imagepatch_addressing_t*>(&addr);
1700
IVX_CHECK_STATUS(vxAccessImagePatch(ref, &r, planeIdx, a, const_cast<void**>(&data), VX_WRITE_ONLY));
1701
IVX_CHECK_STATUS(vxCommitImagePatch(ref, &r, planeIdx, a, data));
1702
#endif
1703
}
1704
1705
/// vxCopyImagePatch() wrapper (or vxAccessImagePatch() + vxCommitImagePatch() for OpenVX 1.0)
1706
void copy( vx_uint32 planeIdx, vx_rectangle_t rect,
1707
const vx_imagepatch_addressing_t& addr, void* data,
1708
vx_enum usage, vx_enum memoryType = VX_MEMORY_TYPE_HOST )
1709
{
1710
#ifdef VX_VERSION_1_1
1711
IVX_CHECK_STATUS(vxCopyImagePatch(ref, &rect, planeIdx, &addr, (void*)data, usage, memoryType));
1712
#else
1713
(void)memoryType;
1714
vx_imagepatch_addressing_t* a = const_cast<vx_imagepatch_addressing_t*>(&addr);
1715
IVX_CHECK_STATUS(vxAccessImagePatch(ref, &rect, planeIdx, a, &data, usage));
1716
IVX_CHECK_STATUS(vxCommitImagePatch(ref, &rect, planeIdx, a, data));
1717
#endif
1718
}
1719
1720
#ifdef IVX_USE_OPENCV
1721
/// Convert image format (fourcc) to cv::Mat type
1722
/// \return CV_USRTYPE1 for unknown image formats
1723
static int formatToMatType(vx_df_image format, vx_uint32 planeIdx = 0)
1724
{
1725
switch (format)
1726
{
1727
case VX_DF_IMAGE_RGB: return CV_8UC3;
1728
case VX_DF_IMAGE_RGBX: return CV_8UC4;
1729
case VX_DF_IMAGE_U8: return CV_8UC1;
1730
case VX_DF_IMAGE_U16: return CV_16UC1;
1731
case VX_DF_IMAGE_S16: return CV_16SC1;
1732
case VX_DF_IMAGE_U32:
1733
case VX_DF_IMAGE_S32: return CV_32SC1;
1734
case VX_DF_IMAGE('F', '0', '3', '2'):
1735
return CV_32FC1;
1736
case VX_DF_IMAGE_YUV4:
1737
case VX_DF_IMAGE_IYUV: return CV_8UC1;
1738
case VX_DF_IMAGE_UYVY:
1739
case VX_DF_IMAGE_YUYV: return CV_8UC2;
1740
case VX_DF_IMAGE_NV12:
1741
case VX_DF_IMAGE_NV21: return planeIdx == 0 ? CV_8UC1 : CV_8UC2;
1742
default: return CV_USRTYPE1;
1743
}
1744
}
1745
1746
/// Convert cv::Mat type to standard image format (fourcc), throws WrapperError if not possible
1747
static vx_df_image matTypeToFormat(int matType)
1748
{
1749
switch (matType)
1750
{
1751
case CV_8UC4: return VX_DF_IMAGE_RGBX;
1752
case CV_8UC3: return VX_DF_IMAGE_RGB;
1753
case CV_8UC1: return VX_DF_IMAGE_U8;
1754
case CV_16UC1: return VX_DF_IMAGE_U16;
1755
case CV_16SC1: return VX_DF_IMAGE_S16;
1756
case CV_32SC1: return VX_DF_IMAGE_S32;
1757
case CV_32FC1: return VX_DF_IMAGE('F', '0', '3', '2');
1758
default: throw WrapperError(std::string(__func__)+"(): unsupported cv::Mat type");
1759
}
1760
}
1761
1762
/// Initialize cv::Mat shape to fit the specified image plane data
1763
void createMatForPlane(cv::Mat& m, vx_uint32 planeIdx)
1764
{
1765
vx_df_image f = format();
1766
//vx_uint32 w = width(), h = height();
1767
vx_rectangle_t r = getValidRegion();
1768
vx_int32 w = vx_int32(r.end_x - r.start_x), h = vx_int32(r.end_y - r.start_y);
1769
switch (f)
1770
{
1771
case VX_DF_IMAGE_IYUV:
1772
if (planeIdx == 0u) m.create(h, w, formatToMatType(f));
1773
else if (planeIdx == 1u || planeIdx == 2u) m.create(h/2, w/2, formatToMatType(f));
1774
else throw WrapperError(std::string(__func__)+"(): wrong plane index");
1775
break;
1776
case VX_DF_IMAGE_YUV4:
1777
if (planeIdx == 0u || planeIdx == 1u || planeIdx == 2u) m.create(h, w, formatToMatType(f));
1778
else throw WrapperError(std::string(__func__)+"(): wrong plane index");
1779
break;
1780
case VX_DF_IMAGE_NV12:
1781
case VX_DF_IMAGE_NV21:
1782
if (planeIdx == 0u) m.create(h, w, formatToMatType(f, 0));
1783
else if (planeIdx == 1u) m.create(h/2, w/2, formatToMatType(f, 1));
1784
else throw WrapperError(std::string(__func__)+"(): wrong plane index");
1785
break;
1786
case VX_DF_IMAGE_RGB:
1787
case VX_DF_IMAGE_RGBX:
1788
case VX_DF_IMAGE_UYVY:
1789
case VX_DF_IMAGE_YUYV:
1790
case VX_DF_IMAGE_U8:
1791
case VX_DF_IMAGE_U16:
1792
case VX_DF_IMAGE_S16:
1793
case VX_DF_IMAGE_U32:
1794
case VX_DF_IMAGE_S32:
1795
case /*VX_DF_IMAGE_F32*/VX_DF_IMAGE('F', '0', '3', '2'):
1796
if(planeIdx == 0u) m.create(h, w, formatToMatType(f));
1797
else throw WrapperError(std::string(__func__)+"(): wrong plane index");
1798
break;
1799
default: throw WrapperError(std::string(__func__)+"(): unsupported color format");
1800
}
1801
}
1802
1803
/// Create vx_imagepatch_addressing_t corresponding to the provided cv::Mat
1804
static vx_imagepatch_addressing_t createAddressing(const cv::Mat& m)
1805
{
1806
if(m.empty()) throw WrapperError(std::string(__func__)+"(): empty input Mat");
1807
return createAddressing((vx_uint32)m.cols, (vx_uint32)m.rows, (vx_int32)m.elemSize(), (vx_int32)m.step);
1808
}
1809
1810
/// Copy image plane content to the provided cv::Mat (reallocate if needed)
1811
void copyTo(vx_uint32 planeIdx, cv::Mat& m)
1812
{
1813
createMatForPlane(m, planeIdx);
1814
copyTo(planeIdx, createAddressing((vx_uint32)m.cols, (vx_uint32)m.rows, (vx_int32)m.elemSize(), (vx_int32)m.step), m.ptr());
1815
}
1816
1817
/// Copy the provided cv::Mat data to the specified image plane
1818
void copyFrom(vx_uint32 planeIdx, const cv::Mat& m)
1819
{
1820
if(m.empty()) throw WrapperError(std::string(__func__)+"(): empty input Mat");
1821
// TODO: add sizes consistency checks
1822
//vx_rectangle_t r = getValidRegion();
1823
copyFrom(planeIdx, createAddressing((vx_uint32)m.cols, (vx_uint32)m.rows, (vx_int32)m.elemSize(), (vx_int32)m.step), m.ptr());
1824
}
1825
1826
/*
1827
private:
1828
cv::Mat _mat; // TODO: update copy/move-c-tors, operator=() and swapHandles()
1829
public:
1830
static Image createFromHandle(vx_context context, const cv::Mat& mat)
1831
{
1832
if(mat.empty()) throw WrapperError(std::string(__func__)+"(): empty cv::Mat");
1833
Image res = createFromHandle(context, matTypeToFormat(mat.type()), createAddressing(mat), mat.data );
1834
res._mat = mat;
1835
return res;
1836
}
1837
*/
1838
#endif //IVX_USE_OPENCV
1839
1840
struct Patch;
1841
};
1842
1843
/// Helper class for a mapping vx_image patch
1844
struct Image::Patch
1845
{
1846
public:
1847
/// reference to the current vx_imagepatch_addressing_t
1848
const vx_imagepatch_addressing_t& addr() const
1849
{ return _addr;}
1850
1851
/// current pixels data pointer
1852
void* data() const
1853
{ return _data; }
1854
1855
#ifdef VX_VERSION_1_1
1856
/// vx_memory_type_e for the current data pointer
1857
vx_memory_type_e memType() const
1858
{ return _memType; }
1859
1860
/// vx_map_id for the current mapping
1861
vx_map_id mapId() const
1862
{ return _mapId; }
1863
#else
1864
/// reference to vx_rectangle_t for the current mapping
1865
const vx_rectangle_t& rectangle() const
1866
{ return _rect; }
1867
1868
/// Image plane index for the current mapping
1869
vx_uint32 planeIndex() const
1870
{ return _planeIdx; }
1871
#endif // VX_VERSION_1_1
1872
1873
/// vx_image for the current mapping
1874
vx_image image() const
1875
{ return _img; }
1876
1877
/// where this patch is mapped
1878
bool isMapped() const
1879
{ return _img != 0; }
1880
1881
#ifdef IVX_USE_OPENCV
1882
/// Reference to cv::Mat instance wrapping the mapped image data, becomes invalid after unmap()
1883
cv::Mat& getMat()
1884
{ return _m; }
1885
#endif //IVX_USE_OPENCV
1886
1887
protected:
1888
vx_imagepatch_addressing_t _addr;
1889
void* _data;
1890
vx_image _img;
1891
#ifdef VX_VERSION_1_1
1892
vx_memory_type_e _memType;
1893
vx_map_id _mapId;
1894
#else
1895
vx_rectangle_t _rect;
1896
vx_uint32 _planeIdx;
1897
#endif
1898
#ifdef IVX_USE_OPENCV
1899
cv::Mat _m;
1900
#endif
1901
1902
public:
1903
/// Default constructor
1904
Patch() : _addr(createAddressing()), _data(0), _img(0)
1905
#ifdef VX_VERSION_1_1
1906
, _memType(VX_MEMORY_TYPE_HOST), _mapId(0)
1907
{}
1908
#else
1909
, _planeIdx(-1)
1910
{ _rect.start_x = _rect.end_x = _rect.start_y = _rect.end_y = 0u; }
1911
#endif
1912
1913
#ifndef IVX_USE_CXX98
1914
/// Move constructor
1915
Patch(Patch&& p) : Patch()
1916
{
1917
using std::swap;
1918
swap(_addr, p._addr);
1919
swap(_data, p._data);
1920
#ifdef VX_VERSION_1_1
1921
swap(_memType, p._memType);
1922
swap(_mapId, p._mapId);
1923
#else
1924
swap(_rect, p._rect);
1925
swap(_planeIdx, p._planeIdx);
1926
#endif
1927
swap(_img, p._img);
1928
#ifdef IVX_USE_OPENCV
1929
swap(_m, p._m);
1930
#endif
1931
}
1932
#endif
1933
1934
/// vxMapImagePatch(VX_READ_ONLY, planeIdx valid region)
1935
void map(vx_image img, vx_uint32 planeIdx)
1936
{ map(img, planeIdx, Image(img, true).getValidRegion()); }
1937
1938
/// vxMapImagePatch() wrapper (or vxAccessImagePatch() for 1.0)
1939
void map(vx_image img, vx_uint32 planeIdx, const vx_rectangle_t& rect, vx_enum usage = VX_READ_ONLY, vx_uint32 flags = 0)
1940
{
1941
if (isMapped()) throw WrapperError(std::string(__func__)+"(): already mapped");
1942
#ifdef VX_VERSION_1_1
1943
IVX_CHECK_STATUS(vxMapImagePatch(img, &rect, planeIdx, &_mapId, &_addr, &_data, usage, _memType, flags) );
1944
#else
1945
IVX_CHECK_STATUS(vxAccessImagePatch(img, &rect, planeIdx, &_addr, &_data, usage));
1946
(void)flags;
1947
_rect = rect;
1948
_planeIdx = planeIdx;
1949
#endif
1950
if (_data == 0) throw WrapperError(std::string(__func__)+"(): mapped address is null");
1951
_img = img;
1952
#ifdef IVX_USE_OPENCV
1953
vx_df_image format;
1954
IVX_CHECK_STATUS( vxQueryImage(_img, VX_IMAGE_FORMAT, &format, sizeof(format)) );
1955
int matType = formatToMatType(format);
1956
_m = cv::Mat( vx_int32((vx_int64)_addr.dim_y * VX_SCALE_UNITY / _addr.scale_y),
1957
vx_int32((vx_int64)_addr.dim_x * VX_SCALE_UNITY / _addr.scale_x),
1958
matType, _data, std::size_t(_addr.stride_y) );
1959
#endif
1960
}
1961
1962
/// vxUnmapImagePatch() wrapper (or vxCommitImagePatch() for 1.0)
1963
void unmap()
1964
{
1965
#ifdef VX_VERSION_1_1
1966
IVX_CHECK_STATUS(vxUnmapImagePatch(_img, _mapId));
1967
_mapId = 0;
1968
#else
1969
IVX_CHECK_STATUS(vxCommitImagePatch(_img, &_rect, _planeIdx, &_addr, _data));
1970
_rect.start_x = _rect.end_x = _rect.start_y = _rect.end_y = 0u;
1971
_planeIdx = -1;
1972
1973
#endif
1974
_img = 0;
1975
_data = 0;
1976
_addr = createAddressing();
1977
#ifdef IVX_USE_OPENCV
1978
_m.release();
1979
#endif
1980
}
1981
1982
/// Destructor
1983
~Patch()
1984
{ try { if (_img) unmap(); } catch(...) {; /*ignore*/} }
1985
1986
/// Pointer to the specified pixel data (vxFormatImagePatchAddress2d)
1987
void* pixelPtr(vx_uint32 x, vx_uint32 y)
1988
{
1989
if (!_data) throw WrapperError(std::string(__func__)+"(): base pointer is NULL");
1990
if (x >= _addr.dim_x) throw WrapperError(std::string(__func__)+"(): X out of range");
1991
if (y >= _addr.dim_y) throw WrapperError(std::string(__func__)+"(): Y out of range");
1992
return vxFormatImagePatchAddress2d(_data, x, y, &_addr);
1993
}
1994
1995
private:
1996
Patch(const Patch& p); // = delete
1997
Patch& operator=(const Patch&); // = delete
1998
#ifndef IVX_USE_CXX98
1999
Patch& operator=(Patch&&); // = delete
2000
#endif
2001
};
2002
2003
/// vx_parameter wrapper
2004
class Param : public RefWrapper<vx_parameter>
2005
{
2006
public:
2007
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Param);
2008
// NYI
2009
};
2010
2011
/// vx_scalar wrapper
2012
class Scalar : public RefWrapper<vx_scalar>
2013
{
2014
public:
2015
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Scalar);
2016
2017
/// vxCreateScalar() wrapper
2018
static Scalar create(vx_context c, vx_enum dataType, const void *ptr)
2019
{ return Scalar( vxCreateScalar(c, dataType, ptr) ); }
2020
2021
/// vxCreateScalar() wrapper, value is passed as a value not as a pointer
2022
template<typename T> static Scalar create(vx_context c, vx_enum dataType, T value)
2023
{
2024
typedef int static_assert_not_pointer[is_pointer<T>::value ? -1 : 1];
2025
return Scalar( vxCreateScalar(c, dataType, &value) );
2026
}
2027
2028
/// vxCreateScalar() wrapper, data type is guessed based on the passed value
2029
template<vx_enum E> static Scalar create(vx_context c, typename EnumToType<E>::type value)
2030
{ return Scalar( vxCreateScalar(c, E, &value) ); }
2031
2032
#ifndef VX_VERSION_1_1
2033
static const vx_enum VX_SCALAR_TYPE = VX_SCALAR_ATTRIBUTE_TYPE;
2034
#endif
2035
/// Get scalar data type
2036
vx_enum type()
2037
{
2038
vx_enum val;
2039
IVX_CHECK_STATUS( vxQueryScalar(ref, VX_SCALAR_TYPE, &val, sizeof(val)) );
2040
return val;
2041
}
2042
2043
/// Get scalar value
2044
template<typename T>
2045
void getValue(T& val)
2046
{
2047
if (!areTypesCompatible(TypeToEnum<T>::value, type()))
2048
throw WrapperError(std::string(__func__)+"(): incompatible types");
2049
#ifdef VX_VERSION_1_1
2050
IVX_CHECK_STATUS( vxCopyScalar(ref, &val, VX_READ_ONLY, VX_MEMORY_TYPE_HOST) );
2051
#else
2052
IVX_CHECK_STATUS( vxReadScalarValue(ref, &val) );
2053
#endif
2054
}
2055
2056
/// Get scalar value
2057
template<typename T>
2058
T getValue()
2059
{
2060
T val;
2061
getValue(val);
2062
return val;
2063
}
2064
2065
2066
/// Set scalar value
2067
template<typename T>
2068
void setValue(T val)
2069
{
2070
if (!areTypesCompatible(TypeToEnum<T>::value, type()))
2071
throw WrapperError(std::string(__func__)+"(): incompatible types");
2072
#ifdef VX_VERSION_1_1
2073
IVX_CHECK_STATUS(vxCopyScalar(ref, &val, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
2074
#else
2075
IVX_CHECK_STATUS( vxWriteScalarValue(ref, &val) );
2076
#endif
2077
}
2078
};
2079
2080
/// vx_threshold wrapper
2081
class Threshold : public RefWrapper<vx_threshold>
2082
{
2083
public:
2084
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Threshold);
2085
2086
/// vxCreateThreshold() wrapper
2087
static Threshold create(vx_context c, vx_enum threshType, vx_enum dataType)
2088
{ return Threshold(vxCreateThreshold(c, threshType, dataType)); }
2089
2090
#ifndef VX_VERSION_1_1
2091
static const vx_enum
2092
VX_THRESHOLD_TYPE = VX_THRESHOLD_ATTRIBUTE_TYPE,
2093
VX_THRESHOLD_THRESHOLD_VALUE = VX_THRESHOLD_ATTRIBUTE_THRESHOLD_VALUE,
2094
VX_THRESHOLD_THRESHOLD_LOWER = VX_THRESHOLD_ATTRIBUTE_THRESHOLD_LOWER,
2095
VX_THRESHOLD_THRESHOLD_UPPER = VX_THRESHOLD_ATTRIBUTE_THRESHOLD_UPPER,
2096
VX_THRESHOLD_TRUE_VALUE = VX_THRESHOLD_ATTRIBUTE_TRUE_VALUE,
2097
VX_THRESHOLD_FALSE_VALUE = VX_THRESHOLD_ATTRIBUTE_FALSE_VALUE,
2098
VX_THRESHOLD_DATA_TYPE = VX_THRESHOLD_ATTRIBUTE_DATA_TYPE;
2099
#endif
2100
2101
2102
/// Create binary threshold with the provided value
2103
static Threshold createBinary(vx_context c, vx_enum dataType, vx_int32 val)
2104
{
2105
Threshold thr = create(c, VX_THRESHOLD_TYPE_BINARY, dataType);
2106
IVX_CHECK_STATUS( vxSetThresholdAttribute(thr.ref, VX_THRESHOLD_THRESHOLD_VALUE, &val, sizeof(val)) );
2107
return thr;
2108
}
2109
2110
/// Create range threshold with the provided low and high values
2111
static Threshold createRange(vx_context c, vx_enum dataType, vx_int32 valLower, vx_int32 valUpper)
2112
{
2113
Threshold thr = create(c, VX_THRESHOLD_TYPE_RANGE, dataType);
2114
IVX_CHECK_STATUS( vxSetThresholdAttribute(thr.ref, VX_THRESHOLD_THRESHOLD_LOWER, &valLower, sizeof(valLower)) );
2115
IVX_CHECK_STATUS( vxSetThresholdAttribute(thr.ref, VX_THRESHOLD_THRESHOLD_UPPER, &valUpper, sizeof(valUpper)) );
2116
return thr;
2117
}
2118
2119
/// vxQueryThreshold() wrapper
2120
template<typename T>
2121
void query(vx_enum att, T& val) const
2122
{ IVX_CHECK_STATUS( vxQueryThreshold(ref, att, &val, sizeof(val)) ); }
2123
2124
/// vxQueryThreshold(VX_THRESHOLD_TYPE) wrapper
2125
vx_enum type() const
2126
{
2127
vx_enum v;
2128
query(VX_THRESHOLD_TYPE, v);
2129
return v;
2130
}
2131
2132
/// vxQueryThreshold(DATA_TYPE) wrapper
2133
vx_enum dataType() const
2134
{
2135
vx_enum v;
2136
query(VX_THRESHOLD_DATA_TYPE, v);
2137
return v;
2138
}
2139
2140
/// vxQueryThreshold(THRESHOLD_VALUE) wrapper
2141
vx_int32 value() const
2142
{
2143
vx_int32 v;
2144
query(VX_THRESHOLD_THRESHOLD_VALUE, v);
2145
return v;
2146
}
2147
2148
/// vxQueryThreshold(THRESHOLD_LOWER) wrapper
2149
vx_int32 valueLower() const
2150
{
2151
vx_int32 v;
2152
query(VX_THRESHOLD_THRESHOLD_LOWER, v);
2153
return v;
2154
}
2155
2156
/// vxQueryThreshold(THRESHOLD_UPPER) wrapper
2157
vx_int32 valueUpper() const
2158
{
2159
vx_int32 v;
2160
query(VX_THRESHOLD_THRESHOLD_UPPER, v);
2161
return v;
2162
}
2163
2164
/// vxQueryThreshold(TRUE_VALUE) wrapper
2165
vx_int32 valueTrue() const
2166
{
2167
vx_int32 v;
2168
query(VX_THRESHOLD_TRUE_VALUE, v);
2169
return v;
2170
}
2171
2172
/// vxQueryThreshold(FALSE_VALUE) wrapper
2173
vx_int32 valueFalse() const
2174
{
2175
vx_int32 v;
2176
query(VX_THRESHOLD_FALSE_VALUE, v);
2177
return v;
2178
}
2179
2180
/// vxSetThresholdAttribute(THRESHOLD_VALUE) wrapper
2181
void setValue(vx_int32 &val)
2182
{ IVX_CHECK_STATUS(vxSetThresholdAttribute(ref, VX_THRESHOLD_THRESHOLD_VALUE, &val, sizeof(val))); }
2183
2184
/// vxSetThresholdAttribute(THRESHOLD_LOWER) wrapper
2185
void setValueLower(vx_int32 &val)
2186
{ IVX_CHECK_STATUS(vxSetThresholdAttribute(ref, VX_THRESHOLD_THRESHOLD_LOWER, &val, sizeof(val))); }
2187
2188
/// vxSetThresholdAttribute(THRESHOLD_UPPER) wrapper
2189
void setValueUpper(vx_int32 &val)
2190
{ IVX_CHECK_STATUS(vxSetThresholdAttribute(ref, VX_THRESHOLD_THRESHOLD_UPPER, &val, sizeof(val))); }
2191
2192
/// vxSetThresholdAttribute(TRUE_VALUE) wrapper
2193
void setValueTrue(vx_int32 &val)
2194
{ IVX_CHECK_STATUS(vxSetThresholdAttribute(ref, VX_THRESHOLD_TRUE_VALUE, &val, sizeof(val))); }
2195
2196
/// vxSetThresholdAttribute(FALSE_VALUE) wrapper
2197
void setValueFalse(vx_int32 &val)
2198
{ IVX_CHECK_STATUS(vxSetThresholdAttribute(ref, VX_THRESHOLD_FALSE_VALUE, &val, sizeof(val))); }
2199
};
2200
2201
/// vx_array wrapper
2202
class Array : public RefWrapper<vx_array>
2203
{
2204
public:
2205
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Array);
2206
2207
/// vxCreateArray() wrapper
2208
static Array create(vx_context c, vx_enum type, vx_size capacity)
2209
{ return Array(vxCreateArray(c, type, capacity)); }
2210
2211
/// vxCreateVirtualArray() wrapper
2212
static Array createVirtual(vx_graph g, vx_enum type, vx_size capacity)
2213
{ return Array(vxCreateVirtualArray(g, type, capacity)); }
2214
2215
#ifndef VX_VERSION_1_1
2216
static const vx_enum
2217
VX_MEMORY_TYPE_HOST = VX_IMPORT_TYPE_HOST,
2218
VX_ARRAY_ITEMTYPE = VX_ARRAY_ATTRIBUTE_ITEMTYPE,
2219
VX_ARRAY_NUMITEMS = VX_ARRAY_ATTRIBUTE_NUMITEMS,
2220
VX_ARRAY_CAPACITY = VX_ARRAY_ATTRIBUTE_CAPACITY,
2221
VX_ARRAY_ITEMSIZE = VX_ARRAY_ATTRIBUTE_ITEMSIZE;
2222
#endif
2223
2224
template<typename T>
2225
void query(vx_enum att, T& value) const
2226
{ IVX_CHECK_STATUS( vxQueryArray(ref, att, &value, sizeof(value)) ); }
2227
2228
vx_enum itemType() const
2229
{
2230
vx_enum v;
2231
query(VX_ARRAY_ITEMTYPE, v);
2232
return v;
2233
}
2234
2235
vx_size itemSize() const
2236
{
2237
vx_size v;
2238
query(VX_ARRAY_ITEMSIZE, v);
2239
return v;
2240
}
2241
2242
vx_size capacity() const
2243
{
2244
vx_size v;
2245
query(VX_ARRAY_CAPACITY, v);
2246
return v;
2247
}
2248
2249
vx_size itemCount() const
2250
{
2251
vx_size v;
2252
query(VX_ARRAY_NUMITEMS, v);
2253
return v;
2254
}
2255
2256
void addItems(vx_size count, const void* ptr, vx_size stride)
2257
{
2258
IVX_CHECK_STATUS(vxAddArrayItems(ref, count, ptr, stride));
2259
}
2260
2261
void truncateArray(vx_size new_count)
2262
{
2263
if(new_count <= itemCount())
2264
IVX_CHECK_STATUS(vxTruncateArray(ref, new_count));
2265
else
2266
throw WrapperError(std::string(__func__) + "(): array is too small");
2267
}
2268
2269
void copyRangeTo(size_t start, size_t end, void* data)
2270
{
2271
if (!data) throw WrapperError(std::string(__func__) + "(): output pointer is 0");
2272
#ifdef VX_VERSION_1_1
2273
IVX_CHECK_STATUS(vxCopyArrayRange(ref, start, end, itemSize(), data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
2274
#else
2275
vx_size stride = itemSize();
2276
IVX_CHECK_STATUS(vxAccessArrayRange(ref, start, end, &stride, &data, VX_READ_ONLY));
2277
IVX_CHECK_STATUS(vxCommitArrayRange(ref, start, end, data));
2278
#endif
2279
}
2280
2281
void copyTo(void* data)
2282
{ copyRangeTo(0, itemCount(), data); }
2283
2284
void copyRangeFrom(size_t start, size_t end, const void* data)
2285
{
2286
if (!data) throw WrapperError(std::string(__func__) + "(): input pointer is 0");
2287
#ifdef VX_VERSION_1_1
2288
IVX_CHECK_STATUS(vxCopyArrayRange(ref, start, end, itemSize(), const_cast<void*>(data), VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
2289
#else
2290
vx_size stride = itemSize();
2291
IVX_CHECK_STATUS(vxAccessArrayRange(ref, start, end, &stride, const_cast<void**>(&data), VX_WRITE_ONLY));
2292
IVX_CHECK_STATUS(vxCommitArrayRange(ref, start, end, data));
2293
#endif
2294
}
2295
2296
void copyFrom(const void* data)
2297
{ copyRangeFrom(0, itemCount(), data); }
2298
2299
void copyRange(size_t start, size_t end, void* data, vx_enum usage, vx_enum memType = VX_MEMORY_TYPE_HOST)
2300
{
2301
if (!data) throw WrapperError(std::string(__func__) + "(): data pointer is 0");
2302
#ifdef VX_VERSION_1_1
2303
IVX_CHECK_STATUS(vxCopyArrayRange(ref, start, end, itemSize(), data, usage, memType));
2304
#else
2305
vx_size stride = itemSize();
2306
IVX_CHECK_STATUS(vxAccessArrayRange(ref, start, end, &stride, &data, usage));
2307
IVX_CHECK_STATUS(vxCommitArrayRange(ref, start, end, data));
2308
(void)memType;
2309
#endif
2310
}
2311
2312
void copy(void* data, vx_enum usage, vx_enum memType = VX_MEMORY_TYPE_HOST)
2313
{ copyRange(0, itemCount(), data, usage, memType); }
2314
2315
template<typename T> void addItem(const T& item)
2316
{
2317
if (!areTypesCompatible(TypeToEnum<T>::value, itemType()))
2318
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2319
addItems(1, &item, sizeof(T));
2320
}
2321
2322
template<typename T> void addItems(const std::vector<T>& data)
2323
{
2324
if (!areTypesCompatible(TypeToEnum<T>::value, itemType()))
2325
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2326
addItems(data.size(), &data[0], itemSize());
2327
}
2328
2329
template<typename T> void copyRangeTo(size_t start, size_t end, std::vector<T>& data)
2330
{
2331
if (!areTypesCompatible(TypeToEnum<T>::value, itemType()))
2332
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2333
if (data.empty())
2334
data.resize((end - start));
2335
else if (data.size() != (end - start))
2336
{
2337
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2338
}
2339
copyRangeTo(start, end, &data[0]);
2340
}
2341
2342
template<typename T> void copyTo(std::vector<T>& data)
2343
{ copyRangeTo(0, itemCount(), data); }
2344
2345
template<typename T> void copyRangeFrom(size_t start, size_t end, const std::vector<T>& data)
2346
{
2347
if (!areTypesCompatible(TypeToEnum<T>::value, itemType()))
2348
throw WrapperError(std::string(__func__) + "(): source type is wrong");
2349
if (data.size() != (end - start)) throw WrapperError(std::string(__func__) + "(): source size is wrong");
2350
copyRangeFrom(start, end, &data[0]);
2351
}
2352
2353
template<typename T> void copyFrom(std::vector<T>& data)
2354
{ copyRangeFrom(0, itemCount(), data); }
2355
2356
#ifdef IVX_USE_OPENCV
2357
void addItems(cv::InputArray ia)
2358
{
2359
cv::Mat m = ia.getMat();
2360
if (m.type() != enumToCVType(itemType()))
2361
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2362
addItems(m.total(), m.isContinuous() ? m.ptr() : m.clone().ptr(),
2363
(vx_size)(m.elemSize()));
2364
}
2365
2366
void copyRangeTo(size_t start, size_t end, cv::Mat& m)
2367
{
2368
if (m.type() != enumToCVType(itemType()))
2369
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2370
if (!(
2371
((vx_size)(m.rows) == (end - start) && m.cols == 1) ||
2372
((vx_size)(m.cols) == (end - start) && m.rows == 1)
2373
) && !m.empty())
2374
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2375
2376
if (m.isContinuous() && (vx_size)(m.total()) == (end - start))
2377
{
2378
copyRangeTo(start, end, m.ptr());
2379
}
2380
else
2381
{
2382
cv::Mat tmp(1, (int)(end - start), enumToCVType(itemType()));
2383
copyRangeTo(start, end, tmp.ptr());
2384
if (m.empty())
2385
m = tmp;
2386
else
2387
tmp.copyTo(m);
2388
}
2389
}
2390
2391
void copyTo(cv::Mat& m)
2392
{ copyRangeTo(0, itemCount(), m); }
2393
2394
void copyRangeFrom(size_t start, size_t end, const cv::Mat& m)
2395
{
2396
if (!(
2397
((vx_size)(m.rows) == (end - start) && m.cols == 1) ||
2398
((vx_size)(m.cols) == (end - start) && m.rows == 1)
2399
))
2400
throw WrapperError(std::string(__func__) + "(): source size is wrong");
2401
if (m.type() != enumToCVType(itemType()))
2402
throw WrapperError(std::string(__func__) + "(): source type is wrong");
2403
copyFrom(m.isContinuous() ? m.ptr() : m.clone().ptr());
2404
}
2405
2406
void copyFrom(const cv::Mat& m)
2407
{ copyRangeFrom(0, itemCount(), m); }
2408
#endif //IVX_USE_OPENCV
2409
};
2410
2411
/*
2412
* Convolution
2413
*/
2414
class Convolution : public RefWrapper<vx_convolution>
2415
{
2416
public:
2417
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Convolution);
2418
2419
static Convolution create(vx_context context, vx_size columns, vx_size rows)
2420
{ return Convolution(vxCreateConvolution(context, columns, rows)); }
2421
2422
#ifndef VX_VERSION_1_1
2423
static const vx_enum
2424
VX_MEMORY_TYPE_HOST = VX_IMPORT_TYPE_HOST,
2425
VX_CONVOLUTION_ROWS = VX_CONVOLUTION_ATTRIBUTE_ROWS,
2426
VX_CONVOLUTION_COLUMNS = VX_CONVOLUTION_ATTRIBUTE_COLUMNS,
2427
VX_CONVOLUTION_SCALE = VX_CONVOLUTION_ATTRIBUTE_SCALE,
2428
VX_CONVOLUTION_SIZE = VX_CONVOLUTION_ATTRIBUTE_SIZE;
2429
#endif
2430
2431
template<typename T>
2432
void query(vx_enum att, T& value) const
2433
{ IVX_CHECK_STATUS( vxQueryConvolution(ref, att, &value, sizeof(value)) ); }
2434
2435
vx_size columns() const
2436
{
2437
vx_size v;
2438
query(VX_CONVOLUTION_COLUMNS, v);
2439
return v;
2440
}
2441
2442
vx_size rows() const
2443
{
2444
vx_size v;
2445
query(VX_CONVOLUTION_ROWS, v);
2446
return v;
2447
}
2448
2449
vx_uint32 scale() const
2450
{
2451
vx_uint32 v;
2452
query(VX_CONVOLUTION_SCALE, v);
2453
return v;
2454
}
2455
2456
vx_size size() const
2457
{
2458
vx_size v;
2459
query(VX_CONVOLUTION_SIZE, v);
2460
return v;
2461
}
2462
2463
vx_enum dataType()
2464
{
2465
return VX_TYPE_INT16;
2466
}
2467
2468
void setScale(vx_uint32 newScale)
2469
{ IVX_CHECK_STATUS( vxSetConvolutionAttribute(ref, VX_CONVOLUTION_SCALE, &newScale, sizeof(newScale)) ); }
2470
2471
void copyTo(void* data)
2472
{
2473
if (!data) throw WrapperError(std::string(__func__) + "(): output pointer is 0");
2474
#ifdef VX_VERSION_1_1
2475
IVX_CHECK_STATUS(vxCopyConvolutionCoefficients(ref, data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
2476
#else
2477
IVX_CHECK_STATUS(vxReadConvolutionCoefficients(ref, (vx_int16 *)data));
2478
#endif
2479
}
2480
2481
void copyFrom(const void* data)
2482
{
2483
if (!data) throw WrapperError(std::string(__func__) + "(): input pointer is 0");
2484
#ifdef VX_VERSION_1_1
2485
IVX_CHECK_STATUS(vxCopyConvolutionCoefficients(ref, const_cast<void*>(data), VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
2486
#else
2487
IVX_CHECK_STATUS(vxWriteConvolutionCoefficients(ref, (const vx_int16 *)data));
2488
#endif
2489
}
2490
2491
void copy(void* data, vx_enum usage, vx_enum memType = VX_MEMORY_TYPE_HOST)
2492
{
2493
if (!data) throw WrapperError(std::string(__func__) + "(): data pointer is 0");
2494
#ifdef VX_VERSION_1_1
2495
IVX_CHECK_STATUS(vxCopyConvolutionCoefficients(ref, data, usage, memType));
2496
#else
2497
if (usage == VX_READ_ONLY)
2498
IVX_CHECK_STATUS(vxReadConvolutionCoefficients(ref, (vx_int16 *)data));
2499
else if (usage == VX_WRITE_ONLY)
2500
IVX_CHECK_STATUS(vxWriteConvolutionCoefficients(ref, (const vx_int16 *)data));
2501
else
2502
throw WrapperError(std::string(__func__) + "(): unknown copy direction");
2503
(void)memType;
2504
#endif
2505
}
2506
2507
template<typename T> void copyTo(std::vector<T>& data)
2508
{
2509
if (!areTypesCompatible(TypeToEnum<T>::value, dataType()))
2510
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2511
if (data.size()*sizeof(T) != size())
2512
{
2513
if (data.size() == 0)
2514
data.resize(size()/sizeof(T));
2515
else
2516
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2517
}
2518
copyTo(&data[0]);
2519
}
2520
2521
template<typename T> void copyFrom(const std::vector<T>& data)
2522
{
2523
if (!areTypesCompatible(TypeToEnum<T>::value, dataType()))
2524
throw WrapperError(std::string(__func__) + "(): source type is wrong");
2525
if (data.size()*sizeof(T) != size()) throw WrapperError(std::string(__func__) + "(): source size is wrong");
2526
copyFrom(&data[0]);
2527
}
2528
2529
#ifdef IVX_USE_OPENCV
2530
void copyTo(cv::Mat& m)
2531
{
2532
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2533
if (((vx_size)(m.rows) != rows() || (vx_size)(m.cols) != columns()) && !m.empty())
2534
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2535
2536
if (m.isContinuous() && (vx_size)(m.rows) == rows() && (vx_size)(m.cols) == columns())
2537
{
2538
copyTo(m.ptr());
2539
}
2540
else
2541
{
2542
cv::Mat tmp((int)rows(), (int)columns(), enumToCVType(dataType()));
2543
copyTo(tmp.ptr());
2544
if (m.empty())
2545
m = tmp;
2546
else
2547
tmp.copyTo(m);
2548
}
2549
}
2550
2551
void copyFrom(const cv::Mat& m)
2552
{
2553
if ((vx_size)(m.rows) != rows() || (vx_size)(m.cols) != columns()) throw WrapperError(std::string(__func__) + "(): source size is wrong");
2554
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): source type is wrong");
2555
copyFrom(m.isContinuous() ? m.ptr() : m.clone().ptr());
2556
}
2557
#endif //IVX_USE_OPENCV
2558
};
2559
2560
/*
2561
* Matrix
2562
*/
2563
class Matrix : public RefWrapper<vx_matrix>
2564
{
2565
public:
2566
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Matrix);
2567
2568
static Matrix create(vx_context context, vx_enum dataType, vx_size columns, vx_size rows)
2569
{ return Matrix(vxCreateMatrix(context, dataType, columns, rows)); }
2570
2571
#ifdef VX_VERSION_1_1
2572
static Matrix createFromPattern(vx_context context, vx_enum pattern, vx_size columns, vx_size rows)
2573
{ return Matrix(vxCreateMatrixFromPattern(context, pattern, columns, rows)); }
2574
#endif
2575
2576
#ifndef VX_VERSION_1_1
2577
static const vx_enum
2578
VX_MEMORY_TYPE_HOST = VX_IMPORT_TYPE_HOST,
2579
VX_MATRIX_TYPE = VX_MATRIX_ATTRIBUTE_TYPE,
2580
VX_MATRIX_ROWS = VX_MATRIX_ATTRIBUTE_ROWS,
2581
VX_MATRIX_COLUMNS = VX_MATRIX_ATTRIBUTE_COLUMNS,
2582
VX_MATRIX_SIZE = VX_MATRIX_ATTRIBUTE_SIZE;
2583
#endif
2584
2585
template<typename T>
2586
void query(vx_enum att, T& value) const
2587
{ IVX_CHECK_STATUS( vxQueryMatrix(ref, att, &value, sizeof(value)) ); }
2588
2589
vx_enum dataType() const
2590
{
2591
vx_enum v;
2592
query(VX_MATRIX_TYPE, v);
2593
return v;
2594
}
2595
2596
vx_size columns() const
2597
{
2598
vx_size v;
2599
query(VX_MATRIX_COLUMNS, v);
2600
return v;
2601
}
2602
2603
vx_size rows() const
2604
{
2605
vx_size v;
2606
query(VX_MATRIX_ROWS, v);
2607
return v;
2608
}
2609
2610
vx_size size() const
2611
{
2612
vx_size v;
2613
query(VX_MATRIX_SIZE, v);
2614
return v;
2615
}
2616
2617
#ifdef VX_VERSION_1_1
2618
vx_coordinates2d_t origin() const
2619
{
2620
vx_coordinates2d_t v;
2621
query(VX_MATRIX_ORIGIN, v);
2622
return v;
2623
}
2624
2625
vx_enum pattern() const
2626
{
2627
vx_enum v;
2628
query(VX_MATRIX_PATTERN, v);
2629
return v;
2630
}
2631
#endif // VX_VERSION_1_1
2632
2633
void copyTo(void* data)
2634
{
2635
if (!data) throw WrapperError(std::string(__func__) + "(): output pointer is 0");
2636
#ifdef VX_VERSION_1_1
2637
IVX_CHECK_STATUS(vxCopyMatrix(ref, data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
2638
#else
2639
IVX_CHECK_STATUS(vxReadMatrix(ref, data));
2640
#endif
2641
}
2642
2643
void copyFrom(const void* data)
2644
{
2645
if (!data) throw WrapperError(std::string(__func__) + "(): input pointer is 0");
2646
#ifdef VX_VERSION_1_1
2647
IVX_CHECK_STATUS(vxCopyMatrix(ref, const_cast<void*>(data), VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
2648
#else
2649
IVX_CHECK_STATUS(vxWriteMatrix(ref, data));
2650
#endif
2651
}
2652
2653
void copy(void* data, vx_enum usage, vx_enum memType = VX_MEMORY_TYPE_HOST)
2654
{
2655
if (!data) throw WrapperError(std::string(__func__) + "(): data pointer is 0");
2656
#ifdef VX_VERSION_1_1
2657
IVX_CHECK_STATUS(vxCopyMatrix(ref, data, usage, memType));
2658
#else
2659
if (usage == VX_READ_ONLY)
2660
IVX_CHECK_STATUS(vxReadMatrix(ref, data));
2661
else if (usage == VX_WRITE_ONLY)
2662
IVX_CHECK_STATUS(vxWriteMatrix(ref, data));
2663
else
2664
throw WrapperError(std::string(__func__) + "(): unknown copy direction");
2665
(void)memType;
2666
#endif
2667
}
2668
2669
template<typename T> void copyTo(std::vector<T>& data)
2670
{
2671
if (!areTypesCompatible(TypeToEnum<T>::value, dataType()))
2672
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2673
if (data.size()*sizeof(T) != size())
2674
{
2675
if (data.size() == 0)
2676
data.resize(size()/sizeof(T));
2677
else
2678
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2679
}
2680
copyTo(&data[0]);
2681
}
2682
2683
template<typename T> void copyFrom(const std::vector<T>& data)
2684
{
2685
if (!areTypesCompatible(TypeToEnum<T>::value, dataType()))
2686
throw WrapperError(std::string(__func__) + "(): source type is wrong");
2687
if (data.size()*sizeof(T) != size()) throw WrapperError(std::string(__func__) + "(): source size is wrong");
2688
copyFrom(&data[0]);
2689
}
2690
2691
#ifdef IVX_USE_OPENCV
2692
void copyTo(cv::Mat& m)
2693
{
2694
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2695
if (((vx_size)(m.rows) != rows() || (vx_size)(m.cols) != columns()) && !m.empty())
2696
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2697
2698
if (m.isContinuous() && (vx_size)(m.rows) == rows() && (vx_size)(m.cols) == columns())
2699
{
2700
copyTo(m.ptr());
2701
}
2702
else
2703
{
2704
cv::Mat tmp((int)rows(), (int)columns(), enumToCVType(dataType()));
2705
copyTo(tmp.ptr());
2706
if (m.empty())
2707
m = tmp;
2708
else
2709
tmp.copyTo(m);
2710
}
2711
}
2712
2713
void copyFrom(const cv::Mat& m)
2714
{
2715
if ((vx_size)(m.rows) != rows() || (vx_size)(m.cols) != columns()) throw WrapperError(std::string(__func__) + "(): source size is wrong");
2716
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): source type is wrong");
2717
copyFrom(m.isContinuous() ? m.ptr() : m.clone().ptr());
2718
}
2719
#endif //IVX_USE_OPENCV
2720
};
2721
2722
/*
2723
* LUT
2724
*/
2725
class LUT : public RefWrapper<vx_lut>
2726
{
2727
public:
2728
IVX_REF_STD_CTORS_AND_ASSIGNMENT(LUT);
2729
2730
#ifdef VX_VERSION_1_1
2731
static LUT create(vx_context context, vx_enum dataType = VX_TYPE_UINT8, vx_size count = 256)
2732
{
2733
#else
2734
static LUT create(vx_context context)
2735
{
2736
vx_enum dataType = VX_TYPE_UINT8;
2737
vx_size count = 256;
2738
#endif
2739
return LUT(vxCreateLUT(context, dataType, count));
2740
}
2741
2742
#ifndef VX_VERSION_1_1
2743
static const vx_enum VX_MEMORY_TYPE_HOST = VX_IMPORT_TYPE_HOST;
2744
#endif
2745
2746
template<typename T>
2747
void query(vx_enum att, T& value) const
2748
{
2749
IVX_CHECK_STATUS(vxQueryLUT(ref, att, &value, sizeof(value)));
2750
}
2751
2752
#ifndef VX_VERSION_1_1
2753
static const vx_enum
2754
VX_LUT_TYPE = VX_LUT_ATTRIBUTE_TYPE,
2755
VX_LUT_COUNT = VX_LUT_ATTRIBUTE_COUNT,
2756
VX_LUT_SIZE = VX_LUT_ATTRIBUTE_SIZE;
2757
#endif
2758
2759
vx_enum dataType() const
2760
{
2761
vx_enum v;
2762
query(VX_LUT_TYPE, v);
2763
return v;
2764
}
2765
2766
vx_size count() const
2767
{
2768
vx_size v;
2769
query(VX_LUT_COUNT, v);
2770
return v;
2771
}
2772
2773
vx_size size() const
2774
{
2775
vx_size v;
2776
query(VX_LUT_SIZE, v);
2777
return v;
2778
}
2779
2780
#ifdef VX_VERSION_1_1
2781
vx_uint32 offset() const
2782
{
2783
vx_enum v;
2784
query(VX_LUT_OFFSET, v);
2785
return v;
2786
}
2787
#endif // VX_VERSION_1_1
2788
2789
void copyTo(void* data)
2790
{
2791
if (!data) throw WrapperError(std::string(__func__) + "(): output pointer is 0");
2792
#ifdef VX_VERSION_1_1
2793
IVX_CHECK_STATUS(vxCopyLUT(ref, data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
2794
#else
2795
IVX_CHECK_STATUS(vxAccessLUT(ref, &data, VX_READ_ONLY));
2796
IVX_CHECK_STATUS(vxCommitLUT(ref, data));
2797
#endif
2798
}
2799
2800
void copyFrom(const void* data)
2801
{
2802
if (!data) throw WrapperError(std::string(__func__) + "(): input pointer is 0");
2803
#ifdef VX_VERSION_1_1
2804
IVX_CHECK_STATUS(vxCopyLUT(ref, const_cast<void*>(data), VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
2805
#else
2806
IVX_CHECK_STATUS(vxAccessLUT(ref, const_cast<void**>(&data), VX_WRITE_ONLY));
2807
IVX_CHECK_STATUS(vxCommitLUT(ref, data));
2808
#endif
2809
}
2810
2811
void copy(void* data, vx_enum usage, vx_enum memType = VX_MEMORY_TYPE_HOST)
2812
{
2813
#ifdef VX_VERSION_1_1
2814
IVX_CHECK_STATUS(vxCopyLUT(ref, data, usage, memType));
2815
#else
2816
IVX_CHECK_STATUS(vxAccessLUT(ref, const_cast<void**>(&data), usage));
2817
IVX_CHECK_STATUS(vxCommitLUT(ref, data));
2818
(void)memType;
2819
#endif
2820
}
2821
2822
template<typename T> void copyTo(std::vector<T>& data)
2823
{
2824
if (!areTypesCompatible(TypeToEnum<T>::value, dataType()))
2825
throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2826
if (data.size() != count())
2827
{
2828
if (data.size() == 0)
2829
data.resize(count());
2830
else
2831
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2832
}
2833
copyTo(&data[0]);
2834
}
2835
2836
template<typename T> void copyFrom(const std::vector<T>& data)
2837
{
2838
if (!areTypesCompatible(TypeToEnum<T>::value, dataType()))
2839
throw WrapperError(std::string(__func__) + "(): source type is wrong");
2840
if (data.size() != count()) throw WrapperError(std::string(__func__) + "(): source size is wrong");
2841
copyFrom(&data[0]);
2842
}
2843
2844
#ifdef IVX_USE_OPENCV
2845
void copyTo(cv::Mat& m)
2846
{
2847
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): destination type is wrong");
2848
if (!(
2849
((vx_size)(m.rows) == count() && m.cols == 1) ||
2850
((vx_size)(m.cols) == count() && m.rows == 1)
2851
) && !m.empty())
2852
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
2853
2854
if (m.isContinuous() && (vx_size)(m.total()) == count())
2855
{
2856
copyTo(m.ptr());
2857
}
2858
else
2859
{
2860
cv::Mat tmp(1, (int)count(), enumToCVType(dataType()));
2861
copyTo(tmp.ptr());
2862
if (m.empty())
2863
m = tmp;
2864
else
2865
tmp.copyTo(m);
2866
}
2867
}
2868
2869
void copyFrom(const cv::Mat& m)
2870
{
2871
if (!(
2872
((vx_size)(m.rows) == count() && m.cols == 1) ||
2873
((vx_size)(m.cols) == count() && m.rows == 1)
2874
)) throw WrapperError(std::string(__func__) + "(): source size is wrong");
2875
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): source type is wrong");
2876
copyFrom(m.isContinuous() ? m.ptr() : m.clone().ptr());
2877
}
2878
#endif //IVX_USE_OPENCV
2879
};
2880
2881
/*
2882
* Pyramid
2883
*/
2884
class Pyramid : public RefWrapper<vx_pyramid>
2885
{
2886
public:
2887
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Pyramid)
2888
2889
static Pyramid create(vx_context context, vx_size levels, vx_float32 scale,
2890
vx_uint32 width, vx_uint32 height, vx_df_image format)
2891
{return Pyramid(vxCreatePyramid(context, levels, scale, width, height, format));}
2892
2893
static Pyramid createVirtual(vx_graph graph, vx_size levels, vx_float32 scale,
2894
vx_uint32 width, vx_uint32 height, vx_df_image format)
2895
{return Pyramid(vxCreateVirtualPyramid(graph, levels, scale, width, height, format));}
2896
2897
#ifndef VX_VERSION_1_1
2898
static const vx_enum
2899
VX_PYRAMID_LEVELS = VX_PYRAMID_ATTRIBUTE_LEVELS,
2900
VX_PYRAMID_SCALE = VX_PYRAMID_ATTRIBUTE_SCALE,
2901
VX_PYRAMID_WIDTH = VX_PYRAMID_ATTRIBUTE_WIDTH,
2902
VX_PYRAMID_HEIGHT = VX_PYRAMID_ATTRIBUTE_HEIGHT,
2903
VX_PYRAMID_FORMAT = VX_PYRAMID_ATTRIBUTE_FORMAT;
2904
#endif
2905
2906
template<typename T>
2907
void query(vx_enum att, T& value) const
2908
{ IVX_CHECK_STATUS( vxQueryPyramid(ref, att, &value, sizeof(value)) ); }
2909
2910
vx_size levels() const
2911
{
2912
vx_size l;
2913
query(VX_PYRAMID_LEVELS, l);
2914
return l;
2915
}
2916
2917
vx_float32 scale() const
2918
{
2919
vx_float32 s;
2920
query(VX_PYRAMID_SCALE, s);
2921
return s;
2922
}
2923
2924
vx_uint32 width() const
2925
{
2926
vx_uint32 v;
2927
query(VX_PYRAMID_WIDTH, v);
2928
return v;
2929
}
2930
2931
vx_uint32 height() const
2932
{
2933
vx_uint32 v;
2934
query(VX_PYRAMID_HEIGHT, v);
2935
return v;
2936
}
2937
2938
vx_df_image format() const
2939
{
2940
vx_df_image f;
2941
query(VX_PYRAMID_FORMAT, f);
2942
return f;
2943
}
2944
2945
Image getLevel(vx_uint32 index)
2946
{ return Image(vxGetPyramidLevel(ref, index)); }
2947
};
2948
2949
/*
2950
* Distribution
2951
*/
2952
class Distribution : public RefWrapper<vx_distribution>
2953
{
2954
public:
2955
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Distribution);
2956
2957
static Distribution create(vx_context context, vx_size numBins, vx_int32 offset, vx_uint32 range)
2958
{
2959
return Distribution(vxCreateDistribution(context, numBins, offset, range));
2960
}
2961
2962
#ifndef VX_VERSION_1_1
2963
static const vx_enum
2964
VX_MEMORY_TYPE_HOST = VX_IMPORT_TYPE_HOST,
2965
VX_DISTRIBUTION_DIMENSIONS = VX_DISTRIBUTION_ATTRIBUTE_DIMENSIONS,
2966
VX_DISTRIBUTION_OFFSET = VX_DISTRIBUTION_ATTRIBUTE_OFFSET,
2967
VX_DISTRIBUTION_RANGE = VX_DISTRIBUTION_ATTRIBUTE_RANGE,
2968
VX_DISTRIBUTION_BINS = VX_DISTRIBUTION_ATTRIBUTE_BINS,
2969
VX_DISTRIBUTION_WINDOW = VX_DISTRIBUTION_ATTRIBUTE_WINDOW,
2970
VX_DISTRIBUTION_SIZE = VX_DISTRIBUTION_ATTRIBUTE_SIZE;
2971
#endif
2972
2973
template<typename T>
2974
void query(vx_enum att, T& value) const
2975
{
2976
IVX_CHECK_STATUS(vxQueryDistribution(ref, att, &value, sizeof(value)));
2977
}
2978
2979
vx_size dimensions() const
2980
{
2981
vx_size v;
2982
query(VX_DISTRIBUTION_DIMENSIONS, v);
2983
return v;
2984
}
2985
2986
vx_int32 offset() const
2987
{
2988
vx_int32 v;
2989
query(VX_DISTRIBUTION_OFFSET, v);
2990
return v;
2991
}
2992
2993
vx_uint32 range() const
2994
{
2995
vx_uint32 v;
2996
query(VX_DISTRIBUTION_RANGE, v);
2997
return v;
2998
}
2999
3000
vx_size bins() const
3001
{
3002
vx_size v;
3003
query(VX_DISTRIBUTION_BINS, v);
3004
return v;
3005
}
3006
3007
vx_uint32 window() const
3008
{
3009
vx_uint32 v;
3010
query(VX_DISTRIBUTION_WINDOW, v);
3011
return v;
3012
}
3013
3014
vx_size size() const
3015
{
3016
vx_size v;
3017
query(VX_DISTRIBUTION_SIZE, v);
3018
return v;
3019
}
3020
3021
vx_size dataType() const
3022
{
3023
return VX_TYPE_UINT32;
3024
}
3025
3026
void copyTo(void* data)
3027
{
3028
if (!data) throw WrapperError(std::string(__func__) + "(): output pointer is 0");
3029
#ifdef VX_VERSION_1_1
3030
IVX_CHECK_STATUS(vxCopyDistribution(ref, data, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
3031
#else
3032
IVX_CHECK_STATUS(vxAccessDistribution(ref, &data, VX_READ_ONLY));
3033
IVX_CHECK_STATUS(vxCommitDistribution(ref, data));
3034
#endif
3035
}
3036
3037
void copyFrom(const void* data)
3038
{
3039
if (!data) throw WrapperError(std::string(__func__) + "(): input pointer is 0");
3040
#ifdef VX_VERSION_1_1
3041
IVX_CHECK_STATUS(vxCopyDistribution(ref, const_cast<void*>(data), VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST));
3042
#else
3043
IVX_CHECK_STATUS(vxAccessDistribution(ref, const_cast<void**>(&data), VX_WRITE_ONLY));
3044
IVX_CHECK_STATUS(vxCommitDistribution(ref, data));
3045
#endif
3046
}
3047
3048
void copy(void* data, vx_enum usage, vx_enum memType = VX_MEMORY_TYPE_HOST)
3049
{
3050
#ifdef VX_VERSION_1_1
3051
IVX_CHECK_STATUS(vxCopyDistribution(ref, data, usage, memType));
3052
#else
3053
IVX_CHECK_STATUS(vxAccessDistribution(ref, const_cast<void**>(&data), usage));
3054
IVX_CHECK_STATUS(vxCommitDistribution(ref, data));
3055
(void)memType;
3056
#endif
3057
}
3058
3059
template<typename T> void copyTo(std::vector<T>& data)
3060
{
3061
if (TypeToEnum<T>::value != dataType()) throw WrapperError(std::string(__func__) + "(): destination type is wrong");
3062
if (data.size() != bins())
3063
{
3064
if (data.size() == 0)
3065
data.resize(bins());
3066
else
3067
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
3068
}
3069
copyTo(&data[0]);
3070
}
3071
3072
template<typename T> void copyFrom(const std::vector<T>& data)
3073
{
3074
if (TypeToEnum<T>::value != dataType()) throw WrapperError(std::string(__func__) + "(): source type is wrong");
3075
if (data.size() != bins()) throw WrapperError(std::string(__func__) + "(): source size is wrong");
3076
copyFrom(&data[0]);
3077
}
3078
3079
#ifdef IVX_USE_OPENCV
3080
void copyTo(cv::Mat& m)
3081
{
3082
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): destination type is wrong");
3083
if (!(
3084
((vx_size)(m.rows) == bins() && m.cols == 1) ||
3085
((vx_size)(m.cols) == bins() && m.rows == 1)
3086
) && !m.empty())
3087
throw WrapperError(std::string(__func__) + "(): destination size is wrong");
3088
3089
if (m.isContinuous() && (vx_size)(m.total()) == bins())
3090
{
3091
copyTo(m.ptr());
3092
}
3093
else
3094
{
3095
cv::Mat tmp(1, (int)bins(), enumToCVType(dataType()));
3096
copyTo(tmp.ptr());
3097
if (m.empty())
3098
m = tmp;
3099
else
3100
tmp.copyTo(m);
3101
}
3102
}
3103
3104
void copyFrom(const cv::Mat& m)
3105
{
3106
if (!(
3107
((vx_size)(m.rows) == bins() && m.cols == 1) ||
3108
((vx_size)(m.cols) == bins() && m.rows == 1)
3109
)) throw WrapperError(std::string(__func__) + "(): source size is wrong");
3110
if (m.type() != enumToCVType(dataType())) throw WrapperError(std::string(__func__) + "(): source type is wrong");
3111
copyFrom(m.isContinuous() ? m.ptr() : m.clone().ptr());
3112
}
3113
#endif //IVX_USE_OPENCV
3114
};
3115
3116
/*
3117
* Remap
3118
*/
3119
class Remap : public RefWrapper<vx_remap>
3120
{
3121
public:
3122
IVX_REF_STD_CTORS_AND_ASSIGNMENT(Remap);
3123
3124
static Remap create(vx_context context, vx_uint32 src_width, vx_uint32 src_height, vx_uint32 dst_width, vx_uint32 dst_height)
3125
{
3126
return Remap(vxCreateRemap(context, src_width, src_height, dst_width, dst_height));
3127
}
3128
3129
#ifndef VX_VERSION_1_1
3130
static const vx_enum
3131
VX_REMAP_SOURCE_WIDTH = VX_REMAP_ATTRIBUTE_SOURCE_WIDTH,
3132
VX_REMAP_SOURCE_HEIGHT = VX_REMAP_ATTRIBUTE_SOURCE_HEIGHT,
3133
VX_REMAP_DESTINATION_WIDTH = VX_REMAP_ATTRIBUTE_DESTINATION_WIDTH,
3134
VX_REMAP_DESTINATION_HEIGHT = VX_REMAP_ATTRIBUTE_DESTINATION_HEIGHT;
3135
#endif
3136
3137
template<typename T>
3138
void query(vx_enum att, T& value) const
3139
{ IVX_CHECK_STATUS(vxQueryRemap(ref, att, &value, sizeof(value))); }
3140
3141
vx_uint32 srcWidth() const
3142
{
3143
vx_uint32 v;
3144
query(VX_REMAP_SOURCE_WIDTH, v);
3145
return v;
3146
}
3147
3148
vx_uint32 srcHeight() const
3149
{
3150
vx_uint32 v;
3151
query(VX_REMAP_SOURCE_HEIGHT, v);
3152
return v;
3153
}
3154
3155
vx_uint32 dstWidth() const
3156
{
3157
vx_uint32 v;
3158
query(VX_REMAP_DESTINATION_WIDTH, v);
3159
return v;
3160
}
3161
3162
vx_uint32 dstHeight() const
3163
{
3164
vx_uint32 v;
3165
query(VX_REMAP_DESTINATION_HEIGHT, v);
3166
return v;
3167
}
3168
3169
vx_uint32 srcCoordType() const
3170
{ return VX_TYPE_FLOAT32; }
3171
3172
vx_uint32 dstCoordType() const
3173
{ return VX_TYPE_UINT32; }
3174
3175
void setMapping(vx_uint32 dst_x, vx_uint32 dst_y, vx_float32 src_x, vx_float32 src_y)
3176
{ IVX_CHECK_STATUS(vxSetRemapPoint(ref, dst_x, dst_y, src_x, src_y)); }
3177
3178
void getMapping(vx_uint32 dst_x, vx_uint32 dst_y, vx_float32 &src_x, vx_float32 &src_y) const
3179
{ IVX_CHECK_STATUS(vxGetRemapPoint(ref, dst_x, dst_y, &src_x, &src_y)); }
3180
3181
#ifdef IVX_USE_OPENCV
3182
void setMappings(const cv::Mat& map_x, const cv::Mat& map_y)
3183
{
3184
if (map_x.type() != enumToCVType(srcCoordType()) || map_y.type() != enumToCVType(srcCoordType()))
3185
throw WrapperError(std::string(__func__) + "(): mapping type is wrong");
3186
if ((vx_uint32)(map_x.rows) != dstHeight() || (vx_uint32)(map_x.cols) != dstWidth())
3187
throw WrapperError(std::string(__func__) + "(): x mapping size is wrong");
3188
if ((vx_uint32)(map_y.rows) != dstHeight() || (vx_uint32)(map_y.cols) != dstWidth())
3189
throw WrapperError(std::string(__func__) + "(): y mapping size is wrong");
3190
3191
for (vx_uint32 y = 0; y < dstHeight(); y++)
3192
{
3193
const vx_float32* map_x_line = map_x.ptr<vx_float32>(y);
3194
const vx_float32* map_y_line = map_y.ptr<vx_float32>(y);
3195
for (vx_uint32 x = 0; x < dstWidth(); x++)
3196
setMapping(x, y, map_x_line[x], map_y_line[x]);
3197
}
3198
}
3199
3200
void setMappings(const cv::Mat& map)
3201
{
3202
if (map.depth() != CV_MAT_DEPTH(enumToCVType(srcCoordType())) || map.channels() != 2)
3203
throw WrapperError(std::string(__func__) + "(): mapping type is wrong");
3204
if ((vx_uint32)(map.rows) != dstHeight() || (vx_uint32)(map.cols) != dstWidth())
3205
throw WrapperError(std::string(__func__) + "(): x mapping size is wrong");
3206
3207
for (vx_uint32 y = 0; y < dstHeight(); y++)
3208
{
3209
const vx_float32* map_line = map.ptr<vx_float32>(y);
3210
for (vx_uint32 x = 0; x < 2*dstWidth(); x+=2)
3211
setMapping(x, y, map_line[x], map_line[x+1]);
3212
}
3213
}
3214
3215
void getMappings(cv::Mat& map_x, cv::Mat& map_y) const
3216
{
3217
if (map_x.type() != enumToCVType(srcCoordType()) || map_y.type() != enumToCVType(srcCoordType()))
3218
throw WrapperError(std::string(__func__) + "(): mapping type is wrong");
3219
if (((vx_uint32)(map_x.rows) != dstHeight() || (vx_uint32)(map_x.cols) != dstWidth()) && !map_x.empty())
3220
throw WrapperError(std::string(__func__) + "(): x mapping size is wrong");
3221
if (((vx_uint32)(map_y.rows) != dstHeight() || (vx_uint32)(map_y.cols) != dstWidth()) && !map_y.empty())
3222
throw WrapperError(std::string(__func__) + "(): y mapping size is wrong");
3223
3224
if (map_x.empty())
3225
map_x = cv::Mat((int)dstHeight(), (int)dstWidth(), enumToCVType(srcCoordType()));
3226
if (map_y.empty())
3227
map_y = cv::Mat((int)dstHeight(), (int)dstWidth(), enumToCVType(srcCoordType()));
3228
3229
for (vx_uint32 y = 0; y < dstHeight(); y++)
3230
{
3231
vx_float32* map_x_line = map_x.ptr<vx_float32>(y);
3232
vx_float32* map_y_line = map_y.ptr<vx_float32>(y);
3233
for (vx_uint32 x = 0; x < dstWidth(); x++)
3234
getMapping(x, y, map_x_line[x], map_y_line[x]);
3235
}
3236
}
3237
3238
void getMappings(cv::Mat& map) const
3239
{
3240
if (map.depth() != CV_MAT_DEPTH(enumToCVType(srcCoordType())) || map.channels() != 2)
3241
throw WrapperError(std::string(__func__) + "(): mapping type is wrong");
3242
if (((vx_uint32)(map.rows) != dstHeight() || (vx_uint32)(map.cols) != dstWidth()) && !map.empty())
3243
throw WrapperError(std::string(__func__) + "(): x mapping size is wrong");
3244
3245
if (map.empty())
3246
map = cv::Mat((int)dstHeight(), (int)dstWidth(), CV_MAKETYPE(CV_MAT_DEPTH(enumToCVType(srcCoordType())),2));
3247
3248
for (vx_uint32 y = 0; y < dstHeight(); y++)
3249
{
3250
vx_float32* map_line = map.ptr<vx_float32>(y);
3251
for (vx_uint32 x = 0; x < 2*dstWidth(); x+=2)
3252
getMapping(x, y, map_line[x], map_line[x+1]);
3253
}
3254
}
3255
#endif //IVX_USE_OPENCV
3256
};
3257
3258
/// Standard nodes
3259
namespace nodes {
3260
3261
/// Creates a Gaussian Filter 3x3 Node (vxGaussian3x3Node)
3262
inline Node gaussian3x3(vx_graph graph, vx_image inImg, vx_image outImg)
3263
{ return Node(vxGaussian3x3Node(graph, inImg, outImg)); }
3264
3265
} // namespace nodes
3266
3267
} // namespace ivx
3268
3269
// restore warnings
3270
#if defined(_MSC_VER)
3271
#pragma warning(pop)
3272
#elif defined(__clang__)
3273
#pragma clang diagnostic pop
3274
#elif defined(__GNUC__)
3275
#pragma GCC diagnostic pop
3276
#endif // compiler macro
3277
3278
#endif //IVX_HPP
3279
3280