我设计的Makefile
# -g 添加gdb调试选项
# -o 指定生成可执行文件的名称
# -fPIC 表明使用地址无关代码
# -I i的大写,include头文件非标准库中存在的也不是在当前文件夹下的,需要将地址用-i(大写)包含
# -L 用到的函数或操作非标准库下的,需要将库存在的地址用-L包含,库文件一般为.a或.so文件
# -l 用在-L之后,后加库名称,-l库名(.a文件名)
CXX := g++
CXXFLAGS := `pkg-config opencv --libs --cflags opencv`
INCLUDE := -I./inc
LIBPATH := -Llinux_so -larcsoft_face_engine -larcsoft_face
SHARE := -Wall -g -fPIC -shared -o
OBJS := samplecode.cpp
TARGET := libsamplecode.so
all:$(TARGET)
$(TARGET):$(OBJS)
$(CXX) $(OBJS) $(CXXFLAGS) $(INCLUDE) $(LIBPATH) $(SHARE) $(TARGET)
.PHONY: clean
clean:
rm -f *.o *.so
源文件
- 虹软的视觉库分为免费版和收费版;
- 上线的底层库我整了2个,原因是给我的开发时间太短,一会让干这一会让干,那还舍不得花钱。尤其是商业版,验证的机会很少,为了稳妥,我的代码写的较为粗糙。
- 打算近期二合一优化后贴到下面
TODO
动态库源码
目标
- 编译虹软视觉Linux c++版本sdk为动态库so,然后使用cgo调用
- 已上线
验证程序
package main
/*
//网络参考资料
//https://studygolang.com/articles/2320 //func C.GoBytes(unsafe.Pointer, C.int) []byte
//https://segmentfault.com/a/1190000013590585
//https://blog.csdn.net/weixin_36771703/article/details/89003014 //类型对应
//https://segmentfault.com/a/1190000013590585 // C.plusOne((**C.int)((unsafe.Pointer)(&s1[0])))
*/
/*
#cgo LDFLAGS: -Llinux_so -lsamplecode -lstdc++
#include <stdlib.h>
#include "samplecode.h"
*/
import "C"
import (
"encoding/base64"
"unsafe"
"fmt"
"time"
)
//#cgo CFLAGS: -I. -Iinc
func main() {
// 特征值
// 传入一张照片
pic := C.CString("/root/ASFTestDemo/images/4.jpg")
defer C.free(unsafe.Pointer(pic)) //销毁
// 特征值提取
start := time.Now()
f := C.CimcapFaceFeatureExtract(pic)
fmt.Printf("difference = %v\n", time.Now().Sub(start))
defer C.free(unsafe.Pointer(f.feature)) //销毁
// 人脸特征信息长度
featureSize := int32(f.featureSize)
fmt.Printf("人脸特征信息长度:%d\n", featureSize)
// 人脸特征信息
feature := C.GoBytes(unsafe.Pointer(f.feature), C.int(featureSize))
enc := base64.StdEncoding.EncodeToString(feature)
fmt.Printf("人脸特征信息=[%s]\n", enc)
// 对比两张照片
var outner C.CIMCAP_FaceFeature
outner.featureSize = C.int(f.featureSize)
outner.feature = (*C.uchar)(unsafe.Pointer(&feature[0]))
confidenceLevel := float32(C.CimcapFaceFeatureCompare(outner, outner))
fmt.Printf("可信度等级=%f\n", confidenceLevel)
}
一点心得
- 需要搞清楚cgo调用原理,即类型对应关系
- 一些编译知识,如gcc,g++等参数等
- 虹软sdk的官方demo是没有关于jpg图片示例的,需要opencv库加持
- 需要熟练linux操作,如ldconfig,ln…等命令
- 官方推荐的CMake的自由度不太高,推荐使用Makefile组织编译
- 如果有一些嵌入式Linux开发经验,编译会快很多