记录一次完整的docker踏坑之旅

      大家都知道opencv的安装方式有两种,一种是直接pip安装,一种是源码安装,据网上资料所查,两者没多大区别。我以前都习惯用第一种,但是我有时候在想linux环境下如果我想构建c++项目,那么我怎么调用pip安装的opencv包呢?或者如果我源码编译的,c++项目和python项目是否都可以直接调用呢?还是说我把它们分开,源码编译的c++调用,pip安装的给python?直觉告诉我第三种可行性最高,带着这个疑问,我苦苦搜寻了一圈,发现没啥收获?于是我决定自己动手实践一下。下面就是基于docker的一次实践踩坑过程记录篇。

(1)拉取镜像

docker pull ubuntu 
docker run -itd --name ubuntu-test ubuntu 
docker exec -it ubuntu-test /bin/bash

(2)安装python与pip

apt-get update
apt-get install python3
apt-get install python3-pip

当python与pip安装好以后就开始了今天的正式踏坑之旅了。

》pip安装opencv

pip install opencv-python -i https://pypi.douban.com/simple

这里直接用的pip而不是pip3,安装成功,pip list也可以正常显示,但是导入的时候出现了问题

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

解决方法

apt update apt install libgl1-mesa-glx

ImportError: libgthread-2.0.so.0: cannot open shared object file: No such file or directory

解决方法

apt-get install libglib2.0-dev

现在python3 -c "import cv2"终于没有报错了。

》源码安装opencv

1、先安装依赖文件

apt-get install build-essential
apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
apt-get install python3-dev python3-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

第三步出现E: Unable to locate package libjasper-dev错误

解决办法

sudo apt-get install software-properties-common
sudo apt-get update
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"

由于镜像中没有wget,下载速度慢,于是本机下载,然后再cp到容器中

docker cp E:/Compressed/opencv-3.2.0.zip c45b:/home/

2、gcc/g++降低版本(可选)

gcc --version ##显示版本信息版本过高,于是将其降到4.8,但是在apt-get install gcc-4.8显示E: Package 'gcc-4.8' has no installation candidate,于是对容器换源

sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup  #首先备份源列表
sudo vim /etc/apt/sources.list

###替换原来内容
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse 
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

###更新下载安装
apt-get update
sudo apt-get install -y gcc-4.8
sudo apt-get install -y g++-4.8

##安装
cd /usr/bin
sudo rm gcc
sudo ln -s gcc-4.8 gcc
sudo rm g++
sudo ln -s g++-4.8 g++

3、开始cmake配置

cd /local/sdb/tools/opencv-4.1.2/build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local/opencv_4.1.2  ..

出现错误Fix libpng12-0 Missing In Ubuntu 18.04, 19.10, 20.04 Or 20.10,解决方法

sudo add-apt-repository ppa:linuxuprising/libpng12
sudo apt update
sudo apt install libpng12-0

中间出现

 但是并没有终止报错,所以后续也没操作,继续后面的处理,事实告诉好像这个两个库并没啥大影响。

最后编译结果:

4、编译安装

sudo make 
sudo make install

完成以后,到/usr/local/opencv_4.1.2文件夹下会生成4个编译安装好的文件,分别是bin、include、lib、share。可以通过如下指令查看opencv版本信息

pkg-config --modversion opencv

再下来用一个实例来检测一下安装好的opencv

#include <opencv2/opencv.hpp>
 
int main(int argc,char **argv){
    cv::Mat src(300,500,CV_8UC3,cv::Scalar::all(255));
    cv::imshow("hello-opencv",src);
    cv::waitKey(0);
}

编译

g++ -std=c++11 `pkg-config --cflags opencv` -o test test.cpp `pkg-config --libs opencv`

出现了下面这个错误

Package opencv was not found in the pkg-config search path. Perhaps you should add the directory containing `opencv.pc' to the PKG_CONFIG_PATH environment variable No package 'opencv' found

解决方法就是添加这个文件然后将其导入到环境变量中,具体操作如下:

首先创建opencv.pc文件,这里要注意它的路径信息:

cd /usr/local/opencv_4.1.2/lib
sudo mkdir pkgconfig
cd pkgconfig
vi  opencv.pc

然后在opencv.pc中添加以下信息,注意这些信息需要与自己安装opencv时的库路径对应:

prefix=/usr/local/opencv_4.1.2
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.1.2 
Libs: -L${exec_prefix}/lib -lopencv_imgproc  -lopencv_calib3d  -lopencv_ml  -lopencv_core  -lopencv_objdetect  -lopencv_dnn  -lopencv_photo  -lopencv_features2d  -lopencv_stitching  -lopencv_flann  -lopencv_videoio  -lopencv_gapi  -lopencv_video  -lopencv_highgui  -lopencv_imgcodecs
Libs.private: -ldl -lm -lpthread -lrt 
Cflags: -I${includedir_old} -I${includedir_new}

保存退出,然后将文件导入到环境变量:

export PKG_CONFIG_PATH=/usr/local/opencv_4.1.2/lib/pkgconfig

至此就配置好opencv.pc啦,再执行 pkg-config --cflags --libs opencv时输出结果如下:

-I/usr/local/include/opencv4 -L/usr/local/lib \
-lopencv_shape -lopencv_stitching -lopencv_objdetect \
-lopencv_superres -lopencv_videostab -lopencv_calib3d \
 -lopencv_features2d -lopencv_highgui -lopencv_videoio \
 -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml \
 -lopencv_imgproc -lopencv_flann -lopencv_core

接着继续上面的编译过程,成功编译生成test可执行文件,但是输入./test后又出现了error while loading shared libraries: libopencv_core.so.4.1: cannot open shared错误,但是在lib文件夹下都有,于是又开始填坑,

cd /etc/ld.so.conf.d
vi openCV.conf
###写入如下内容,根据自己的路径修改,然后保存退出
/usr/local/opencv_4.1.2/lib
sudo ldconfig

再运行./test完美运行,终于完成了这次的踩坑之旅。

5、打包制作自己的镜像并上传到阿里云

打包命令如下

docker commit c45be(容器id) ubuntu_opencv:v1

然后上传到阿里云镜像

1.登录阿里云Docker Registry

$ docker login --username=xiaoxiaoamu****@163.com registry.cn-hangzhou.aliyuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。

您可以在访问凭证页面修改凭证密码。

2.从Registry中拉取镜像

$ docker pull registry.cn-hangzhou.aliyuncs.com/tf_1/ubuntu_opencv:[镜像版本号]

3.将镜像推送到Registry

$ docker login --username=xiaoxiaoamu****@163.com registry.cn-hangzhou.aliyuncs.com$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/tf_1/ubuntu_opencv:[镜像版本号]$ docker push registry.cn-hangzhou.aliyuncs.com/tf_1/ubuntu_opencv:[镜像版本号]

如果大家有需要可以直接pull一下就可以啦,

docker pull registry.cn-hangzhou.aliyuncs.com/tf_1/ubuntu_opencv:v1

       好了,实验结果告诉我们两者分开安装是可行的!哈哈哈,那接下来就是自己愉快的玩耍啦!顺便吐槽一下,源码编译真的坑太多了,而且还慢!!!

参考链接:

1、Ubuntu系统上OpenCV 4.1.2 源码的编译与安装_zhangjd10的博客-CSDN博客

2、Package opencv was not found in the pkg-config search path._Hundreays-CSDN博客

3、pip和cmake编译安装opencv的文件对比-Windows和Linux

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值