Add openvino async

This commit is contained in:
Даниил Корековцев
2019-12-12 12:10:41 +03:00
committed by Ron Evans
parent 938a6796cc
commit 5819b25a38
5 changed files with 145 additions and 0 deletions

28
asyncarray.cpp Normal file
View File

@@ -0,0 +1,28 @@
// +build openvino
#include <string.h>
#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));
}

52
asyncarray.go Normal file
View File

@@ -0,0 +1,52 @@
// +build openvino
package gocv
import (
"errors"
)
/*
#include <stdlib.h>
#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
}

23
asyncarray.h Normal file
View File

@@ -0,0 +1,23 @@
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
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

16
asyncarray_test.go Normal file
View File

@@ -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")
}
}

26
dnn_async_openvino.go Normal file
View File

@@ -0,0 +1,26 @@
// +build openvino
package gocv
import (
"unsafe"
)
/*
#include <stdlib.h>
#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))
}