记一次编译虹软SDK使用的Makefile

23 篇文章 0 订阅
5 篇文章 0 订阅

我设计的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开发经验,编译会快很多
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值