【Linux】安装opencv4避坑指南

linux环境:虚拟机Ubuntu16.04
如果要安装opencv3.x.x,请移步Linux学习之安装OpenCV3.4.1,只要按步骤来就没有问题。问题是如果安装opencv4.x.x,那么上述就行不通了。下面给出linux下安装opencv4的步骤:
1.安装依赖

sudo apt-get install cmake  
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev

2.源文件获取
进入opencv官网,找适合的版本获得Sources.以目前最新的opencv4.3.0为例,下载下来后解压,得到opencv-4.3.0文件夹。
3.编译安装
终端下进入opencv-4.3.0文件夹后,在文件下建立一个文件夹,然后进入这个文件夹。以建立build文件夹为例

mkdir build
cd build

然后配置一下cmake

cmake -DCMAKE_BUILD_TYPE=Release \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local ..

-DOPENCV_GENERATE_PKGCONFIG=ON,这句在安装opencv3的时候不是必须的,而安装opencv4必须,是为了在
/usr/local/lib/pkgconfig/目录下自动生成opencv4.pc
文件。
cmake配置完成后开始make,输入

sudo make -j2

开始编译,-j2是为了提高编译速度,具体讲解见make的-j命令(加速Linux程序编译),在虚拟机环境下不建议-j后的数字太大,我-j4的时候会出现死机情况。
漫长的编译过程后,下一步是安装,输入

sudo make install

这个过程相对较快。
4.环境配置
安装完成后还需要进行环境配置,先将OpenCV的库添加到路径,从而可以让系统找到

sudo gedit /etc/ld.so.conf.d/opencv4.conf

在里边添加一行

/usr/local/lib

保存后返回终端界面,然后输入以下代码时刚刚的路径配置生效

sudo ldconfig

接下来配置bash

sudo gedit /etc/bash.bashrc

在文件的最后加入

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig  
export PKG_CONFIG_PATH  

保存并返回终端界面后执行以下命令,使配置生效

source /etc/bash.bashrc

最后,运行以下命令更新一下数据库文件

sudo updatedb  

5.运行实例
进入opencv-4.3.0/samples/cpp/eaxmple_cmake目录下,尝试make一下,发现报错如下

g++ example.cpp -o example.o -c -Wall -I/usr/local/include/opencv4/opencv2 
example.cpp:1:28: fatal error: opencv2/core.hpp: 没有那个文件或目录
compilation terminated.
Makefile:11: recipe for target 'example.o' failed
make: *** [example.o] Error 1

意思是说找不到opencv2/core.hpp这个头文件。而我们到/usr/local/include/opencv4/opencv2下,发现明明有这个头文件啊?问题就出在例程的Makefile里,打开Makefile看一看

 CXX ?= g++
 
 CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv)
 LDFLAGS += $(shell pkg-config --libs --static opencv)
 
 all: opencv_example
 
 opencv_example: example.o; $(CXX) $< -o $@ $(LDFLAGS)
 
 %.o: %.cpp; $(CXX) $< -o $@ $(CXXFLAGS)
 
 clean: ; rm -f example.o opencv_example

问题找到了,第3、4行中显然是在pkgconfig中调用opencv,而我们的opencv4是在/usr/local/lib/pkgconfig/目录下自动生成的opencv4.pc,那么只需要把这两行的opencv改为opencv4就ok了。修改后保存,然后再make一下,这次不报找不到头文件的错了,但是出来了一堆其他的错误。拿出错误的前几行看一下。

g++ example.cpp -o example.o -c -Wall -I/usr/local/include/opencv4/opencv -I/usr/local/include/opencv4 
In file included from /usr/local/include/opencv4/opencv2/core.hpp:52:0,
                 from example.cpp:1:
/usr/local/include/opencv4/opencv2/core/cvdef.h:716:4: error: #error "OpenCV 4.x+ requires enabled C++11 support"
 #  error "OpenCV 4.x+ requires enabled C++11 support"
    ^
In file included from /usr/include/c++/5/array:35:0,
                 from /usr/local/include/opencv4/opencv2/core/cvdef.h:722,
                 from /usr/local/include/opencv4/opencv2/core.hpp:52,
                 from example.cpp:1:

可以发现,其意思是说opencv4需要c++11支持,而我们的makefile中并没有使用c++11去编译 ,所以解决办法就是在Makefiile中指定用c++11标准编译。再次打开Makefile,在第3行下加入CXXFLAGS += -std=c++11,最终的makefile如下所示

CXX ?= g++
 
CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv4)
CXXFLAGS += -std=c++11
LDFLAGS += $(shell pkg-config --libs --static opencv4)
 
all: opencv_example

opencv_example: example.o; $(CXX) $< -o $@ $(LDFLAGS)
 
%.o: %.cpp; $(CXX) $< -o $@ $(CXXFLAGS)
 
clean: ; rm -f example.o opencv_example

保存后再次make,终于成功生成了可执行文件opencv_example,运行一下如下图,大功告成。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/spiremoon/article/details/105812303