这一次编译 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. Mysql 增删改查语言系列

    Mysql 数据语言系列 目录 Mysql 数据语言系列 一.数据定义语言 DDL 1 数据库规范 2 DDL 语言使用 2 创建视图 二. 数据操纵语言 DML 1 插入语法 2 更新语法 3 删除 ...

  2. Zabbix“专家坐诊”第195期问答汇总

    问题一 Q:麻烦请教一下zabbix服务器总是上报这几个告警,需要处理嘛?怎么处理? A:同步历史数据进程负载过高的话会影响到server的性能,建议增加服务器硬件配置. Q:是需要增加哪方面的配置, ...

  3. 基于STM32F407MAC与DP83848实现以太网通讯四(STM32F407MAC数据收发与DMA描述符)

    上一章实现的MAC数据包的基础收发功能,但是只是简单的操作了ETH外设的收发包函数并没有深入了解其中的原理逻辑,本章结合STM32F40x文档与STM32F4x7_ETH_Driver驱动库了解MAC ...

  4. 酷呆桌面 CooDesker 桌面整理工具 - 软件推荐

    酷呆桌面 CooDesker 桌面整理工具 - 软件推荐 推荐理由 满足了我对桌面映射到某一目录的需求,这样桌面就真的干净了 免费且没有广告 可进入目录继续延展,双击空白地方返回上一层,非常方便 5M ...

  5. base64 转文件上传

    // 将base64转换为blob dataURLtoBlob (dataurl) { let arr = dataurl.split(',') let mime = arr[0].match(/:( ...

  6. 算法研究之合并两个已排序的数组java版

    package com.zken.test; /** * @author iamzken * 2015-8-28 * 合并两个有序数组 * */ public class Sorter2 { publ ...

  7. UE干货| UE虚幻引擎调试神器—控件反射器

    一.打开控件反射器 可以通过窗口→开发者工具→控件反射器 打开: 也可以在umg编辑器上方控件反射器打开. 二.UE控件反射器使用方法 运行项目后,点击控件反射器的"选择可测试命中控件&qu ...

  8. 使用 NVIDIA CloudXR 从 Google Cloud 流式传输 VR 和 AR 内容

    过去,与 VR 交互需要专用的高端工作站,以及(取决于头显).壁挂式传感器和专用物理空间.VR 中的复杂任务可能会突破传感器范围.电缆长度和空间边界的限制,使艺术家陷入困境并限制他们的行动.该解决方案 ...

  9. golang 依赖控制反转(IoC) 改进版

    最近在开发基于golang下的cqrs框架 https://github.com/berkaroad/squat (陆续开发中,最近断了半年,懒了...).这个框架依赖ioc框架,因为之前写了一个io ...

  10. 恶意软件开发(四)通过查找进程名进行DLL注入

    通过进程名查找PID 当我们编写注入器的时候,肯定是希望直接通过进程名进行注入,而不是像上一篇笔记一样通过手动输入PID进行查找. 通过进程名查找PID的步骤如下: (1)创建系统中所有进程的快照 ( ...