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,运行一下如下图,大功告成。