python的opencv安装很简单,通过pip就可以完成,但是c++在安装opencv4的时候需要注意一些。下面给出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.下载源文件
推荐直接去https://github.com/opencv/opencv下载,如果git clone网速太慢的话,也可以在网页上下载,然后直接解压。
git clone https://github.com/opencv/opencv
3.编译安装
第二步完成,我们应该下载的是目前最高版本opencv4.5.1,解压后进入opencv文件下,建立build文件夹
mkdir build
cd build
完成后,应该看到路径下多出build文件夹
然后配置cmake
sudo cmake -DCMAKE_BUILD_TYPE=Release \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local ..
注意…不能省略,-DOPENCV_GENERATE_PKGCONFIG=ON是为了在/usr/loacl/lib/pkgconfig/目录下自动生成opencv4.pc文件。
camke配置完后开始make
sudo make -j4
-j4是根据为了提高编译速度
sudo make install
完成编译安装。
4.环境配置
安装完成后还需要进行环境配置,先将OpenCV的库添加到路径,从而可以让系统找到
sudo vim /etc/ld.so.conf.d/opencv4.conf
在里面添加一行
/usr/local/lib
保存后返回终端界面,然后输入以下代码时刚刚的路径配置生效
sudo ldconfig
接下来配置bash
sudo vim /etc/bash.bashrc
在文件的最后加入
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
保存并返回终端界面后执行以下命令,使配置生效
source /etc/bash.bashrc
最后,运行以下命令更新一下数据库文件
sudo updatedb
5.实例验证
新建一个cpp文件my.cpp,将opencv.hpp头文件写进去
在终端输入
sudo g++ -g -Wall -std=c++11 my.cpp -o my `pkg-config --cflags --libs opencv4`
因为linux是x86-64编译环境所以这里是g++ -g -Wall -std=c++11,生成my的执行文件
./my
或者验证opencv中的实例。
进入opencv/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,就可以运行example。