安装步骤:
1、更新软件仓库,使用国内源:在CentOS中配置使用阿里的开源镜像
1)备份原来的文件/etc/yum.repos.d
2)到阿里开源镜像站点下载系统对应版本的repo文件:
#CentOS8
[root@VM-0-8-centos yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-8.repo
vim Centos-8.repo将里面的所有enabled=0改为enabled=1,即使用里面的所有软件仓库。
3)配置清华源(可以加上多几个源,如清华源、网易源等):
$ vi /etc/yum.repos.d/CentOS-cnnic.repo
#清华源如下配置,这里centosplus-cnnic和PowerTools-cnnic中的enabled根据需求打开;
[BaseOS-cnnic]
name=CentOS-$releasever-Base-cnnic
baseurl=https://mirrors.cnnic.cn/centos/$releasever/BaseOS/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.cnnic.cn/centos/RPM-GPG-KEY-CentOS-Official
[AppStream-cnnic]
name=CentOS-$releasever-AppStream-cnnic
baseurl=https://mirrors.cnnic.cn/centos/$releasever/AppStream/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.cnnic.cn/centos/RPM-GPG-KEY-CentOS-Official
[extras-cnnic]
name=CentOS-$releasever-Extras-cnnic
baseurl=https://mirrors.cnnic.cn/centos/$releasever/extras/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.cnnic.cn/centos/RPM-GPG-KEY-CentOS-Official
[centosplus-cnnic]
name=CentOS-$releasever-Plus-cnnic
baseurl=https://mirrors.cnnic.cn/centos/$releasever/centosplus/$basearch/os/
gpgcheck=1
enabled=0
gpgkey=https://mirrors.cnnic.cn/centos/RPM-GPG-KEY-CentOS-Official
[PowerTools-cnnic]
name=CentOS-$releasever-PowerTools-cnnic
baseurl=https://mirrors.cnnic.cn/centos/$releasever/PowerTools/$basearch/os/
gpgcheck=1
enabled=0
gpgkey=https://mirrors.cnnic.cn/centos/RPM-GPG-KEY-CentOS-Official
4)清除系统yum缓存,并重新生成新的yum缓存
dnf -y install epel-release
dnf clean all
dnf makecache
dnf repolist
如果只加了阿里源,执行dnf repolist出现结果如下:
2、安装ffmpeg
参考:linux下成功安装调用ffmpeg记录_蠢萌-CSDN博客_ffmpeg linux
3、编译安装opencv
1)安装必需和可依赖项
sudo dnf install epel-release git gcc gcc-c++ cmake3 qt5-qtbase-devel python3 python3-devel python3-pip cmake python3-devel python3-numpy gtk2-devel libpng-devel jasper-devel openexr-devel libwebp-devel libjpeg-turbo-devel libtiff-devel tbb-devel libv4l-devel eigen3-devel freeglut-devel mesa-libGL mesa-libGL-devel boost boost-thread boost-devel gstreamer1-plugins-base
2)下载OpenCV源码和OpenCV-Contrib源码
新建一个文件夹存放下载的opencv文件:mkdir ~/opencv_build
cd ~/opencv_build
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
我这里安装的是opencv 4.1.0及opencv_contrib 4.1.0,提供一个快速下载:点这里
3)开始编译
创建一个临时构建目录build:mkdir build
进入build目录:cd ./build并执行
cmake3 -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_GENERATE_PKGCONFIG=ON -D OPENCV_EXTRA_MODULES_PATH=~/opencv_build/opencv_contrib/modules -D BUILD_EXAMPLES=ON -D WITH_FFMPEG=ON ..
特别注意的是,在这个过程中会出现一些错误,严格的说并不算是错误,只是在配置的过程中会联网下载一些依赖库,但由于opencv版本的问题,这些依赖库的地址可能发生了改变,而旧的opencv编译配置代码中还是用的旧地址,这就会导致下载依赖库不成功,导致有些功能不能被安装,但这些问题并不会在配置完的最后行显示出来,而是在配置(指的是运行上述的cmake3.....)时显示输出:如,
下载ippicv超时:
这是网络无法下载的原因,可以采用如下方法解决:
<1>.进入源码目录 opencv-3.4.8/3rdparty/ippicv
<2>.手动修改ippicv.cmake文件,删掉下载链接,指向ippicv_2019_lnx_intel64_general_20180723.tgz所在目录,该文件下载地址 由于网络下载很慢,可以从这里下载链接:点这里
将上图链接换成如下,注意不要加文件名xxxxx.tgz,只需指定目录
"file:///root/kkk/"
重新执行上面的指令:camke3 -D..................
下载xxx.i超时:
可以查看 build 文件夹下的日志文件 CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中就有说明失败的对应xxx.i的下载地址,复制地址到浏览器打开,再复制里面的内容到新建文件,保存并命名为同名文件,放在 opencv_contrib/modules/xfeatures2d/src/ 路径下即可。
总共缺了以下几个文件,都需要拷贝:
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
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
文件可到这里下载:点这里
下载face_landmark_model.dat超时:
或者可到这里下载:这里
修改文件:
vim /root/opencv_build/opencv_contrib-4.1.0/modules/face/CMakeLists.txt
我下载好的face_landmark_model.dat是放在root下的,故上图改的为:"file:///root/"
需要注意的是,文件下载好后需要使用指令校验一下MD5的值:
如果这个值跟上面的CMakeLists.txt中的对不上的话,就需要将CMakeLists.txt中__file_hash后面的MD5的值改为上图校验出来的新的MD5的值。
下载v0.1.1d.zip超时:
手动下载地址:https://github.com/opencv/ade
或者可到这里下载:这里
为了避免后续出错,请下载master版本的,不要下载release。
修改文件:
vim ./opencv_build/opencv-4.1.0/modules/gapi/cmake/DownloadADE.cmake
同样,需要对比MD5的校验值。
还需要注意的是:github下载的zip文件里的压缩包内的文件夹的名称为:ade-master,,,需要改为:ade-0.1.1d
再重新压缩命名为:v0.1.1d.zip
否则执行上面的cmake时会出错:
4)执行上面的cmake完后会出现打印内容,着重查看:
cmake成功的话打印内容最后应该是:
5)编译并安装opencv
make #计算机配置高的话可以多个核同时编译:make -j8 注:-j后面的8是处理器的内核数,可以通过键入nproc命令查看
出现编译错误1:
解决办法:
cp /root/opencv_build/opencv-4.1.0/modules/dnn/test/test_common.hpp /root/opencv_build/opencv-4.1.0/build/modules/dnn/
出现编译错误2:
编译到以下位置时机器卡死
原因:机器内存不够
查看内存:free -h
其中的 Mem: 这个是物理机的内存,可以看到我的是2G的内存;Swap是交换分区,也就是当物理内存不够时,会使用Swap的内存空间作为虚拟内存使用。
当编译运行时会发现Mem: 的内存基本都被使用完了,而此时也发现该主机并没有分配交换分区,此处可以看到是0,这就导致在物理内存不够时机器直接卡死,因为虚拟内存没有空间给它使用。
解决办法:增加虚拟内存,也就是增加Swap的空间
可参考:CentOS增加虚拟内存_wang5701071的博客-CSDN博客_centos 虚拟内存设置
交换空间扩容后:
此时交换分区变为了4G,接着再重新编译即可顺利完成。
6)安装opencv库:sudo make install
创建一个符号链接opencv4.pc提交/usr/share/pkgconfig 目录和执行 ldconfig 重建库缓存:
sudo ln -s /usr/local/lib/pkgconfig/opencv4.pc /usr/share/pkgconfig/
sudo ldconfig
当然pkgconfig也可能安装在lib64下,根据自己的改。
7)添加环境变量与加载动态库
sudo vim /etc/profile
在文件末尾另起行加入如下两行:
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
同样,这里需要查看自己当前的pkgconfig是在/usr/local/lib还是/usr/local/lib64,根据自己的改。
令配置生效:
source /etc/profile
接下来进行pkg-config配置,默认的pkg搜索链接路径/usr/lib/pkgconfig,需要将opencv.pc拷贝到pkg的默认路径下:
cp /usr/local/lib/pkgconfig/opencv4.pc /usr/lib/pkgconfig
同样,根据自己的pkgconfig和opencv4.pc的路径改为自己的。
有些人的是:cp /usr/local/lib64/pkgconfig/opencv4.pc /usr/lib/pkgconfig
令配置生效:
ldconfig
8)查看是否安装成功(若还不成功的话试一试重启大法)
pkg-config --modversion opencv4
出现版本号时即表示安装成功。
9)验证opencv是否可以打开视频
新建一个test.cpp
#include <opencv4/opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
VideoCapture capture;
Mat frame;
frame= capture.open("./1.mp4");
if(!capture.isOpened())
{
printf("can not open ...\n");
return -1;
}
//namedWindow("output", CV_WINDOW_AUTOSIZE);
while (capture.read(frame))
{
imshow("output", frame);
waitKey(10);
}
capture.release();
return 0;
}
编译该cpp文件
g++ test.cpp -I /usr/local/include/opencv4 -L /usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -lopencv_videoio -std=gnu++11
编译成功后会生成a.out
执行该文件:./a.out
运行视频成功即表示安装opencv成功。
当然,也可以测试一张图片:
checkOpenCV.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat img = cv::imread("./1.png", 1);
if(!img.data){
std::cout << " fail to load ./1.png " << std::endl;
return -1;
}
//cv::imshow("img", img);
cv::imwrite("11.png", img);
return 0;
}
编译指令:
g++ checkOpenCV.cpp -I /usr/local/include/opencv4 -L /usr/local/lib64 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_calib3d -lopencv_features2d -lopencv_videoio -std=gnu++11
编译成功后会生成a.out
执行该文件:./a.out