记一次安装opencv和gocv踩过的坑

最近负责一个项目将人脸算法工程,和人脸后端工程集成到一个arm架构的小型盒子中。我主要负责后端工程这部分,语言栈是golang,通过gocv调用opencv【ffmpeg】拉取rtsp视频流到本地抽帧进行人脸的比对。

这其中涉及到gocv+opencv,由于盒子的的架构比较特殊切公司出于安全原因无法连接外网,大部分依赖只能通过源码编译,我踩了不少的坑特此记录

如何安装ffmpeg

所以我马上手动编译ffmpeg,一般我们都可以用yum安装,但是这里不能联网只能源码安装

1
2
3
4
5
cd ffmpeg
./configure --enable-shared --enable-swscale --enable-gpl --enable-nonfree --enable-pic --prefix=/usr/local/ffmpeg --enable-version3 --enable-postproc --enable-pthreads --enable-avisynth

make
make install

如何编译opencv

下载opencv,注意版本,当前gocv的依赖库制定的是opencv4.5.0

注意安装opencv需要cmake3

1
2
3
4
5
6
cd opencv-${OPENCV_VERSION} #这里进入opencv目录
mkdir build
cd build
cmake3 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-${OPENCV_VERSION}/modules -DOPENCV_GENERATE_PKGCONFIG=ON -DWITH_FFMPEG=on ..
make -j $proc
make install
  • 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
2
export PKG_CONFIG_PATH=<存放*.pc的目录,一般是xxx/pkgconfig>:$PKG_CONFIG_PATH
pkg-config --cflags -- opencv4 #测试opencv4

加载动态链接库

如果想让系统找到opencv库文件需要这么做

1
2
3
4
cd /etc/ld.so.conf.d
touch OpenCV.conf
echo <libopenxxx.so所在的补录,这里一般是/usr/local/lib > OpenCV.conf
ldconfig

编译golang程序

以为没法连外网所以把源码和依赖拷贝到盒子中

下载依赖

  • go mod tidy
  • go mod vendor

    编译

  • go build -mod vendor

至此,基本上坑都踩过了,特此记录。