+ All Categories
Home > Documents > Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext =...

Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext =...

Date post: 17-Sep-2020
Category:
Upload: others
View: 5 times
Download: 2 times
Share this document with a friend
31
© Copyright Khronos Group 2018 - Page 1 Hands-on programming session Kari Pulli | Meta Co.
Transcript
Page 1: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 1

Hands-on programming session

Kari Pulli | Meta Co.

Page 2: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 2

Material for this tutorial• Utils: VirtualBox Software (64-bit)

• Tutorial VirtualBox image- Khronos OpenVX ‘Sample’ implementation- Open source OpenVX implementation- Tutorial source code and video inputs- OpenVX 1.2 specification (pdf)- IDE: qtcreator

• OpenVX spec in HTML and other OpenVX resources: www.khronos.org/registry/vx

• OpenVX tutorial resources on github:github.com/rgiduthuri/openvx_tutorial

Page 3: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 3

Feature Tracking Example Input Image from CAMERA

vx_image

Convert to Grayscale

vx_image

Copy of Data from Previous Iteration

keep old copy

vx_pyramid at t=N-1

vx_delay of pyramids

keypoint array(x, y, …) at t=N-1

vx_delay of keypoints

vx_contextOptical

Flow (LK)vx_node

vx_graph

Compute Pyramid

Computed Data

vx_pyramid at t=N

keypoint array(x, y, …) at t=N

Harris Detector

vx_array

vx_node

vx_graph

Page 4: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 4

Basic OpenVX ComponentsContext

Data ObjectsImage, Tensor, Pyramid, Array, LUT, Remap, Scalar,Threshold, Distribution, Matrix,Convolution, Delay, ObjectArray

KernelsBuilt-in vision functions,Vendor extensions,User-defined

MiscellaneousDirectives, Hints, Logging, Performance Measurements

Graphs

NodesKernel instances, parameters,attributes

Virtual Data ObjectsIntermediate data without host access,enables several optimizations

ExtensionsNN, Import/Export, ICD, …

Page 5: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 5

Context

• Context- OpenVX world: need to be created first- All objects belong to a context

vx_context context = vxCreateContext();

See “VX/vx_api.h” for framework API function definitions

Page 6: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 6

•Explicit status check-Object creation: use vxGetStatus to check the object

•More info from the log callback

Error Management• Methods return a status

-vx_status returned: VX_SUCCESS when no error

if( vxProcessGraph( graph ) != VX_SUCCESS) { /* Error */ }

vx_context context = vxCreateContext();if( vxGetStatus( (vx_reference)context ) != VX_SUCCESS ) { /* Error */ }

void logCallback( vx_context c, vx_reference r, vx_status s,const vx_char string[] )

{ /* Do something */ }...vxRegisterLogCallback( context, logCallback, vx_false_e );...vxAddLogEntry( reference, VX_INVALID_VALUE, ”specified value is out of range” );

See “VX/vx_types.h” for type definitions and error codes

Page 7: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 7

Data objects

vx_image img = vxCreateImage( context, 640, 400, VX_DF_IMAGE_RGB );// Use the imagevxReleaseImage( &img );

•The application gets only references to objects, not the objects-References should be released by the application when not needed-Ref-counted object is destroyed by OpenVX when not referenced any more

•Object-Oriented Behavior-strongly typed (good for safety-critical applications)-OpenVX are really pointers to structs- any object may be down-cast to a vx_reference, e.g., for passing to vxGetStatus()

•Opaque-Access to content explicit and temporary (map/unmap or copy)- No permanent pointer to internal data

-Needed to handle complex memory hierarchies- DSP local memory- GPU dedicated memory

Page 8: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 8

Data Object Creation

vx_image img = vxCreateImage( ctx, 640, 400, VX_DF_IMAGE_UYVY ); // 13 standard formats

vx_pyramid pyr = vxCreatePyramid( ctx, levels, VX_SCALE_PYRAMID_HALF, 640, 400, VX_DF_IMAGE_U8 );

vx_array arr = vxCreateArray( ctx, VX_TYPE_KEYPOINT, capacity ); // array of vx_keypoint_t[]

vx_lut lut = vxCreateLUT( ctx, VX_TYPE_UINT8, 256 ); // 8-bit look-up table

vx_remap remap = vxCreateRemap( ctx, src_width, src_height, dst_width, dst_height );

vx_float32 scalar_initial_value = 1.25f;vx_scalar scalar = vxCreateScalar( ctx, VX_TYPE_FLOAT32, &scalar_initial_value );

vx_matrix mat = vxCreateMatrix( ctx, VX_TYPE_FLOAT32, columns, rows );

vx_delay delay = vxCreateDelay( ctx, (vx_reference)ex, num_slots );

vx_object_array obj_arr = vxCreateObjectArray( ctx, (vx_reference)pyr, count );

vx_distribution dist = vxCreateDistribution( ctx, num_bins, offset, range );

Page 9: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 9

Array Data Objectvx_array vxCreateArray( vx_context context,

vx_enum item_type, // VX_TYPE_KEYPOINT, VX_TYPE_UINT32, ...vx_size capacity );

0 1 2 3 4 5 6 7 8 9 10 11 ... capacity-1

num_items

vx_array array = vxCreateArray( context, VX_TYPE_RECTANGLE, 64 );…// remove all items from array and add 8 itemsvxTruncateArray( array, 0 );vxAddArrayItems( array, 8, &rect[0], sizeof(vx_rectangle_t) );

…// get number items in the array by querying array attributevxQueryArray( array, VX_ARRAY_ATTRIBUTE_NUMITEMS, &n_items, sizeof(n_items) );

Page 10: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 10

Pyramid Data Object

vx_pyramid vxCreatePyramid( vx_context context,vx_size levels,vx_float32 scale, // VX_SCALE_PYRAMID_HALF or PYRAMID_ORBvx_uint32 width,vx_uint32 height,vx_df_image format // VX_DF_IMAGE_U8 );

Level 0 (base)

Level 1

Level 2Level 3

Example:vx_pyramid pyramid = vxCreatePyramid( context, … );// ...

// get image at pyramid level 2vx_image img2 = vxGetPyramidLevel( pyramid, 2 );// ... vxReleaseImage( &img2 );// ...

vxReleasePyramid( &pyramid );

Page 11: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 11

Delay Data Objectvx_delay vxCreateDelay( vx_context context,

vx_reference exemplar,vx_size count );

Example:vx_pyramid exemplar = vxCreatePyramid( context, … );vx_delay pyr_delay = vxCreateDelay( context, (vx_reference)exemplar, 2 );vxReleasePyramid( &exemplar );…vx_pyramid pyr_0 = (vx_pyramid)vxGetReferenceFromDelay( pyr_delay, 0 );vx_pyramid pyr_1 = (vx_pyramid)vxGetReferenceFromDelay( pyr_delay, -1 );… vxAgeDelay( pyr_delay );

Page 12: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 12

Data Objects

keypoint array(x, y, …) at t=N

Computed Data

keypoint array(x, y, …) at t=N-1

Copy of Data from Previous Iteration

keep old copy

Input Image from CAMERA

vx_pyramid at t=N-1 vx_pyramid at t=N

vx_image

vx_array

vx_delay of pyramids

vx_delay of keypoints

vx_context

Page 13: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

OpenVX Graphvx_context context = vxCreateContext();vx_image input = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8 );vx_image output = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8 );

vx_graph graph = vxCreateGraph( context );vx_image intermediate = vxCreateVirtualImage( graph, 640, 480, VX_DF_IMAGE_U8 );vx_node F1 = vxF1Node( graph, input, intermediate );vx_node F2 = vxF2Node( graph, intermediate, output );vxVerifyGraph( graph );while(...) {// … write to input image … vxProcessGraph( graph );// … read from output image …

}

outputinput F1 F2

contextgraph

inter-mediate

Page 14: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 14

Basic OpenVX Vision Functions

Kernels

Element-wise FunctionsAdd, Subtract, Multiply, AbsDiff,And, Or, Xor, Not, Min, Max, Magnitude, Phase,Threshold, TableLookup, ColorDepth,ChannelExtract, ChannelCombine,ColorConvert, Copy,AccumulateImage [Squared/Weighted],Tensor Add/Subtract/Multiply/LUT/…

Reduction FunctionsHistogram, MeanStdDev, MinMaxLoc Complex Functions

CannyEdgeDetector, EqualizeHist,FastCorners, HarrisCorners, IntegralImage,OpticalFlowPyrLK, HoughLinesP, MatrixMult,…

Filtering FunctionsBox3x3, Convolve, Dilate3x3, Erode3x3,Gaussian3x3, Median3x3, Sobel3x3,GaussianPyramid, NonLinearFilter,LaplacianPyramid/Reconstruct, NonMaxSupression, Bilateral, LBP, HOG, …

Geometric FunctionsRemap, ScaleImage, WarpAffine,WarpPerspective, HalfScaleGaussian

See “VX/vx_nodes.h” for functions to create kernel instances (nodes) in a graph

Control FlowScalar Operations, Select

Page 15: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 15

Harris Graph

Computed Data

Input Image from CAMERA

GaussianPyramid

vx_pyramid at t=N

vx_image(RGB)

vx_delay of pyramids

vx_delay of keypoints

vx_context

vx_graph

vx_image (virtual U008)

ChannelExtract

vx_node

vx_node

vx_image (virtual IYUV)

ColorConvert

vx_node

keypoint array(x, y, …) at t=N

HarrisCorners

vx_array

vx_nodeadditionalparameters

Page 16: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 16

Vision Functions in a Graph• RGB -> YUV

vxColorConvertNode( graph, input_rgb_image, harris_yuv_image );

VX_DF_IMAGE_RGB VX_DF_IMAGE_YUV

vxChannelExtractNode( graph, harris_yuv_image, VX_CHANNEL_Y, harris_gray_image );

VX_DF_IMAGE_YUV VX_DF_IMAGE_U8

vxHarrisCornersNode( graph, harris_gray_image, strength_thresh, min_distance,sensitivity, gradient_size, block_size,keypoint_array_output, NULL );

• YUV -> Y

•Harris corner- strength_thresh : 0.0005f- min_distance : 5.0f- sensitivity : 0.04f- gradient_size : 3- block_size : 3

Page 17: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 17

Arguments: vx_scalar vs. built-in type•vx_scalar- When an input to a node can change dynamically- vx_float32 harris_strength_thresh = 0.0005f;vx_scalar strength_thresh = vxCreateScalar( context,

VX_TYPE_FLOAT32,&harris_strength_thresh );

•built-in type- When an input to a node is fixed- vx_int32 harris_gradient_size = 3; // window size for

// gradient computation

Page 18: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 18

Optical Flow Graph

Computed Data

keypoint array(x, y, …) at t=N-1

Copy of Data from Previous Iteration

keep old copy

vx_pyramid at t=N-1

keypoint array(x, y, …) at t=N

vx_pyramid at t=N

vx_array

vx_delay of pyramids

vx_delay of keypoints

vx_context

Page 19: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 19

Optical Flow GraphGaussianPyramid

Computed Data

ColorConvert

Input Image from CAMERA

keypoint array(x, y, …) at t=N-1

Copy of Data from Previous Iteration

keep old copy

vx_pyramid at t=N-1 vx_pyramid at t=N

vx_image(RGB)

vx_image (virtual U008)

vx_delay of pyramids

vx_delay of keypoints

vx_context

ChannelExtract

vx_image(virtual IYUV)

vx_node

vx_node

vx_node

vx_graph

vx_array

keypoint array(x, y, …) at t=N

OpticalFlowPyrLK

vx_nodeadditionalparameters

Page 20: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 20

Feature Tracking Graphs in a nutshell

keypoint array(x, y, …) at t=N

GaussianPyramid

Computed Data

keypoint array(x, y, …) at t=N-1

Copy of Data from Previous Iteration

keep old copy

ColorConvert

Input Image from CAMERA

vx_pyramid at t=N-1 vx_pyramid at t=N

vx_image(RGB)

vx_image (virtual U008)

vx_array

vx_delay of pyramids

vx_delay of keypoints

vx_context

ChannelExtract

vx_image (virtual IYUV)

vx_node

vx_node

vx_node

OpticalFlowPyrLK

vx_graph

vx_node

HarrisCorners

vx_node

vx_graph

additionalparameters

additionalparameters

Page 21: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 21

Opaque Data Object Access• Data Memory Ownership

- Unless explicitly granted, the OpenVX framework owns the memory- The framework has the flexibility to move memory anywhere in the system

OpenVX Framework Application

vxCreateType(...)

vxMapType(...)

vxUnmapType(...)

ownershiptime

vxReleaseType(...) [ref-count=0]

The data memory must NOT be accessed

directly by the applicationwithout explicit ownership grant

Page 22: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 22

Opaque Data Object Access• Data Memory Ownership of Image created using Externally Allocated Memory

- Unless explicitly granted, the OpenVX framework owns the memory

OpenVX Framework Application

vxCreateImageFromHandle(...)

vxSwapImageHandle(...) or vxMapImagePatch(...)

vxSwapImageHandle(...) or vxUnmapImagePatch(...)

ownershiptime

vxReleaseImage(...) [ref-count=0]

The original pointer must NOT be accessed

directly by the applicationafter image object creation

Page 23: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 23

Image Access (1/4) : Write to OpenVX image• Copy using application-controlled address and memory layout- vxCopyImagePatch: copy (Read or Write)

vx_imagepatch_addressing_t addr = { /* fill stride_x & stride_y */ };vx_rectangle_t rect = { 0u, 0u, width, height };vxCopyImagePatch( img, &rect, plane, &addr, my_array,

VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, VX_NOGAP_X );

Page 24: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 24

Image Access (2/4) : View / edit OpenVX image• Access limited in time- vxMapImagePatch: get access (Read, Write, Read & Write)- vxUnmapImagePatch: release the access

vx_map_id map_id;void * ptr;vx_imagepatch_addressing_t addr;vx_rectangle_t rect = { 0u, 0u, width, height };vxMapImagePatch( img, &rect, plane, &map_id, &addr, &ptr,

VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, VX_NOGAP_X );// Access data in ptrvxUnmapImagePatch( img, map_id );

Page 25: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 25

Image Access (3/4) : Region of interesttypedef struct _vx_rectangle_t {

vx_uint32 start_x; /*!< \brief The Start X coordinate. */vx_uint32 start_y; /*!< \brief The Start Y coordinate. */vx_uint32 end_x; /*!< \brief The End X coordinate. */vx_uint32 end_y; /*!< \brief The End Y coordinate. */

} vx_rectangle_t;

Image

end : outside

start : inside

Patch

Page 26: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 26

Image Access (4/4) : Memory Layouttypedef struct _vx_imagepatch_addressing_t {

vx_uint32 dim_x;vx_uint32 dim_y;vx_int32 stride_x;vx_int32 stride_y;vx_uint32 scale_x;vx_uint32 scale_y;vx_uint32 step_x;vx_uint32 step_y;

} vx_imagepatch_addressing_t;

……

Num of (logical) pixels in a row

Patch

Num of (logical) pixels in a columnNum of bytes between the beginning of 2 successive pixels

stride_x

stride_y

Num of bytes between the beginning of 2 successive lines

Sub-sampling :1 physical pixel every ‘step’ logical pixelscale = VX_SCALE_UNITY / step

Page 27: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 27

Array Access (1/2) : Write to array• Copy using application controlled address and memory layout- vxCopyArrayRange: copy (Read or Write)

vxQueryArray( arr, VX_ARRAY_ATTRIBUTE_NUMITEMS, &num_items, sizeof(num_items) );vxCopyArrayRange( arr, 0, num_items, sizeof(my_array[0]), &my_array[0],

VX_READ_ONLY, VX_MEMORY_TYPE_HOST );

Page 28: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 28

Array Access (2/2) : View / edit array• Access limited in time- vxMapArrayRange: get access (Read, Write, Read & Write)- vxUnmapArrayRange: release the access

vx_map_id map_id;void * ptr;vxQueryArray( arr, VX_ARRAY_ATTRIBUTE_NUMITEMS, &num_items, sizeof(num_items) );vxMapArrayRange( arr, 0, num_items, &map_id, &stride, &ptr,

VX_READ_AND_WRITE, VX_MEMORY_TYPE_HOST, 0 );// Access data in ptrvxUnmapArrayRange( arr, map_id );

Page 29: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 29

OpenVX Object Attributes• Specific information about OpenVX objects can be queried using vxQueryType(...) API

vxQueryImage(image, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(width)); // meta-datavxQueryImage(image, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height));vxQueryImage(image, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format));vxQueryImage(image, VX_IMAGE_ATTRIBUTE_PLANES, &planes, sizeof(planes)); // derived

vxQueryArray(array, VX_ARRAY_ATTRIBUTE_ITEMTYPE, &type, sizeof(type));vxQueryArray(array, VX_ARRAY_ATTRIBUTE_CAPACITY, &capacity, sizeof(capacity));vxQueryArray(array, VX_ARRAY_ATTRIBUTE_ITEMSIZE, &size, sizeof(size));vxQueryArray(array, VX_ARRAY_ATTRIBUTE_NUMITEMS, &num_items, sizeof(num_items));

vxQueryGraph(graph, VX_GRAPH_ATTRIBUTE_PERFORMANCE, &perf, sizeof(perf)); // changes

• Specific information about OpenVX objects can be setvxSetConvolutionAttribute(conv, VX_CONVOLUTION_ATTRIBUTE_SCALE, &scale, sizeof(scale));vxSetNodeAttribute(node, VX_NODE_ATTRIBUTE_BORDER_MODE, &mode, sizeof(mode));

Page 30: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 30

Execute a Graph in a Loop to Process Input• Before executing Harris & Optical Flow Graphs

- vxVerifyGraph() should return VX_SUCCESS (outside the loop)

• Inside the loop -- process each image from input video sequence- write pixels from input video into input RGB image- Execute Graphs using vxProcessGraph()

- First frame: Execute Harris Graph - The rest: Execute Optical Flow Graph

- Read the previous and current keypoints and draw- Use vxGetReferenceFromDelay() to access the arrays

- Shift the current pyramid and keypoints so they become previous- Use vxAgeDelay()

• After the processing loop- Query VX_GRAPH_ATTRIBUTE_PERFORMANCE for performance measurements- Release all objects – context should be the last one

Page 31: Hands-on programming session - Khronos Group · 2018. 2. 2. · OpenVX Graph vx_contextcontext = vxCreateContext(); vx_imageinput = vxCreateImage( context, 640, 480, VX_DF_IMAGE_U8

© Copyright Khronos Group 2018 - Page 31

Summary• OpenVX is a low-level programming framework to enable software developers to- efficiently access computer vision hardware acceleration - with both functional and performance portability

• OpenVX contains:- a library of predefined and customizable vision functions- a graph-based execution model with task and data-independent execution- a set of memory objects that abstract the physical memory

• OpenVX is defined as a C API- object-oriented design- synchronous and asynchronous execution model- well-defined extension model


Recommended