最近负责一个项目将人脸算法工程,和人脸后端工程集成到一个arm架构的小型盒子中。我主要负责后端工程这部分,语言栈是golang,通过gocv调用opencv【ffmpeg】拉取rtsp视频流到本地抽帧进行人脸的比对。
这其中涉及到gocv+opencv,由于盒子的的架构比较特殊切公司出于安全原因无法连接外网,大部分依赖只能通过源码编译,我踩了不少的坑特此记录
如何安装ffmpeg
所以我马上手动编译ffmpeg,一般我们都可以用yum安装,但是这里不能联网只能源码安装
1 | cd ffmpeg |
如何编译opencv
下载opencv,注意版本,当前gocv的依赖库制定的是opencv4.5.0
注意安装opencv需要cmake3
1 | cd opencv-${OPENCV_VERSION} #这里进入opencv目录 |
- CMAKE_INSTALL_PREFIX 安装目录
- OPENCV_EXTRA_MODULES_PATH 制定的一些插件目录这里用不到
- OPENCV_GENERATE_PKGCONFIG 编译golang的程序时候gocv检查依赖是通过pkg-config所以要安装,会生成.pc文件,之后我们可以将.pc文件放到pkg-config,后面会讲到如何放
- WITH_FFMPEG 处理视频流的解码要依赖
安装opencv,执行cmake3时候解决FFMPEG NO
我在编译opencv4.5.0,执行cmake时候发现ffmpeg总是no,导致程序启动时候无法顺利拉流下来提示Error read file :xxxx这是由于安装opencv时候check依赖ffmpeg失败导致的。原来opencv检查ffpmeg是通过pkg-config的,所以
解决方案:我们需要将刚才编译的ffmpeg下的*.pc都拷贝到pkg-config指定的目录中
指定pkg-config
我们在编译golang程序时候有可能会失败,指找不到opencv库,有可能是pkg-config加载失败导致的解决方案
1 | export PKG_CONFIG_PATH=<存放*.pc的目录,一般是xxx/pkgconfig>:$PKG_CONFIG_PATH |
加载动态链接库
如果想让系统找到opencv库文件需要这么做
1 | cd /etc/ld.so.conf.d |
编译golang程序
以为没法连外网所以把源码和依赖拷贝到盒子中
下载依赖
- go mod tidy
go mod vendor
编译
go build -mod vendor
至此,基本上坑都踩过了,特此记录。