Skip to content

Commit a5ad463

Browse files
committed
feat: Add image detection bindings
Signed-off-by: Anastassios Nanos <ananos@nubificus.co.uk>
1 parent d7e5e84 commit a5ad463

2 files changed

Lines changed: 165 additions & 0 deletions

File tree

examples/detect/main.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
"os"
8+
9+
"github.com/nubificus/vaccel-go/vaccel"
10+
)
11+
12+
func main() {
13+
14+
if len(os.Args) < 2 || len(os.Args) > 3 {
15+
fmt.Printf("Usage: %s <filename> [model]\n", os.Args[0])
16+
return
17+
}
18+
19+
image := os.Args[1]
20+
imageBytes, e := os.ReadFile(image)
21+
if e != nil {
22+
fmt.Printf("Error reading file: %s\n", e)
23+
os.Exit(1)
24+
}
25+
26+
var outImgName string
27+
var session vaccel.Session
28+
var resource vaccel.Resource
29+
30+
err := session.Init(0)
31+
if err != vaccel.OK {
32+
fmt.Println("error initializing session")
33+
os.Exit(err)
34+
}
35+
36+
if len(os.Args) == 3 {
37+
model := os.Args[2]
38+
err = resource.Init(model, vaccel.ResourceModel)
39+
if err != vaccel.OK {
40+
fmt.Printf("error initializing resource: %d\n", err)
41+
goto ReleaseSession
42+
}
43+
44+
err = session.Register(&resource)
45+
if err != vaccel.OK {
46+
fmt.Printf("error while registering resource: %d\n", err)
47+
goto ReleaseResource
48+
}
49+
}
50+
51+
outImgName, err = vaccel.ImageDetectionFromFile(&session, image)
52+
if err != vaccel.OK {
53+
fmt.Println("Image Detection failed")
54+
goto UnregisterResource
55+
}
56+
fmt.Println("Output(1): ", outImgName)
57+
58+
outImgName, err = vaccel.ImageDetection(&session, imageBytes)
59+
if err != vaccel.OK {
60+
fmt.Println("Image Detection failed")
61+
goto UnregisterResource
62+
}
63+
fmt.Println("Output(2): ", outImgName)
64+
65+
UnregisterResource:
66+
if len(os.Args) == 3 {
67+
err = session.Unregister(&resource)
68+
if err != vaccel.OK {
69+
fmt.Printf("Could not unregister resource: %d\n", err)
70+
}
71+
}
72+
ReleaseResource:
73+
if len(os.Args) == 3 {
74+
err = resource.Release()
75+
if err != vaccel.OK {
76+
fmt.Printf("Could not release resource: %d\n", err)
77+
}
78+
}
79+
ReleaseSession:
80+
err = session.Release()
81+
if err != vaccel.OK {
82+
fmt.Println("An error occurred while freeing the session")
83+
os.Exit(1)
84+
}
85+
}

vaccel/image_detection.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
3+
package vaccel
4+
5+
/*
6+
#cgo pkg-config: vaccel
7+
#cgo LDFLAGS: -lvaccel -ldl
8+
#include <vaccel.h>
9+
10+
*/
11+
import "C"
12+
import (
13+
"fmt"
14+
"os"
15+
"unsafe"
16+
)
17+
18+
func ImageDetectionFromFile(sess *Session, imagePath string) (string, int) {
19+
20+
imageBytes, err := os.ReadFile(imagePath)
21+
if err != nil {
22+
fmt.Printf("Error reading file: %s\n", err)
23+
os.Exit(1)
24+
}
25+
26+
cImageBytes := (*C.uchar)(&imageBytes[0])
27+
cImgBuf := unsafe.Pointer(cImageBytes)
28+
cImgLen := C.size_t(len(imageBytes))
29+
30+
cOutImageName := (*C.uchar)(C.malloc(C.size_t(256)))
31+
32+
/* Free the memory when done */
33+
defer C.free(unsafe.Pointer(cOutImageName))
34+
35+
cRet := C.vaccel_image_detection(
36+
sess.cSess, cImgBuf, cOutImageName,
37+
cImgLen, C.size_t(256)) //nolint:gocritic
38+
39+
var golangOut string
40+
41+
if int(cRet) == 0 {
42+
ptr := unsafe.Pointer(cOutImageName)
43+
typeCast := (*C.char)(ptr)
44+
golangOut = C.GoString(typeCast)
45+
} else {
46+
golangOut =
47+
"A problem occurred while running the Operation"
48+
}
49+
50+
return golangOut, int(cRet)
51+
}
52+
53+
func ImageDetection(sess *Session, image []byte) (string, int) {
54+
55+
cImageBytes := (*C.uchar)(&image[0])
56+
cImgBuf := unsafe.Pointer(cImageBytes)
57+
cImgLen := C.size_t(len(image))
58+
59+
cOutImageName := (*C.uchar)(C.malloc(C.size_t(256)))
60+
61+
/* Free the memory when done */
62+
defer C.free(unsafe.Pointer(cOutImageName))
63+
64+
cRet := C.vaccel_image_detection(
65+
sess.cSess, cImgBuf, cOutImageName,
66+
cImgLen, C.size_t(256)) //nolint:gocritic
67+
68+
var golangOut string
69+
70+
if int(cRet) == 0 {
71+
ptr := unsafe.Pointer(cOutImageName)
72+
typeCast := (*C.char)(ptr)
73+
golangOut = C.GoString(typeCast)
74+
} else {
75+
golangOut =
76+
"A problem occurred while running the Operation"
77+
}
78+
79+
return golangOut, int(cRet)
80+
}

0 commit comments

Comments
 (0)