diff --git a/asyncarray.cpp b/asyncarray.cpp new file mode 100644 index 0000000..b457ff8 --- /dev/null +++ b/asyncarray.cpp @@ -0,0 +1,28 @@ +// +build openvino + +#include +#include "asyncarray.h" + + +// AsyncArray_New creates a new empty AsyncArray +AsyncArray AsyncArray_New() { + return new cv::AsyncArray(); +} + +// AsyncArray_Close deletes an existing AsyncArray +void AsyncArray_Close(AsyncArray a) { + delete a; +} + +const char* AsyncArray_GetAsync(AsyncArray async_out,Mat out) { + try { + async_out->get(*out); + } catch(cv::Exception ex) { + return ex.err.c_str(); + } + return ""; +} + +AsyncArray Net_forwardAsync(Net net, const char* outputName) { + return new cv::AsyncArray(net->forwardAsync(outputName)); +} diff --git a/asyncarray.go b/asyncarray.go new file mode 100644 index 0000000..345ec5e --- /dev/null +++ b/asyncarray.go @@ -0,0 +1,52 @@ +// +build openvino + +package gocv + +import ( + "errors" +) + +/* +#include +#include "dnn.h" +#include "asyncarray.h" +#include "core.h" +*/ +import "C" + +type AsyncArray struct { + p C.AsyncArray +} + +// NewAsyncArray returns a new empty AsyncArray. +func NewAsyncArray() AsyncArray { + return newAsyncArray(C.AsyncArray_New()) +} + +// Ptr returns the AsyncArray's underlying object pointer. +func (a *AsyncArray) Ptr() C.AsyncArray { + return a.p +} + +// Get async returns the Mat +func (m *AsyncArray) Get(mat *Mat) error { + result := C.AsyncArray_GetAsync(m.p, mat.p) + err := C.GoString(result) + + if len(err) > 0 { + return errors.New(err) + } + return nil +} + +// newAsyncArray returns a new AsyncArray from a C AsyncArray +func newAsyncArray(p C.AsyncArray) AsyncArray { + return AsyncArray{p: p} +} + +// Close the AsyncArray object. +func (a *AsyncArray) Close() error { + C.AsyncArray_Close(a.p) + a.p = nil + return nil +} diff --git a/asyncarray.h b/asyncarray.h new file mode 100644 index 0000000..cf894b6 --- /dev/null +++ b/asyncarray.h @@ -0,0 +1,23 @@ +#ifdef __cplusplus +#include +extern "C" { +#endif + +#include "core.h" +#include "dnn.h" + +#ifdef __cplusplus +typedef cv::AsyncArray* AsyncArray; +#else +typedef void* AsyncArray; +#endif + +AsyncArray AsyncArray_New(); +const char* AsyncArray_GetAsync(AsyncArray async_out,Mat out); +void AsyncArray_Close(AsyncArray a); +AsyncArray Net_forwardAsync(Net net, const char* outputName); + + +#ifdef __cplusplus +} +#endif diff --git a/asyncarray_test.go b/asyncarray_test.go new file mode 100644 index 0000000..8af0cfa --- /dev/null +++ b/asyncarray_test.go @@ -0,0 +1,16 @@ +// +build openvino + +package gocv + +import ( + "testing" +) + +func TestAsyncArray(t *testing.T) { + asyncarray := NewAsyncArray() + defer asyncarray.Close() + + if asyncarray.Ptr() == nil { + t.Error("New AsyncArray should not be nil") + } +} diff --git a/dnn_async_openvino.go b/dnn_async_openvino.go new file mode 100644 index 0000000..0425d99 --- /dev/null +++ b/dnn_async_openvino.go @@ -0,0 +1,26 @@ +// +build openvino + +package gocv + +import ( + "unsafe" +) + +/* +#include +#include "dnn.h" +#include "asyncarray.h" +*/ +import "C" + +// ForwardAsync runs forward pass to compute output of layer with name outputName. +// +// For further details, please see: +// https://docs.opencv.org/trunk/db/d30/classcv_1_1dnn_1_1Net.html#a814890154ea9e10b132fec00b6f6ba30 +// +func (net *Net) ForwardAsync(outputName string) AsyncArray { + cName := C.CString(outputName) + defer C.free(unsafe.Pointer(cName)) + + return newAsyncArray(C.Net_forwardAsync((C.Net)(net.p), cName)) +}