From 0ffd95f2278e860736e46f8b73f357470f5a3d91 Mon Sep 17 00:00:00 2001
From: zhangmeng <775834166@qq.com>
Date: 星期三, 15 一月 2020 17:56:18 +0800
Subject: [PATCH] debug

---
 goface.go |  237 +++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 133 insertions(+), 104 deletions(-)

diff --git a/goface.go b/goface.go
index b584d4d..79689bb 100644
--- a/goface.go
+++ b/goface.go
@@ -12,14 +12,16 @@
 */
 import "C"
 import (
+	"errors"
 	"unsafe"
 
 	"basic.com/libgowrapper/sdkstruct.git"
+	"basic.com/pubsub/protomsg.git"
+	"github.com/gogo/protobuf/proto"
 )
 
 // SDKFace sdk
 type SDKFace struct {
-	handle      unsafe.Pointer
 	detector    bool
 	extractor   bool
 	propertizer bool
@@ -28,14 +30,9 @@
 }
 
 // NewSDK sdk
-func NewSDK(fn func(...interface{})) interface{} {
-	h := C.create_sdkface()
-	if h == nil {
-		return nil
-	}
+func NewSDK(fn func(...interface{})) *SDKFace {
 
 	return &SDKFace{
-		handle:      h,
 		detector:    false,
 		extractor:   false,
 		propertizer: false,
@@ -45,11 +42,8 @@
 }
 
 // Free free
-func Free(i interface{}) {
-	s := i.(*SDKFace)
-	if s != nil && s.handle != nil {
-		C.release(s.handle)
-	}
+func (s *SDKFace) Free() {
+	C.c_api_release()
 }
 
 func (s *SDKFace) printLog(l ...interface{}) {
@@ -59,60 +53,67 @@
 }
 
 // Detector detector
-func Detector(i interface{}, minFaces, rollAngles, threadMax, gpu int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) Detector(minFaces, rollAngle, threadMax, gpu int) bool {
+
 	if s.detector {
 		return true
 	}
-	ret := C.init_detector(s.handle, C.int(minFaces), C.int(rollAngles), C.int(threadMax), C.int(gpu))
+
+	ret := C.c_api_face_detector_init(C.int(threadMax), C.int(gpu), C.int(minFaces), C.int(rollAngle))
+
 	if ret <= 0 {
-		s.printLog("->face--> CREATE Detector ERROR")
+		s.printLog("->face--> CREATE Detector ERROR: ", ret)
 		return false
 	}
+	s.printLog("->face--> CREATE Detector Threads: ", threadMax, " GPU:", gpu)
+
 	s.detector = true
 	return true
 }
 
 // Extractor ext
-func Extractor(i interface{}, threadMax, gpu int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) Extractor(threadMax, gpu int) bool {
+
 	if s.extractor {
 		return true
 	}
-	ret := C.init_extractor(s.handle, C.int(threadMax), C.int(gpu))
+	ret := C.c_api_face_extractor_init(C.int(threadMax), C.int(gpu))
 	if ret <= 0 {
-		s.printLog("->face--> CREATE Extractor ERROR")
+		s.printLog("->face--> CREATE Extractor ERROR: ", ret)
 		return false
 	}
+	s.printLog("->face--> CREATE Extractor Threads: ", threadMax, " GPU:", gpu)
+
 	s.extractor = true
 	return true
 }
 
 // Propertizer prop
-func Propertizer(i interface{}, threadMax int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) Propertizer(threadMax int) bool {
+
 	if s.propertizer {
 		return true
 	}
-	ret := C.init_propertizer(s.handle, C.int(threadMax))
+	ret := C.c_api_face_property_init(C.int(threadMax))
 	if ret <= 0 {
-		s.printLog("->face--> CREATE Propertizer ERROR")
+		s.printLog("->face--> CREATE Propertizer ERROR: ", ret)
 		return false
 	}
+	s.printLog("->face--> CREATE Propertizer Threads: ", threadMax)
+
 	s.propertizer = true
 	return true
 }
 
 // Tracker track
-func Tracker(i interface{}, w, h, maxFaces, interval, sampleSize, threadMax, gpu int) bool {
-	s := i.(*SDKFace)
-	if s.tracker {
-		return s.tracker
-	}
-	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))
+func (s *SDKFace) Tracker(w, h, maxFaces, interval, sampleSize, threadMax, gpu int) bool {
 
+	if s.tracker {
+		return true
+	}
+	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))
 	if ret <= 0 {
-		s.printLog("->face--> CREATE Tracker ERROR")
+		s.printLog("->face--> CREATE Tracker ERROR: ", ret)
 		return false
 	}
 	s.tracker = true
@@ -134,65 +135,65 @@
 }
 
 // Detect det
-func Detect(s *SDKFace, data []byte, w, h, c int, ch int) []sdkstruct.CFacePos {
+func (s *SDKFace) Detect(data []byte, w, h, c int, ch int) []sdkstruct.CFacePos {
 	if !s.detector {
 		return nil
 	}
 
-	var cfpos unsafe.Pointer
 	var count C.int
-	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))
+	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))
 	}
-	s.printLog("->face--> Detect No One, Ret: ", ret)
+
+	s.printLog("->face--> Detect No One")
 	return nil
 }
 
 // Extract extract
-func Extract(s *SDKFace, fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) []byte {
-
-	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
-
-	//(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)
+func (s *SDKFace) Extract(fpos sdkstruct.CFacePos, data []byte, w, h, c int, ch int) []byte {
+	if !s.extractor {
+		return nil
 	}
-	s.printLog("->face--> Extract Nothing, Ret: ", ret)
+	s.printLog("->face--> facepos: ", fpos)
+
+	var featLen C.int
+	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
+	if pos == nil {
+		return nil
+	}
+
+	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)
+	}
+	s.printLog("->face--> Extract Nothing")
 	return nil
 }
 
 // Compare face compare
-func Compare(i interface{}, feat1 []byte, feat2 []byte) float32 {
-	s := i.(*SDKFace)
+func (s *SDKFace) Compare(feat1 []byte, feat2 []byte) float32 {
+
 	if s.extractor {
 		return 0
 	}
 
-	res := C.compare(s.handle, (*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))
+	res := C.c_api_face_compare((*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))
 	return float32(res)
 }
 
 // Propertize prop
-func Propertize(s *SDKFace, 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 nil
+		return sdkstruct.CThftResult{Age: 0}
 	}
 
 	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
-
-	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
+	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))
 }
 
 // CFaceInfoArrayToGoArray convert cFaceInfo array to go
@@ -208,7 +209,7 @@
 }
 
 // Track track
-func Track(s *SDKFace, data []byte, w, h, c int, ch int) []sdkstruct.CFaceInfo {
+func (s *SDKFace) Track(data []byte, w, h, c int, ch int) []sdkstruct.CFaceInfo {
 	if !s.tracker {
 		return nil
 	}
@@ -216,17 +217,14 @@
 	//img, const int chan, void **fInfo, int *fcnt);
 
 	var fCount C.int
-	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
+	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
 	}
-	return nil
+	defer C.free(unsafe.Pointer(cFinfo))
+	faces := CFaceInfoArrayToGoArray(unsafe.Pointer(cFinfo), int(fCount))
+	return faces
 }
 
 // FaceInfo2FacePos info -> pos
@@ -247,31 +245,23 @@
 }
 
 // TrackerResize init face tracker
-func TrackerResize(i interface{}, w, h, ch int) bool {
-	s := i.(*SDKFace)
+func (s *SDKFace) TrackerResize(w, h, ch int) int {
 
 	if !s.tracker {
 		s.printLog("->face--> TrackerResize Failed, No Tracker Init")
-		return false
+		return -1
 	}
-	ret := C.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
+	return int(C.c_api_face_track_resize(C.int(ch), C.int(w), C.int(h)))
 }
 
 // Run run
-func Run(i interface{}, data []byte, w, h, c, dchan int) []sdkstruct.CFaceResult {
+func (s *SDKFace) Run(data []byte, w, h, c, dchan int) (int, []byte, error) {
 	if data == nil || w <= 0 || h <= 0 {
-		return nil
+		return 0, nil, errors.New("->face--> Face Input Image Error")
 	}
 
-	s := i.(*SDKFace)
-
 	if !s.tracker || !s.extractor || !s.propertizer {
-		return nil
+		return 0, nil, errors.New("->face--> Face SDK No Init Correctly")
 	}
 
 	channel := c
@@ -279,31 +269,70 @@
 		channel = 3
 	}
 
-	// if !TrackerResize(i, w, h, dchan) {
-	// 	return nil
-	// }
-
 	var fInfo []sdkstruct.CFaceInfo
 
-	fInfo = Track(s, data, w, h, c, dchan)
+	fInfo = s.Track(data, w, h, c, dchan)
+	if len(fInfo) == 0 {
+		return 0, nil, errors.New("->face--> Face Track No One")
+	}
 
-	var faces []sdkstruct.CFaceResult
-	//灏唖dk杩斿洖鍊艰浆鎹㈡垚protomsg绫诲瀷
+	var faces []*protomsg.ResultFaceDetect
+
 	for _, d := range fInfo {
 
 		//杩愯sd
 		dec := FaceInfo2FacePos(d)
-		prop := Propertize(s, dec, data, w, h, c, dchan)
-		feat := Extract(s, dec, data, w, h, c, dchan)
+		p := s.Propertize(dec, data, w, h, c, dchan)
+		feat := s.Extract(dec, data, w, h, c, dchan)
 
-		result := sdkstruct.CFaceResult{
-			Info: d,
-			Prop: *prop,
-			Feat: feat,
-		}
-		faces = append(faces, result)
+		/// filter rules
+		// sdkid := rMsg.Msg.Tasklab.Sdkinfos[rMsg.Msg.Tasklab.Index].Ipcid
+		// 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
+		// }
+		/// filter rules
+
+		prop := (*protomsg.ThftResult)(unsafe.Pointer(&p))
+		fpos := tconvert2ProtoFacePos(d)
+
+		//缁勬垚缁撴灉骞跺簭鍒楀寲
+		res := &protomsg.ResultFaceDetect{Pos: fpos, Result: prop, Feats: feat}
+		faces = append(faces, res)
 
 	}
+	facePos := protomsg.ParamFacePos{Faces: faces}
+	d, e := proto.Marshal(&facePos)
 
-	return faces
+	return len(faces), d, e
+}
+
+func tconvert2ProtoFacePos(dec sdkstruct.CFaceInfo) *protomsg.FacePos {
+
+	crect := dec.RcFace
+	rect := protomsg.Rect{Left: crect.Left, Top: crect.Top, Right: crect.Right, Bottom: crect.Bottom}
+	leftEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtLeftEye))
+	rightEye := (*protomsg.Point)(unsafe.Pointer(&dec.PtRightEye))
+	mouth := (*protomsg.Point)(unsafe.Pointer(&dec.PtMouth))
+	nose := (*protomsg.Point)(unsafe.Pointer(&dec.PtNose))
+	angle := (*protomsg.FaceAngle)(unsafe.Pointer(&dec.FAngle))
+	faceID := uint64(dec.NFaceID)
+
+	facialData := dec.PFacialData[:512]
+
+	// facialData := make([]byte, 512)
+	// copy(facialData[:], dec.PFacialData[:512])
+
+	return &protomsg.FacePos{
+		RcFace:     &rect,
+		PtLeftEye:  leftEye,
+		PtRightEye: rightEye,
+		PtMouth:    mouth,
+		PtNose:     nose,
+		FAngle:     angle,
+		Quality:    dec.NQuality,
+		FacialData: facialData,
+		FaceID:     faceID,
+	}
 }

--
Gitblit v1.8.0