Skip to content

Commit 28abb2b

Browse files
committed
Add tags
* if you want use 'gocv' - build -tags gocv
1 parent 04ab32b commit 28abb2b

File tree

7 files changed

+123
-81
lines changed

7 files changed

+123
-81
lines changed

face.go

Lines changed: 4 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package face
22

3-
// #cgo !windows pkg-config: opencv4
4-
// #cgo CXXFLAGS: --std=c++11
5-
// #cgo windows CPPFLAGS: -IC:/opencv/build/install/include
6-
// #cgo windows LDFLAGS: -LC:/opencv/build/install/x64/mingw/lib -lopencv_core420 -lopencv_face420 -lopencv_videoio420 -lopencv_imgproc420 -lopencv_highgui420 -lopencv_imgcodecs420 -lopencv_objdetect420 -lopencv_features2d420 -lopencv_video420 -lopencv_dnn420 -lopencv_xfeatures2d420 -lopencv_plot420 -lopencv_tracking420 -lopencv_img_hash420 -lopencv_calib3d420
73
// #cgo pkg-config: dlib-1
84
// #cgo CXXFLAGS: -std=c++1z -Wall -O3 -DNDEBUG -march=native
95
// #cgo LDFLAGS: -ljpeg
@@ -18,8 +14,6 @@ import (
1814
"math"
1915
"os"
2016
"unsafe"
21-
22-
"gocv.io/x/gocv"
2317
)
2418

2519
const (
@@ -35,6 +29,10 @@ const (
3529
Male
3630
)
3731

32+
func (g Gender) String() string {
33+
return [...]string{"Female", "Male"}[g]
34+
}
35+
3836
// A Recognizer creates face descriptors for provided images and
3937
// classifies them into categories.
4038
type Recognizer struct {
@@ -191,43 +189,6 @@ func (rec *Recognizer) detectBuffer(type_ int, imgData []byte) (faces []Face, er
191189
return
192190
}
193191

194-
func (rec *Recognizer) detectMat(type_ int, mat gocv.Mat) (faces []Face, err error) {
195-
cType := C.int(type_)
196-
var ptr C.image_pointer
197-
198-
ret := C.facerec_detect_mat(rec.ptr, (*C.image_pointer)(unsafe.Pointer(&ptr)), unsafe.Pointer(mat.Ptr()), cType)
199-
defer C.free(unsafe.Pointer(ret))
200-
201-
if ret.err_str != nil {
202-
defer C.free(unsafe.Pointer(ret.err_str))
203-
err = makeError(C.GoString(ret.err_str), int(ret.err_code))
204-
return
205-
}
206-
207-
numFaces := int(ret.num_faces)
208-
if numFaces == 0 {
209-
return
210-
}
211-
212-
// Copy faces data to Go structure.
213-
defer C.free(unsafe.Pointer(ret.rectangles))
214-
215-
rDataLen := numFaces * rectLen
216-
rDataPtr := unsafe.Pointer(ret.rectangles)
217-
rData := (*[1 << 30]C.long)(rDataPtr)[:rDataLen:rDataLen]
218-
219-
for i := 0; i < numFaces; i++ {
220-
face := Face{imagePointer: &ptr}
221-
x0 := int(rData[i*rectLen])
222-
y0 := int(rData[i*rectLen+1])
223-
x1 := int(rData[i*rectLen+2])
224-
y1 := int(rData[i*rectLen+3])
225-
face.Rectangle = image.Rect(x0, y0, x1, y1)
226-
faces = append(faces, face)
227-
}
228-
return
229-
}
230-
231192
func (rec *Recognizer) detectFile(type_ int, file string) (faces []Face, err error) {
232193
if !fileExists(file) {
233194
err = ImageLoadError(fmt.Sprintf("File '%s' not found!", file))
@@ -271,14 +232,6 @@ func (rec *Recognizer) detectFile(type_ int, file string) (faces []Face, err err
271232
return
272233
}
273234

274-
func (rec *Recognizer) DetectMat(mat gocv.Mat) (faces []Face, err error) {
275-
return rec.detectMat(0, mat)
276-
}
277-
278-
func (rec *Recognizer) DetectMatCNN(mat gocv.Mat) (faces []Face, err error) {
279-
return rec.detectMat(1, mat)
280-
}
281-
282235
// Detect returns all faces found on the provided image, sorted from
283236
// left to right. Empty list is returned if there are no faces, error is
284237
// returned if there was some error while decoding/processing image.

facerec.cc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
#include <dlib/image_processing/frontal_face_detector.h>
66
#include <dlib/graph_utils.h>
77
#include <dlib/image_io.h>
8-
#include <dlib/opencv.h>
9-
#include <opencv2/core/core.hpp>
10-
#include <opencv2/core/types_c.h>
118
#include "facerec.h"
129
#include "classify.h"
1310

gocv.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// +build gocv
2+
3+
#include <dlib/opencv.h>
4+
#include <opencv2/core/core.hpp>
5+
#include <opencv2/core/types_c.h>
6+
#include "facerec.h"
7+
#include "gocv.h"
8+
9+
using namespace dlib;
10+
11+
facesret* facerec_detect_mat(facerec* rec, image_pointer *p, const void *mat,int type) {
12+
facesret* ret = (facesret*)calloc(1, sizeof(facesret));
13+
image_t img;
14+
std::vector<rectangle> rects;
15+
cv::Mat *mat_img = new cv::Mat(*((cv::Mat*)mat));
16+
IplImage ipl_img = cvIplImage(*mat_img);
17+
18+
try {
19+
cv_image<bgr_pixel> dlib_img(&ipl_img);
20+
assign_image(img, dlib_img);
21+
} catch(image_load_error& e) {
22+
ret->err_str = strdup(e.what());
23+
ret->err_code = IMAGE_LOAD_ERROR;
24+
return ret;
25+
} catch (std::exception& e) {
26+
ret->err_str = strdup(e.what());
27+
ret->err_code = UNKNOWN_ERROR;
28+
return ret;
29+
}
30+
31+
return facerec_detect(ret, p, rec, img, type);
32+
}

gocv.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// +build gocv
2+
3+
package face
4+
5+
// #cgo !windows pkg-config: opencv4
6+
// #cgo CXXFLAGS: --std=c++1z
7+
// #cgo windows CPPFLAGS: -IC:/opencv/build/install/include
8+
// #cgo windows LDFLAGS: -LC:/opencv/build/install/x64/mingw/lib -lopencv_core420 -lopencv_face420 -lopencv_videoio420 -lopencv_imgproc420 -lopencv_highgui420 -lopencv_imgcodecs420 -lopencv_objdetect420 -lopencv_features2d420 -lopencv_video420 -lopencv_dnn420 -lopencv_xfeatures2d420 -lopencv_plot420 -lopencv_tracking420 -lopencv_img_hash420 -lopencv_calib3d420
9+
// #include <stdlib.h>
10+
// #include <stdint.h>
11+
// #include "wrapper.h"
12+
// #include "gocv.h"
13+
import "C"
14+
import (
15+
"errors"
16+
"fmt"
17+
"image"
18+
"math"
19+
"os"
20+
"unsafe"
21+
22+
"gocv.io/x/gocv"
23+
)
24+
25+
func (rec *Recognizer) detectMat(type_ int, mat gocv.Mat) (faces []Face, err error) {
26+
cType := C.int(type_)
27+
var ptr C.image_pointer
28+
29+
ret := C.facerec_detect_mat(rec.ptr, (*C.image_pointer)(unsafe.Pointer(&ptr)), unsafe.Pointer(mat.Ptr()), cType)
30+
defer C.free(unsafe.Pointer(ret))
31+
32+
if ret.err_str != nil {
33+
defer C.free(unsafe.Pointer(ret.err_str))
34+
err = makeError(C.GoString(ret.err_str), int(ret.err_code))
35+
return
36+
}
37+
38+
numFaces := int(ret.num_faces)
39+
if numFaces == 0 {
40+
return
41+
}
42+
43+
// Copy faces data to Go structure.
44+
defer C.free(unsafe.Pointer(ret.rectangles))
45+
46+
rDataLen := numFaces * rectLen
47+
rDataPtr := unsafe.Pointer(ret.rectangles)
48+
rData := (*[1 << 30]C.long)(rDataPtr)[:rDataLen:rDataLen]
49+
50+
for i := 0; i < numFaces; i++ {
51+
face := Face{imagePointer: &ptr}
52+
x0 := int(rData[i*rectLen])
53+
y0 := int(rData[i*rectLen+1])
54+
x1 := int(rData[i*rectLen+2])
55+
y1 := int(rData[i*rectLen+3])
56+
face.Rectangle = image.Rect(x0, y0, x1, y1)
57+
faces = append(faces, face)
58+
}
59+
return
60+
}
61+
62+
func (rec *Recognizer) DetectMat(mat gocv.Mat) (faces []Face, err error) {
63+
return rec.detectMat(0, mat)
64+
}
65+
66+
func (rec *Recognizer) DetectMatCNN(mat gocv.Mat) (faces []Face, err error) {
67+
return rec.detectMat(1, mat)
68+
}

gocv.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// +build gocv
2+
3+
#pragma once
4+
#ifndef GOCV_H
5+
#define GOCV_H
6+
7+
#include "wrapper.h"
8+
9+
#ifdef __cplusplus
10+
extern "C" {
11+
#endif
12+
13+
facesret* facerec_detect_mat(facerec* rec, image_pointer *p, const void *mat,int type);
14+
15+
#ifdef __cplusplus
16+
}
17+
#endif
18+
19+
#endif /* GOCV_H */

wrapper.cc

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
#include <dlib/image_processing/frontal_face_detector.h>
77
#include <dlib/graph_utils.h>
88
#include <dlib/image_io.h>
9-
#include <dlib/opencv.h>
10-
#include <opencv2/core/core.hpp>
11-
#include <opencv2/core/types_c.h>
129
#include "facerec.h"
1310
#include "classify.h"
1411

@@ -91,29 +88,6 @@ facesret* facerec_detect_file(facerec* rec, image_pointer *p, const char* file,i
9188
return facerec_detect(ret, p, rec, img, type);
9289
}
9390

94-
facesret* facerec_detect_mat(facerec* rec, image_pointer *p, const void *mat,int type) {
95-
facesret* ret = (facesret*)calloc(1, sizeof(facesret));
96-
image_t img;
97-
std::vector<rectangle> rects;
98-
cv::Mat *mat_img = new cv::Mat(*((cv::Mat*)mat));
99-
IplImage ipl_img = cvIplImage(*mat_img);
100-
101-
try {
102-
cv_image<bgr_pixel> dlib_img(&ipl_img);
103-
assign_image(img, dlib_img);
104-
} catch(image_load_error& e) {
105-
ret->err_str = strdup(e.what());
106-
ret->err_code = IMAGE_LOAD_ERROR;
107-
return ret;
108-
} catch (std::exception& e) {
109-
ret->err_str = strdup(e.what());
110-
ret->err_code = UNKNOWN_ERROR;
111-
return ret;
112-
}
113-
114-
return facerec_detect(ret, p, rec, img, type);
115-
}
116-
11791
facesret* facerec_detect_buffer(facerec* rec, image_pointer *p, unsigned char* img_data, int len,int type) {
11892
facesret* ret = (facesret*)calloc(1, sizeof(facesret));
11993
image_t img;

wrapper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ typedef struct faceret {
4747
facerec* facerec_init();
4848
facesret* facerec_detect_file(facerec*, image_pointer *, const char*,int);
4949
facesret* facerec_detect_buffer(facerec*, image_pointer *, unsigned char*, int, int);
50-
facesret* facerec_detect_mat(facerec* rec, image_pointer *p, const void *mat,int type);
5150
faceret* facerec_recognize(facerec*, image_pointer*, int, int, int, int);
5251
int facerec_gender(facerec* rec, image_pointer *p, int x, int y, int x1, int y1);
5352
void facerec_set_cnn(facerec* , const char *);

0 commit comments

Comments
 (0)