From d3b3f6b835cb7fcbb3712f876e84c8ed625170a2 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 15 一月 2020 11:30:08 +0800
Subject: [PATCH] Merge branch 'cuda-8.0' of ssh://192.168.5.5:29418/libgowrapper/face into cuda-8.0

---
 goface.go |  103 ++++++++++++++++++++++++++++++---------------------
 1 files changed, 61 insertions(+), 42 deletions(-)

diff --git a/goface.go b/goface.go
index e77e23c..7891acf 100644
--- a/goface.go
+++ b/goface.go
@@ -22,6 +22,7 @@
 
 // SDKFace sdk
 type SDKFace struct {
+	handle      unsafe.Pointer
 	detector    bool
 	extractor   bool
 	propertizer bool
@@ -31,8 +32,13 @@
 
 // NewSDK sdk
 func NewSDK(fn func(...interface{})) *SDKFace {
+	h := C.create_sdkface()
+	if h == nil {
+		return nil
+	}
 
 	return &SDKFace{
+		handle:      h,
 		detector:    false,
 		extractor:   false,
 		propertizer: false,
@@ -43,7 +49,9 @@
 
 // Free free
 func (s *SDKFace) Free() {
-	C.c_api_release()
+	if s != nil && s.handle != nil {
+		C.release(s.handle)
+	}
 }
 
 func (s *SDKFace) printLog(l ...interface{}) {
@@ -53,14 +61,12 @@
 }
 
 // Detector detector
-func (s *SDKFace) Detector(minFaces, rollAngle, threadMax, gpu int) bool {
+func (s *SDKFace) Detector(minFaces, rollAngles, threadMax, gpu int) bool {
 
 	if s.detector {
 		return true
 	}
-
-	ret := C.c_api_face_detector_init(C.int(threadMax), C.int(gpu), C.int(minFaces), C.int(rollAngle))
-
+	ret := C.init_detector(s.handle, C.int(minFaces), C.int(rollAngles), C.int(threadMax), C.int(gpu))
 	if ret <= 0 {
 		s.printLog("->face--> CREATE Detector ERROR: ", ret)
 		return false
@@ -75,7 +81,7 @@
 	if s.extractor {
 		return true
 	}
-	ret := C.c_api_face_extractor_init(C.int(threadMax), C.int(gpu))
+	ret := C.init_extractor(s.handle, C.int(threadMax), C.int(gpu))
 	if ret <= 0 {
 		s.printLog("->face--> CREATE Extractor ERROR: ", ret)
 		return false
@@ -90,7 +96,7 @@
 	if s.propertizer {
 		return true
 	}
-	ret := C.c_api_face_property_init(C.int(threadMax))
+	ret := C.init_propertizer(s.handle, C.int(threadMax))
 	if ret <= 0 {
 		s.printLog("->face--> CREATE Propertizer ERROR: ", ret)
 		return false
@@ -103,9 +109,10 @@
 func (s *SDKFace) Tracker(w, h, maxFaces, interval, sampleSize, threadMax, gpu int) bool {
 
 	if s.tracker {
-		return true
+		return s.tracker
 	}
-	ret := C.c_api_face_tracker_init(C.int(threadMax), C.int(gpu), C.int(w), C.int(h), C.int(maxFaces), C.int(interval), C.int(sampleSize))
+	ret := C.init_tracker(s.handle, C.int(w), C.int(h), C.int(maxFaces), C.int(interval), C.int(sampleSize), C.int(threadMax), C.int(gpu))
+
 	if ret <= 0 {
 		s.printLog("->face--> CREATE Tracker ERROR: ", ret)
 		return false
@@ -134,32 +141,29 @@
 		return nil
 	}
 
+	var cfpos unsafe.Pointer
 	var count C.int
-	cfpos := C.c_api_face_detect(&count, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
-	if cfpos != nil {
-		defer C.free(unsafe.Pointer(cfpos))
-		return CFacePosArrayToGoArray(unsafe.Pointer(cfpos), int(count))
+	ret := C.detect(s.handle, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &cfpos, &count)
+	if ret > 0 {
+		return CFacePosArrayToGoArray(cfpos, int(count))
 	}
-
-	s.printLog("->face--> Detect No One")
+	s.printLog("->face--> Detect No One, Ret: ", ret)
 	return nil
 }
 
 // Extract extract
 func (s *SDKFace) Extract(fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) []byte {
-	if !s.extractor {
-		return nil
-	}
 
-	var featLen C.int
 	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
 
-	p := C.c_api_face_extract(&featLen, pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
-	if p != nil {
-		defer C.free(unsafe.Pointer(p))
-		return C.GoBytes(unsafe.Pointer(p), featLen)
+	//(void *handle, const cFacePos *pos, const void*data, const int w, const int h, const int c, const int chan, void **feat, int *featLen);
+	var feat unsafe.Pointer
+	var featLen C.int
+	ret := C.extract(s.handle, pos, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &feat, &featLen)
+	if ret > 0 {
+		return C.GoBytes(feat, featLen)
 	}
-	s.printLog("->face--> Extract Nothing")
+	s.printLog("->face--> Extract Nothing, Ret: ", ret)
 	return nil
 }
 
@@ -170,20 +174,27 @@
 		return 0
 	}
 
-	res := C.c_api_face_compare((*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))
+	res := C.compare(s.handle, (*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))
 	return float32(res)
 }
 
 // Propertize prop
-func (s *SDKFace) Propertize(fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) sdkstruct.CThftResult {
+func (s *SDKFace) Propertize(fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) *sdkstruct.CThftResult {
 	if !s.propertizer {
-		return sdkstruct.CThftResult{Age: 0}
+		return nil
 	}
 
 	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
-	result := C.c_api_face_property(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
-	s.printLog("->face--> Propertize")
-	return *(*sdkstruct.CThftResult)(unsafe.Pointer(&result))
+
+	var thft unsafe.Pointer
+	ret := C.propertize(s.handle, pos, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &thft)
+	if ret == 0 {
+		gothft := *(*sdkstruct.CThftResult)(thft)
+		C.free(thft)
+		return &gothft
+	}
+	s.printLog("->face--> Propertize Nothing, Ret: ", ret)
+	return nil
 }
 
 // CFaceInfoArrayToGoArray convert cFaceInfo array to go
@@ -207,14 +218,17 @@
 	//img, const int chan, void **fInfo, int *fcnt);
 
 	var fCount C.int
-	cFinfo := C.c_api_face_track(&fCount, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
-	// fmt.Println("cFinfo detected:", cFinfo)
-	if cFinfo == nil {
-		return nil
+	var finfos unsafe.Pointer
+	ret := C.track(s.handle, unsafe.Pointer(&data[0]), C.int(w), C.int(h), C.int(c), C.int(ch), &finfos, &fCount)
+
+	if ret > 0 {
+		faces := CFaceInfoArrayToGoArray(finfos, int(fCount))
+		//if len(faces) > 0{
+		// fmt.Println("faces detected:", len(faces))
+		//}
+		return faces
 	}
-	defer C.free(unsafe.Pointer(cFinfo))
-	faces := CFaceInfoArrayToGoArray(unsafe.Pointer(cFinfo), int(fCount))
-	return faces
+	return nil
 }
 
 // FaceInfo2FacePos info -> pos
@@ -235,13 +249,18 @@
 }
 
 // TrackerResize init face tracker
-func (s *SDKFace) TrackerResize(w, h, ch int) int {
+func (s *SDKFace) TrackerResize(w, h, ch int) bool {
 
 	if !s.tracker {
 		s.printLog("->face--> TrackerResize Failed, No Tracker Init")
-		return -1
+		return false
 	}
-	return int(C.c_api_face_track_resize(C.int(ch), C.int(w), C.int(h)))
+	ret := C.track_resize(s.handle, C.int(w), C.int(h), C.int(ch))
+	if ret == 1 {
+		return true
+	}
+	s.printLog("->face--> TrackerResize Failed, Ret: ", ret, " SDK Channel: ", ch, " Size: ", w, "x", h)
+	return false
 }
 
 // Run run
@@ -272,7 +291,7 @@
 
 		//杩愯sd
 		dec := FaceInfo2FacePos(d)
-		p := s.Propertize(dec, data, w, h, c, dchan)
+		p := s.Propertize(dec, data, w, h, c, 0)
 		feat := s.Extract(dec, data, w, h, c, dchan)
 
 		/// filter rules
@@ -280,7 +299,7 @@
 		// size := (d.RcFace.Right - d.RcFace.Left) * (d.RcFace.Bottom - d.RcFace.Top)
 		// angle := d.FAngle
 		// if !filter(rMsg.Msg.Tasklab.Taskid, sdkid, angle.Confidence, float32(angle.Yaw), int(size)) {
-		// 	continue
+		//     continue
 		// }
 		/// filter rules
 

--
Gitblit v1.8.0