这一次编译 OpenCV 的 Python 依赖为了方便运行我们使用 Docker 进行编译,环境准备如下:

  1. 系统依赖:Ubuntu 18.04

  2. Python 版本:3.6,Ubuntu 18.04 官方源安装的默认版本

  3. OpenCV 版本:3.4.16,是目前 3.x 的最新版

  4. CMake 版本:3.10

  5. GCC 版本(含 C++):7.5

我们首先拉取并进入镜像:

docker pull ubuntu:18.04
docker run -it ubuntu:18.04 /bin/bash

然后我们配置下国内源:

cp /etc/apt/sources.list /etc/apt/sources.list.bak
sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list

确认下源可用:

apt update

安装 CMake 和 GCC/g++ 环境:

apt install cmake
apt install gcc g++

这里 CMake 默认是 3.10 版本,GCC 和 g++ 都是 7.5 的版本。

然后继续安装 Python 环境和 NumPy 依赖:

apt install python3 python3-dev python3-numpy

然后安装 FFmpeg 基本的库和 GStreamer 视频插件:

apt install libavcodec-dev libavformat-dev libswscale-dev
apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

然后安装必要的图像开发库:

apt install libpng-dev libjpeg-dev libopenexr-dev libtiff-dev libwebp-dev

如果需要界面的话得安装 GTK 组件,这个可选,我这里没有安装:

# GTK 2
apt install libgtk2.0-dev
# GTK 3
apt install libgtk-3-dev

然后下载 OpenCV 的源码包,通过链接 https://opencv.org/releases/ 下载,为了减小后续 Docker 镜像的大小,我们可以提前从外部把源码包映射进去,这样编译出来的内容不会影响镜像本身的大小,否则镜像会比较大。如果我们启动的时候忘记了引入外部卷,那么可以先编译完,然后把编译结果拷出去,然后再启动一个相同的原始镜像,直接映射编译好的完整的源码目录,上面的基础环境重新安装一遍后直接在编译好的基础上安装也是可以的,目的是为了减小镜像本身的大小。我们下面开始编译:

# 进入源码目录后执行
mkdir build
cd build
# 默认参数下会自动检测相关的依赖,正常是够用的
cmake ../

然后开始编译:

make -j4
# 安装
make install

安装之后我们测试一下 Python 依赖:

import cv2
print(cv2.__version__)

没问题的话我们可以退出容器:

exit

将结束的容器发布为镜像:

docker commit -m "OpenCV on Python3" -a "zengzy" <container-id> python3.6:opencv-3.4.16

然后可以删除原来的停止的容器。我们写个脚本测试下生成 H264 编码的视频:

import cv2
import numpy as np vid = cv2.VideoWriter('out.mp4', cv2.VideoWriter_fourcc(*'avc1'), 25, (300,300)) for i in range(250):
img = np.random.randint(0,255, (300,300,3), dtype=np.uint8)
vid.write(img)
vid.release()

保存脚本为 test_video_writer.py 然后运行下:

docker run --rm -w `pwd` -v `pwd`:`pwd` python3.6:opencv-3.4.16 python3 test_video_writer.py

可以正常生成 mp4 视频文件并且正常播放的话就没问题了。

Reference:

  1. https://docs.opencv.org/3.4.20/d2/de6/tutorial_py_setup_in_ubuntu.html

编译 OpenCV 的 Python 依赖的更多相关文章

  1. cmake编译opencv指南

    目录 cmake编译opencv指南 用包管理器安装 查看opencv相关的包 执行安装 编译安装 为什么编译安装 下载源码 编译脚本 执行编译脚本.解决3rdparty下载 编译后的设定-环境变量 ...

  2. Ubuntu 16.04下为Android编译OpenCV 3.2.0 Manager

    http://johnhany.net/2016/07/build-opencv-manager-for-android-on-ubuntu/ 最近想在Android上尝试一下SIFT和SURF匹配算 ...

  3. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  4. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. ------------------------------------- ...

  5. (原)windows8.1上使用opencv for python

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6204100.html 参考网址: http://www.docs.opencv.org/master/ ...

  6. WIN7x64+VS2010+OpenCV2.4.10+cmake3.5.0重新编译OpenCV

    1,参考博文 Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV [OpenCV入门教程之七] 玩转OpenCV源代码:生成OpenCV工程解决 ...

  7. Ubuntu16.04安装opencv for python/c++

    Ubuntu16.04安装opencv for python/c++ 网上关于opencv的安装已经有了不少资料,但是没有一篇资料能让我一次性安装成功,因此花费了大量时间去解决各种意外,希望这篇能给一 ...

  8. 为OPENCV添加freetype支持并显示中文字符(在mac上编译opencv及contrib库)

    在mac电脑上管理这些gnu的库一般都使用Homebrew,但总有一些你个性化的需要是官方的Homebrew配方无法满足的.比如在屏幕的输出中使用中文字符. 在OPENCV中输出UTF8字符集早已经有 ...

  9. [转]Python依赖打包发布详细

    Python依赖打包发布详细   http://www.cnblogs.com/mywolrd/p/4756005.html 将Python脚本打包成可执行文件   Python是一个脚本语言,被解释 ...

  10. win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

    win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的优点:能够调试的时候看OpenCV的源码. 重编译要得到的东西:Debug版本号和Release版本号 ...

随机推荐

  1. chrome 快速执行 snippets 1. F12 2. Ctrl+Shift+P 3. show snippets 4. 上下选择 5. Ctrl + Enter

    chrome 快速执行 snippets F12 Ctrl+Shift+P show snippets 上下选择 Ctrl + Enter

  2. 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \

    为什么 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \ 快速移动到下一个 注意有时候输入法会有问题 因为 Ctrl + Shift 是切换输入法,所以回头 ...

  3. Nginx 打不开 80端口占用 netstat -aon|findstr "80" 看有没有80占用 有的话 net stop http

    Nginx 打不开 80端口占用 netstat -aon|findstr "80" 看有没有80占用 有的话 net stop http

  4. ESP8266 SPI 开发之软件驱动代码分析

    一 基本概述 esp8266的SPI代码流程非常的清晰,主要有三部分构成: spi_init 配置 spi_trans 配置 data_transfer 配置这三块组成. 在这里,笔者就针对spi的这 ...

  5. 视野修炼-技术周刊第76期 | Rolldown 开源

    欢迎来到第 76 期的[视野修炼 - 技术周刊],下面是本期的精选内容简介 强烈推荐 Rolldown 开源 - Rollup 的锈化版 前端调试工具超全汇总 开源工具&技术资讯 OhMyLi ...

  6. Serverless学习笔记

    Serverless 闲言碎语 前段时间看了一些Serverless的文章,恰好最近又听了一门Serverless的应用实践课程,就把笔记拿出来和大家分享一下,如表述有误还请各位斧正 大家关心的问题 ...

  7. js使用typeof与instanceof相结合编写一个判断常见变量类型的函数

    /** * 常见类型判断 * @param {any} param */ function getParamType(param) { // 先判断是否能用typeof 直接判断 let types1 ...

  8. [LeetCode] 5933. k 镜像数字的和

    一.摘要 本文介绍了一种通过模拟寻找十进制镜像数字,然后判断其对应的k进制表示是否也是镜像的方法.具体来讲即从小到大遍历10进制的镜像数字,然后对10进制镜像数字转为k进制,然后判断转为k进制后是否还 ...

  9. YAML语法入门

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 在学习playboo ...

  10. KingbaseES kdb_database_link客户端字符集导致的乱码问题

    前言 关于我们经常见到的字符集乱码问题,很可能因为数据库服务器端的操作系统字符集和客户端字符集不一致导致的. 当我们通过kdb_database_link插件访问oracle数据库出现乱码,只需要调整 ...