转载请注明作者和出处: http://blog.youkuaiyun.com/john_bh/
文章目录
1. 下载源文件
在官方网站下载OpenCV 4.3.0安装包,在GitHub上下载OpenCV-contrib模块。安装过程主要参考OpenCV官方文档。
官方下载例子:
$ git clone https://github.com/opencv/opencv.git
$ git clone https://github.com/opencv/opencv_contrib.git
或者可以在OpenCV 官方下载sources文件和opencv_contrib releases 文件:OpenCV4.3 官方sources 文件下载和opencv_contrib releases 文件下载。
我采用离线安装:下载opecv4.3和opencv_contrib releases。然后解压处理:
$ unzip opencv-4.3.0.zip
对解压的文件夹进行重命名:
$ mv opencv-4.3.0 opencv4.3
$ unzip opencv_contrib-4.3.0.zip
对解压的文件夹进行重命名:
$ mv opencv_contrib-4.3.0 opencv_contrib_4.3
2. 安装依赖
首先是一些必须安装的依赖项:
$ sudo apt-get install build-essential
$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
3. 编译安装
3.1 预先下载依赖包
先不要着急编译安装,因为在编译过程中需要一些依赖包,cmake在安装过程中,网络原因会导致一些文件下载失败,所以可以预先下载,拷贝到对应的目录,并且修改编译文件。
-
ippicv
在文件~/opencv4.3/3rdparty/ippicv/ippicv.cmake
中找3个关键值:
43行:下载目录的地址:https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/
5行:IPPICV_COMMIT值:a56b6ac6f030c312b2dce17430eef13aed9af274
10行:文件名:ippicv_2020_lnx_intel64_20191018_general.tgz
三个值组合起来,就是下载地址:https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_lnx_intel64_20191018_general.tgz
下载好了之后,直接放到~/opencv4.3/3rdparty/ippicv/目录下,修改 ippicv.cmake文件的第42行:#"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/" "file:///xxxxx/opencv4.3/3rdparty/ippicv/"
我把下载好的放到csdn上了,下载链接:https://download.youkuaiyun.com/download/john_bh/12739700
-
boostdesc_bgm.i
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i预先下载文件,把这7个文件拷贝到
~/opencv_contrib_4.3/modules/xfeatures2d/src/
文件夹下;
修改~/opencv_contrib_4.3/modules/xfeatures2d/cmake/download_boostdesc.cmake
文件27行:#"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${OPENCV_3RDPARTY_COMMIT}/" "file:///xxxxx/opencv_contrib_4.3/modules/xfeatures2d/src"
-
vgg
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i预先下载文件,把这4个文件拷贝到
~/opencv_contrib_4.3/modules/xfeatures2d/src/
文件夹下;
修改~/opencv_contrib_4.3/modules/xfeatures2d/cmake/download_vgg.cmake
文件21行:#"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${OPENCV_3RDPARTY_COMMIT}/" "file:///xxxxx/opencv_contrib_4.3/modules/xfeatures2d/src"
我把下载好的放到csdn上了,下载链接:https://download.youkuaiyun.com/download/john_bh/12739700
-
face_landmark_model.dat.zip
下载地址:https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat
下载完成后,把face_landmark_model.dat.zip
放到文件夹~/opencv_contrib_4.3/modules/face/
中,修改~/opencv_contrib_4.3/modules/face/CMakeLists.txt
19行:#"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${__commit_hash}/" "file:///xxxxx/opencv_contrib_4.3/modules/face/"
我把下载好的放到csdn上了,下载链接:https://download.youkuaiyun.com/download/john_bh/12739700
-
ade-0.1.1f.zip
打开~/opencv4.3/modules/gapi/cmake/DownloadADE.cmake
文件,按照文件第10行指定的网址下载ade-0.1.1f.zip
文件,并将其重命名为v0.1.1f.zip,f放到该文件夹下,并修改第10行:#"https://github.com/opencv/ade/archive/" "file:///xxxx/opencv4.3/modules/gapi/cmake/"
我把下载好的放到csdn上了,下载链接:https://download.youkuaiyun.com/download/john_bh/12739700
3.2 cmake 编译
-
创建编译文件夹build:
在文件夹~/opencv4.3/
中新建build编译文件夹:$ mkdir build $ cd build/
-
cmake编译:
官方例子:cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
这里我需要支持CUDA的OpenCV,所以,我的cmake 命令如下:
cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=~/opencv4.3_install/ \ #安装路径和编译路径不是同一个,如果同一个在后边make install 会报错 -D WITH_CUDA=ON \ #使用CUDA -D WITH_CUBLAS=ON \ -D CUDA_ARCH_BIN='7.5' \ #指定GPU算力,在NVIDIA官网查询 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib_4.3/modules \ #opencv_contrib modules路径 -D OPENCV_GENERATE_PKGCONFIG=YES ..
CMAKE_INSTALL_PREFIX
:安装路径,如果没特殊需求建议就用/usr/local,注意有的时候安装路径和编译路径是同一个,make install 会报错;WITH_CUDA=ON
:使用CUDA;CUDA_ARCH_BIN='7.5'
:指定GPU算力,在NVIDIA官网查询;OPENCV_ENABLE_NONFREE=YES
:允许使用申请了专利的一些算法,必须加上这句;OPENCV_EXTRA_MODULES_PATH
:contrib包的路径,例如我的是~/opencv_contrib_4.3/modules;OPENCV_GENERATE_PKGCONFIG
因为opencv4默认不生成.pc文件,所以加上这句用于生成opencv4.pc
文件,支持pkg-config功能。
NVIDIA官网查询算力。 使用命令:nvidia-smi
查看GPU型号,我的是GeForce RTX 2080
,对应的算力如下图:
cmake
命令的结果中可以看到是否支持CUDA以及Python情况。
3.3 make
-
make
#使用nproc确定CPU核心数 $ nproc $ make -j12 #根据CPU核心数确定编译线程数(我的是12)
make 成功:
make -j12 中遇到的问题以及解决办法:
参考链接:https://github.com/opencv/opencv_contrib/issues/1950错误1:~/opencv_contrib_4.3/modules/xfeatures2d/test/test_features2d.cpp:51:62: fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录
解决办法:
修改:~/opencv_contrib_4.3/modules/xfeatures2d/test/test_features2d.cpp//#include "features2d/test/test_detectors_regression.impl.hpp" //#include "features2d/test/test_descriptors_regression.impl.hpp" #include "~/opencv4.3/modules/features2d/test/test_detectors_regression.impl.hpp" #include "~/opencv4.3/modules/features2d/test/test_descriptors_regression.impl.hpp"
错误2:~/opencv_contrib_4.3/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp:7:82: fatal error: features2d/test/test_detectors_invariance.impl.hpp: 没有那个文件或目录
解决办法:
修改 ~/opencv_contrib_4.3/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp//#include "features2d/test/test_detectors_invariance.impl.hpp" // main OpenCV repo //#include "features2d/test/test_descriptors_invariance.impl.hpp" // main OpenCV repo #include "~/opencv4.3/modules/features2d/test/test_detectors_invariance.impl.hpp" // main OpenCV repo #include "~/opencv4.3/modules/features2d/test/test_descriptors_invariance.impl.hpp" // main OpenCV repo
错误3:~/opencv4.3/samples/gpu/surf_keypoint_matcher.cpp:11:40: fatal error: opencv2/xfeatures2d/cuda.hpp: 没有那个文件或目录
解决办法:
修改~ /opencv4.3/samples/gpu/surf_keypoint_matcher.cpp://#include "opencv2/xfeatures2d/cuda.hpp" #include "~/opencv_contrib_4.3/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp"
-
make install:
$ sudo make install
错误1:CMake Error at apps/annotation/cmake_install.cmake:47 (file): file INSTALL cannot find
解决办法:
参考链接:https://stackoverflow.com/questions/47248882/opencv-error-file-install-cannot-find-bin-opencv-annotation
在某些Linux发行版中,当build目录与安装目录相同时会发生此错误,修改安装目录,区别安装目录和build 目录。
4. 环境配置
4.1 动态库配置
配置OpenCV动态库环境——程序执行时加载动态库*.so的路径。
$ sudo echo "~/opencv4.3_install/lib/" >> /etc/ld.so.conf.d/opencv4.3.conf
#使配置生效
$ sudo ldconfig
4.2 配置OpenCV的PKG-CONFIG环境
-
修改opencv4.pc文件:
$ sudo find / -iname opencv4.pc /home/XXXX/opencv4.3_install/lib/pkgconfig/opencv4.pc /home/XXXX/opencv4.3/build/unix-install/opencv4.pc
如果上述配置成功,则会在
~/opencv4.3_install/lib/
文件夹中出现一个pkgconfig文件夹,里面有一个opencv.pc文件,内容大致如下:# Package Information for pkg-config prefix=/home/XXXX/opencv4.3_install exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir_old=${prefix}/include/opencv4/opencv includedir_new=${prefix}/include/opencv4 Name: OpenCV Description: Open Source Computer Vision Library Version: 4.3.0 Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cudabgsegm -lopencv_cudafeatures2d -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_cudacodec -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_cudaoptflow -lopencv_optflow -lopencv_cudalegacy -lopencv_videoio -lopencv_cudawarping -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_imgproc -lopencv_cudaarithm -lopencv_core -lopencv_cudev Libs.private: -lm -lpthread -lcudart_static -ldl -lrt -lnppc -lnppial -lnppicc -lnppicom -lnppidei -lnppif -lnppig -lnppim -lnppist -lnppisu -lnppitc -lnpps -lcublas -lcudnn -lcufft -L-L/usr/local/cuda -llib64 -L-L/usr/lib -lx86_64-linux-gnu Cflags: -I${includedir_old} -I${includedir_new}
注意:需要将第6行修改为:
includedir_old=${prefix}/include/opencv4/opencv2
如果没有自动生成,可以试着新建一个文件,将上述的内容复制进去,继续下一步;
-
配置环境
方法一(4.4的配置方法):
将/usr/local/opencv4.4/opencv4/build/lib/pkgconfig/
路径加入PKG_CONFIG_PATH
:sudo vim /etc/profile.d/pkgconfig.sh
在文件中加入下面一行:
export PKG_CONFIG_PATH=/usr/local/opencv4.4/opencv4/build/lib/pkgconfig:$PKG_CONFIG_PATH
保存退出后,使用命令激活:
$ source /etc/profile
方法2(4.3的配置方法):
在.bashrc
文件中添加PKG_CONFIG_PATH
sudo vim ~/.bashrc
在文件最后添加:
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/XXXX/opencv4.3_install/lib/pkgconfig export PKG_CONFIG_PATH
保存退出后,使用命令激活:
$ source ~/.bashrc
-
验证是否配置成功:
$ pkg-config --libs opencv4
判断路径时候添加成功:$ echo $PKG_CONFIG_PATH /home/XXXX/opencv4.3_install/lib/pkgconfig
4.3 Python-OpenCV环境
这里使用之前配置opencv4.4的例子。
找到编译好的python cv库:
$ sudo find / -iname cv2*.so
/usr/local/lib/python3.6/dist-packages/cv2/cv2.cpython-36m-x86_64-linux-gnu.so
/usr/local/lib/opencv4.4/opencv4/build/lib/python3/cv2.cpython-36m-x86_64-linux-gnu.so
/usr/local/lib/opencv4.4/opencv4/build/lib/cv2.so
/usr/local/opencv4.4/opencv4/build/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so
/usr/local/opencv4.4/opencv4/build/lib/python2.7/dist-packages/cv2/python-2.7/cv2.so
find: ‘/run/user/1000/gvfs’: 权限不够
cv2.cpython-36m-x86_64-linux-gnu.so就是编译好的python3的opencv库,把它复制到对应python解释器的/path/to/dist-packages/
(系统自带的python解释器)和/path/to/site-packages
(用户安装的python解释器)目录下,之后就能在该python解释器中使用python-opencv库。
链接到系统自带的python3解释器中:
$ sudo ln -s /usr/local/opencv4.4/opencv4/build/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/cv2.so
链接到Anaconda创建的虚拟环境python3解释器中:
$ ln -s /usr/local/opencv4.4/opencv4/build/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so ~/anaconda3/lib/python3.7/site-packages/cv2.so
5. 测试OpenCV
环境配置完成,对我们安装的OpenCV进行测试:
cd /home/XXXX/opencv4.3/samples/cpp/example_cmake/
修改example.cpp 文件:
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>
using namespace cv;
using namespace std;
void drawText(Mat & image);
int main()
{
cout << "OpenCV version : " << CV_VERSION << endl;
cout << "Major version : " << CV_MAJOR_VERSION << endl;
cout << "Minor version : " << CV_MINOR_VERSION << endl;
cout << "Subminor version : " << CV_SUBMINOR_VERSION << endl;
cout << "Built with OpenCV " << CV_VERSION << endl;
Mat image;
VideoCapture capture;
capture.open(0);
if(capture.isOpened())
{
cout << "Capture is opened" << endl;
for(;;)
{
capture >> image;
if(image.empty())
break;
drawText(image);
imshow("Sample", image);
if(waitKey(10) >= 0)
break;
}
}
else
{
cout << "No capture" << endl;
image = Mat::zeros(480, 640, CV_8UC1);
drawText(image);
imshow("Sample", image);
waitKey(0);
}
return 0;
}
void drawText(Mat & image)
{
putText(image, "Hello OpenCV",
Point(20, 50),
FONT_HERSHEY_COMPLEX, 1, // font face and scale
Scalar(255, 255, 255), // white
1, LINE_AA); // line thickness and type
}
5.1 直接编译运行
$ g++ -std=c++11 example.cpp `pkg-config --libs --cflags opencv4` -o example
$ ./example
输出:
5.2 通过Makefile测试
-
修改目录下Malefile文件
因为OpenCV 4.0需要C++11支持,且生成的pkg-config文件名为opencv4.pc,所以需要对当前目录下的Malefile文件进行修改:$ vim Makefile
修改
CXXFLAGS += -c -Wall $(shell pkg-config --cflags opencv)
为CXXFLAGS += -c -std=c++11 -Wall $(shell pkg-config --cflags opencv4)
修改LDFLAGS += $(shell pkg-config --libs --static opencv)
为LDFLAGS += $(shell pkg-config --libs --static opencv4)
修改后如下:CXX ?= g++ CXXFLAGS += -c -std=c++11 -Wall $(shell pkg-config --cflags opencv4) 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
$ make
-
运行生成的文件opencv_example:
$ ./opencv_example
输出:
OpenCV version : 4.4.0 Major version : 4 Minor version : 4 Subminor version : 0 Built with OpenCV 4.4.0 [ WARN:0] global /usr/local/lib/opencv4.4/opencv4/modules/videoio/src/cap_v4l.cpp (893) open VIDEOIO(V4L2:/dev/video0): can't open camera by index No capture
5.3 通过Cmake测试
-
修改 CMakeLists.txt 文件
因为更改了opencv的安装路径(~/opencv4.3_install/),所以测试前需要在CMakeLists.txt文件的10行find_package(OpenCV REQUIRED)前面加上:set(OpenCV_DIR /home/XXXX/opencv4.3_install/lib/cmake/opencv4/)
CMakeLists.txt 文件:
# cmake needs this line cmake_minimum_required(VERSION 3.1) # Define project name project(opencv_example_project) # Find OpenCV, you may need to set OpenCV_DIR variable # to the absolute path to the directory containing OpenCVConfig.cmake file # via the command line or GUI set(OpenCV_DIR /home/XXXX/opencv4.3_install/lib/cmake/opencv4/) find_package(OpenCV REQUIRED) # If the package has been found, several variables will # be set, you can find the full list with descriptions # in the OpenCVConfig.cmake file. # Print some message showing some of them message(STATUS "OpenCV library status:") message(STATUS " config: ${OpenCV_DIR}") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " libraries: ${OpenCV_LIBS}") message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") # Declare the executable target built from your sources add_executable(opencv_example example.cpp) # Link your application with OpenCV libraries target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
-
cmake
输入:$ cmake .
注意这里所处文件夹是example_cmake,这个文件夹里有CMakeLists.txt
注意cmake 后面有个空格,有个“.”
,一个点表示当前目录,两个点表示父目录
-
make
$ make
- 运行生成的文件opencv_example
./opencv_example
6. 多版本OpenCV 切换
- 打开终端输入命令:
$ sudo gedit ~/.bashrc
- 在文件末尾增加以下内容:
export PKG_CONFIG_PATH=/usr/local/opencv4.4/opencv4/build/lib/pkgconfig export LD_LIBRARY_PATH=/usr/local/opencv4.4/opencv4/build/lib
- 使配置生效:
$ source ~/.bashrc
- 查看opencv版本:
查看opencv安装路径:$ pkg-config --modversion opencv
sudo find / -iname "*opencv*"
参考链接: