转载请注明作者和出处: http://blog.csdn.net/john_bh/
在官方网站下载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
首先是一些必须安装的依赖项:
$ 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
先不要着急编译安装,因为在编译过程中需要一些依赖包,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上了,下载链接:
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上了,下载链接:
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上了,下载链接:
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上了,下载链接:
创建编译文件夹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 ..
OPENCV_GENERATE_PKGCONFIG
用于生成opencv4.pc
文件,支持pkg-config功能。
NVIDIA官网查询算力。 使用命令:nvidia-smi
查看GPU型号,我的是 GeForce RTX 2080
,对应的算力如下图:
cmake
命令的结果中可以看到是否支持CUDA以及Python情况。
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 目录。
配置OpenCV动态库环境——程序执行时加载动态库*.so的路径。
$ sudo echo "~/opencv4.3_install/lib/" >> /etc/ld.so.conf.d/opencv4.3.conf
#使配置生效
$ sudo ldconfig
修改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
这里使用之前配置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
环境配置完成,对我们安装的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
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
}
$ g++ -std=c++11 example.cpp `pkg-config --libs --cflags opencv4` -o example
$ ./example
修改目录下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
修改 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
$ 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
$ pkg-config --modversion opencv
查看opencv安装路径:sudo find / -iname "*opencv*"
参考链接: