From 0541661d3e4a063d4e68b33e4d6dbb71d3b58638 Mon Sep 17 00:00:00 2001
From: chenshijun <chenshijun@aiotlink.com>
Date: 星期三, 09 九月 2020 09:48:15 +0800
Subject: [PATCH] 添加人脸质量的so

---
 csdk.h                    |   13 ++
 csdk.cpp                  |   35 +++++++
 go2c.go                   |   13 ++
 csrc/buz/face/quality.h   |   20 ++++
 gosdk.go                  |  100 +++++++++++++++++++
 csrc/buz/face/quality.cpp |   75 +++++++++++++++
 csdk_struct.h             |   14 ++
 csrc/all.hpp              |    1 
 8 files changed, 269 insertions(+), 2 deletions(-)

diff --git a/csdk.cpp b/csdk.cpp
index 9ecfcdb..4a111f1 100644
--- a/csdk.cpp
+++ b/csdk.cpp
@@ -73,6 +73,41 @@
     return face_compare(feat1, feat2);
 }
 
+// quality
+int c_api_face_quality_init(const int tm){
+    return init_face_quality(tm, dtors_);
+}
+
+void c_api_set_quality_params(const int min, const int max){
+    return set_quality_params(min, max);
+}
+
+cThfqResult* c_api_face_check_quality(const cFacePos *pos, uchar*data, const int w, const int h, const int channel){
+    const cIMAGE img{data, w, h, 3};
+    return face_check_quality(channel, &img, *pos);
+}
+
+int c_api_face_check_quality_brightness(const cFacePos *pos, uchar*data, const int w, const int h, const int channel, int *nBrightness){
+    const cIMAGE img{data, w, h, 3};
+    return face_check_quality_brightness(channel, &img, *pos, nBrightness);
+}
+
+int c_api_face_check_quality_occlusion(const cFacePos *pos, uchar*data, const int w, const int h, const int channel, int *nOcclusion){
+    const cIMAGE img{data, w, h, 3};
+    return face_check_quality_occlusion(channel, &img, *pos, nOcclusion);
+}
+
+int c_api_face_check_quality_hat(const cFacePos *pos, uchar*data, const int w, const int h, const int channel, int *nHat){
+    const cIMAGE img{data, w, h, 3};
+    return face_check_quality_hat(channel, &img, *pos, nHat);
+}
+
+int c_api_face_check_quality_blur_glass(const cFacePos *pos, uchar*data, const int w, const int h,
+                                        const int channel, int* nBlur,int* nGlasses){
+    const cIMAGE img{data, w, h, 3};
+    return face_check_quality_blur_glass(channel, &img, *pos, nBlur, nGlasses);
+}
+
 cRECT* c_api_face_track_only(int *fCount, uchar *data, const int wid, const int hei, const int channel){
     const cIMAGE img{data, wid, hei, 3};
 
diff --git a/csdk.h b/csdk.h
index c1f36a9..d91ecd2 100644
--- a/csdk.h
+++ b/csdk.h
@@ -36,6 +36,19 @@
 cFaceInfo* c_api_face_track_detect(int *fCount, uchar *data, const int wid, const int hei, const int channel);
 cFaceInfo* c_api_face_track(int *fCount, uchar *data, const int wid, const int hei, const int channel);
 
+// quality
+int c_api_face_quality_init(const int tm);
+void c_api_set_quality_params(const int min, const int max);
+cThfqResult* c_api_face_check_quality(const cFacePos *pos, uchar*data, const int w, const int h, const int channel);
+int c_api_face_check_quality_brightness(const cFacePos *pos, uchar*data, const int w, const int h,
+                                        const int channel, int *nBrightness);
+int c_api_face_check_quality_occlusion(const cFacePos *pos, uchar*data, const int w, const int h,
+                                        const int channel, int *nOcclusion);
+int c_api_face_check_quality_hat(const cFacePos *pos, uchar*data, const int w, const int h,
+                                const int channel, int *nHat);
+int c_api_face_check_quality_blur_glass(const cFacePos *pos, uchar*data, const int w, const int h,
+                                        const int channel, int* nBlur,int* nGlasses);
+
 /// yolo api
 cObjInfo* c_api_yolo_detect(YoloHandle handle, int *objCount, uchar*data, const int w, const int h, const float thrsh, const int use_means);
 const char* c_api_yolo_obj_name(const int typ);
diff --git a/csdk_struct.h b/csdk_struct.h
index 87d2702..ba8e272 100644
--- a/csdk_struct.h
+++ b/csdk_struct.h
@@ -62,6 +62,20 @@
     long        nFaceID;//face tracking id
 } cFaceInfo;
 
+typedef struct _cThfqParam{
+	int brightness_min;//0-100锛屽お鏆楅槇鍊�,寤鸿25.瓒婂皬瓒婂彲鑳芥妸杩囨殫鐨勪汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness
+	int brightness_max;//0-100锛屽お浜槇鍊�,寤鸿75.瓒婂ぇ瓒婂彲鑳芥妸鐨勮繃浜汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness
+}cThfqParam;
+
+typedef struct _cThfqResult{
+	int brightness;//浜鸿劯浜害锛屽彧鏈�3绉嶅彲鑳界殑鍊�:[-1->澶殫锛�0->姝e父锛�1->澶寒]锛屼寒搴︾粨鏋滀細鍙椾寒搴﹂槇鍊煎弬鏁癰rightness_min鍜宐rightness_max褰卞搷
+	int occlusion;//浜鸿劯閬尅搴︼紝鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず浜鸿劯閬尅绋嬪害瓒婇珮
+	int hat;//甯﹀附瀛�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈変僵鎴村附瀛愶紝寤鸿鍒ゅ埆闃堝�间负50
+	int blur;//浜鸿劯妯$硦搴�,鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず鍥惧儚瓒婃ā绯婏紝寤鸿浜鸿劯妯$硦搴﹀垽鍒槇鍊间负70
+	int glasses;//甯︾溂闀�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈夋埓鐪奸暅锛屽缓璁垽鍒槇鍊间负70
+}cThfqResult;
+
+
 typedef struct _cObjInfo
 {
     cRECT rcObj;
diff --git a/csrc/all.hpp b/csrc/all.hpp
index 1e58aa8..dcac3d6 100644
--- a/csrc/all.hpp
+++ b/csrc/all.hpp
@@ -5,6 +5,7 @@
 #include "buz/face/extractor.cpp"
 #include "buz/face/property.cpp"
 #include "buz/face/tracker.cpp"
+#include "buz/face/quality.cpp"
 
 #include "buz/yolo/detector.cpp"
 
diff --git a/csrc/buz/face/quality.cpp b/csrc/buz/face/quality.cpp
new file mode 100644
index 0000000..417fc60
--- /dev/null
+++ b/csrc/buz/face/quality.cpp
@@ -0,0 +1,75 @@
+#include "quality.h"
+
+#include "THFaceQuality_i.h"
+#include "csdk_struct.h"
+
+namespace csdk_wrap{
+    int init_face_quality(const int tm, VecFunc &vec){
+        auto ret = THFQ_Create(tm);
+        if(ret != tm){
+            printf("create face quality error\n");
+        }else{
+            vec.emplace_back([]{THFQ_Release();});
+        }
+        return ret;
+    }
+
+    void set_quality_params(const int min, const int max){
+        int _min = (min<=10)?10:((min>=40)?40:min);
+        int _max = (max>=90)?90:((max<=60)?60:max);
+        const cThfqParam params{_min, _max};
+        printf("set_quality_params : %d, %d\n", _min, _max);
+
+        THFQ_SetParam((THFQ_Param*)&params);
+    }
+
+    cThfqResult* face_check_quality(const int chan, const cIMAGE *img, const cFacePos &pos){
+        if(chan < 0 || !img){
+            printf("face check quality error, image or pos null\n");
+            return NULL;
+        }
+
+        cThfqResult *pResult = (cThfqResult*)malloc(sizeof(cThfqResult));
+        auto ret = THFQ_Check(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (THFQ_Result*)pResult);
+        return pResult;
+    }
+
+    int face_check_quality_brightness(const int chan, const cIMAGE *img, const cFacePos &pos, int *nBrightness){
+        if(!img){
+            printf("face check quality error, image or pos null\n");
+            return -1;
+        }
+
+        auto ret = THFQ_Check_Brightness(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nBrightness);
+        return ret;
+    }
+
+    int face_check_quality_occlusion(const int chan, const cIMAGE *img, const cFacePos &pos, int *nOcclusion){
+        if(!img){
+            printf("face check quality error, image or pos null\n");
+            return -1;
+        }
+
+        auto ret = THFQ_Check_Occlusion(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nOcclusion);
+        return ret;
+    }
+    int face_check_quality_hat(const int chan, const cIMAGE *img, const cFacePos &pos, int *nHat){
+        if(!img){
+            printf("face check quality error, image or pos null\n");
+            return -1;
+        }
+
+        auto ret = THFQ_Check_Hat(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nHat);
+        return ret;
+    }
+
+    int face_check_quality_blur_glass(const int chan, const cIMAGE *img, const cFacePos &pos, int* nBlur,int* nGlasses){
+        if(!img){
+            printf("face check quality error, image or pos null\n");
+            return -1;
+        }
+
+        auto ret = THFQ_Check_BlurGlasses(chan, (BYTE*)(img->data), 3, img->width, img->height, (THFI_FacePos*)(&pos), (int*)nBlur, (int*)nGlasses);
+        return ret;
+    }
+}
\ No newline at end of file
diff --git a/csrc/buz/face/quality.h b/csrc/buz/face/quality.h
new file mode 100644
index 0000000..af64a1e
--- /dev/null
+++ b/csrc/buz/face/quality.h
@@ -0,0 +1,20 @@
+#ifndef _c_wrapper_face_quality_h_
+#define _c_wrapper_face_quality_h_
+
+#include "../base.hpp"
+
+struct _cFacePos;
+struct _cIMAGE;
+struct _cThfqParam;
+struct _cThfqResult;
+
+namespace csdk_wrap{
+    int init_face_quality(const int tm);
+    void set_quality_params(const _cThfqParam* params);
+    int face_check_quality(const int chan, const cIMAGE *img, const cFacePos &pos, _cThfqResult *pResult);
+    int face_check_quality_brightness(const int chan, const cIMAGE *img, const cFacePos &pos, int *nBrightness);
+    int face_check_quality_occlusion(const int chan, const cIMAGE *img, const cFacePos &pos, int *nOcclusion);
+    int face_check_quality_hat(const int chan, const cIMAGE *img, const cFacePos &pos, int *nHat);
+    int face_check_quality_blur_glass(const int chan, const cIMAGE *img, const cFacePos &pos, int* nBlur,int* nGlasses);
+}
+#endif
\ No newline at end of file
diff --git a/go2c.go b/go2c.go
index bef98e0..bddd7ea 100644
--- a/go2c.go
+++ b/go2c.go
@@ -54,12 +54,23 @@
 	PFacialData [8192]uint8
 	NFaceID     int64
 }
+type CThfqParam struct {
+	Brightness_min int32 //0-100锛屽お鏆楅槇鍊�,寤鸿25.瓒婂皬瓒婂彲鑳芥妸杩囨殫鐨勪汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness
+	Brightness_max int32 //0-100锛屽お浜槇鍊�,寤鸿75.瓒婂ぇ瓒婂彲鑳芥妸鐨勮繃浜汉鑴稿綋浣滄甯镐汉鑴革紝姝ゅ弬鏁颁細褰卞搷THFQ_Result::brightness
+}
+type CThfqResult struct {
+	Brightness int32 //浜鸿劯浜害锛屽彧鏈�3绉嶅彲鑳界殑鍊�:[-1->澶殫锛�0->姝e父锛�1->澶寒]锛屼寒搴︾粨鏋滀細鍙椾寒搴﹂槇鍊煎弬鏁癰rightness_min鍜宐rightness_max褰卞搷
+	Occlusion  int32 //浜鸿劯閬尅搴︼紝鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず浜鸿劯閬尅绋嬪害瓒婇珮
+	Hat        int32 //甯﹀附瀛�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈変僵鎴村附瀛愶紝寤鸿鍒ゅ埆闃堝�间负50
+	Blur       int32 //浜鸿劯妯$硦搴�,鑼冨洿鍊间负0-100,瓒婂ぇ琛ㄧず鍥惧儚瓒婃ā绯婏紝寤鸿浜鸿劯妯$硦搴﹀垽鍒槇鍊间负70
+	Glasses    int32 //甯︾溂闀�,鑼冨洿涓�0-100锛岃秺澶ц〃绀鸿秺鍙兘鏈夋埓鐪奸暅锛屽缓璁垽鍒槇鍊间负70
+}
+
 type CObjInfo struct {
 	RcObj CRECT
 	Typ   int32
 	Prob  float32
 }
-
 //track yolo objs info
 type CObjTrackInfo struct {
 	ObjInfo CObjInfo
diff --git a/gosdk.go b/gosdk.go
index f0e6bb4..ae73eb2 100644
--- a/gosdk.go
+++ b/gosdk.go
@@ -8,7 +8,7 @@
 #cgo LDFLAGS: -L/usr/local/cuda/lib64 -L${SRCDIR}/sdk/face/lib/gpu -L${SRCDIR}/sdk/darknet/lib
 #cgo LDFLAGS: -L${SRCDIR}/sdk/plate/eparking/lib -L${SRCDIR}/sdk/plate/cloud/lib -L${SRCDIR}/sdk/plate/vehicle/lib
 #cgo LDFLAGS: -Wl,-rpath,${SRCDIR}/sdk/face/lib/gpu:${SRCDIR}/sdk/darknet/lib:${SRCDIR}/sdk/plate/cloud/lib:${SRCDIR}/sdk/plate/vehicle/lib
-#cgo LDFLAGS: -ldarknet -lTHFaceImage -lTHFeature -lTHFaceProperty -lTHFaceTracking -lcudart -lcublas -lcurand -lrt -ldl -lpthread -lthplateid -lLPRecognition
+#cgo LDFLAGS: -ldarknet -lTHFaceImage -lTHFaceQuality -lTHFeature -lTHFaceProperty -lTHFaceTracking -lcudart -lcublas -lcurand -lrt -ldl -lpthread -lthplateid -lLPRecognition
 #cgo LDFLAGS: -lVehicleTypeRecognition -lFeatureExtraction
 #include <stdlib.h>
 #include "csdk.h"
@@ -73,6 +73,18 @@
 	C.c_api_face_tracker_init(C.int(tm), C.int(gi), C.int(w), C.int(h), C.int(maxFaces), C.int(interval), C.int(sample))
 }
 
+// InitFaceQuality init face quality
+func InitFaceQuality(tm int) {
+
+	C.c_api_face_quality_init(C.int(tm))
+}
+
+// SetFaceQualityParams set face quality params
+func SetFaceQualityParams(min, max int) {
+
+	C.c_api_set_quality_params(C.int(min), C.int(max))
+}
+
 // ResizeFaceTracker init face tracker
 func ResizeFaceTracker(ch, w, h int) int {
 
@@ -128,6 +140,92 @@
 	return b
 }
 
+
+// FaceQuality face check quality
+func FaceQuality(fpos CFacePos, img SDKImage, ch int) CThfqResult {
+
+	data := img.Data
+	w := img.Width
+	h := img.Height
+
+	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
+	result := C.c_api_face_check_quality(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch))
+
+	return *((*CThfqResult)(unsafe.Pointer(&result)))
+}
+
+// FaceQuality face check quality
+func FaceQualityBrightness(fpos CFacePos, img SDKImage, ch int) int {
+
+	data := img.Data
+	w := img.Width
+	h := img.Height
+
+	var brightness, ret C.int
+	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
+
+	ret = C.c_api_face_check_quality_brightness(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &brightness)
+	if ret == -1 {
+		return -1
+	}
+
+	return int(brightness)
+}
+
+// FaceQuality face check quality
+func FaceQualityOcclusion(fpos CFacePos, img SDKImage, ch int) int {
+
+	data := img.Data
+	w := img.Width
+	h := img.Height
+
+	var occlusion, ret C.int
+	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
+
+	ret = C.c_api_face_check_quality_occlusion(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &occlusion)
+	if ret == -1 {
+		return -1
+	}
+
+	return int(occlusion)
+}
+
+// FaceQuality face check quality
+func FaceQualityHat(fpos CFacePos, img SDKImage, ch int) int {
+
+	data := img.Data
+	w := img.Width
+	h := img.Height
+
+	var hat, ret C.int
+	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
+
+	ret = C.c_api_face_check_quality_hat(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &hat)
+	if ret == -1 {
+		return -1
+	}
+
+	return int(hat)
+}
+
+// FaceQuality face check quality
+func FaceQualityBlurGlass(fpos CFacePos, img SDKImage, ch int) (int, int) {
+
+	data := img.Data
+	w := img.Width
+	h := img.Height
+
+	var blur, glass, ret C.int
+	pos := (*C.cFacePos)(unsafe.Pointer(&fpos))
+
+	ret = C.c_api_face_check_quality_blur_glass(pos, (*C.uchar)(unsafe.Pointer(&data[0])), C.int(w), C.int(h), C.int(ch), &blur, &glass)
+	if ret == -1 {
+		return -1, -1
+	}
+
+	return int(blur), int(glass)
+}
+
 // FaceCompare face compare
 func FaceCompare(feat1 []byte, feat2 []byte) float32 {
 	res := C.c_api_face_compare((*C.uchar)(unsafe.Pointer(&feat1[0])), (*C.uchar)(unsafe.Pointer(&feat2[0])))

--
Gitblit v1.8.0