配置OpenCV编译YOLO时遇pkg-config及头文件缺失错误求助
解决YOLO编译时的OpenCV相关错误
我的问题情况
我正在用YOLO做目标检测,想通过摄像头实现实时检测,于是把Makefile里的OPENCV改成1后重新编译,结果报错了:
gcc -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv` -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -c ./src/gemm.c -o obj/gemm.o Package opencv was not found in the pkg-config search path. Perhaps you should add the directory containing `opencv.pc' to the PKG_CONFIG_PATH environment variable No package 'opencv' found In file included from ./src/utils.h:5:0, from ./src/gemm.c:2: include/darknet.h:25:43: fatal error: opencv2/highgui/highgui_c.h: No such file or directory compilation terminated. Makefile:85: recipe for target 'obj/gemm.o' failed make: *** [obj/gemm.o] Error 1
我已经在Anaconda里装了OpenCV,版本是3.4.1,验证没问题:
Python 2.7.14 |Anaconda, Inc.| (default, Dec 7 2017, 17:05:42) [GCC 7.2.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> print(cv2.__version__) 3.4.1 >>>
解决办法
1. 定位Anaconda中OpenCV的pkg-config文件
Anaconda安装的OpenCV默认不会把opencv.pc(pkg-config依赖的配置文件)加入系统搜索路径,先找到它的位置:
- 激活你的Anaconda环境:
source activate 你的环境名(比如你用的Python2.7环境,名字可能是py27) - 用
conda list opencv查看安装路径,一般会显示类似~/anaconda/envs/你的环境名/lib/python2.7/site-packages/cv2,往上找一级,pkgconfig目录大概率在~/anaconda/envs/你的环境名/lib/pkgconfig/下。如果这里没有opencv.pc,就手动创建一个。
2. 设置PKG_CONFIG_PATH环境变量
如果找到了opencv.pc,编译前把路径加到环境变量里:
export PKG_CONFIG_PATH=~/anaconda/envs/你的环境名/lib/pkgconfig:$PKG_CONFIG_PATH
替换成你实际的路径后,重新执行make试试。
3. 手动创建opencv.pc文件(找不到时使用)
要是你的Anaconda环境里没有这个文件,自己建一个放在刚才的pkgconfig目录下,内容如下(记得替换成你的路径和版本):
prefix=~/anaconda/envs/你的环境名 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir_old=${prefix}/include/opencv includedir_new=${prefix}/include Name: OpenCV Description: Open Source Computer Vision Library Version: 3.4.1 Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs Cflags: -I${includedir_old} -I${includedir_new}
保存后设置环境变量,再重新编译。
4. 修改Makefile绕开pkg-config(备选方案)
如果pkg-config的方法还是不行,直接在Makefile里硬编码OpenCV的路径:
打开Makefile,找到OPENCV=1的段落,改成这样:
OPENCV=1 ifeq ($(OPENCV), 1) COMMON+= -DOPENCV CFLAGS+= -I~/anaconda/envs/你的环境名/include LDFLAGS+= -L~/anaconda/envs/你的环境名/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs endif
替换成你自己的路径,这样编译时就直接调用Anaconda里的OpenCV,不用依赖pkg-config查找。
5. 处理版本兼容性问题
报错里提到的opencv2/highgui/highgui_c.h在OpenCV3.x里已经被弃用,老版本YOLO是针对OpenCV2开发的,你有两个选择:
- 换成OpenCV2.x版本,用conda安装:
conda install opencv=2.4.13 - 修改darknet代码,把
#include <opencv2/highgui/highgui_c.h>替换成#include <opencv2/highgui/highgui.hpp>,同时调整相关的C风格API为C++风格(这个需要修改多处代码,比较麻烦,优先推荐第一种方案)。
内容的提问来源于stack exchange,提问作者amitnair92
相关产品推荐
相关产品推荐

