首页 > 编程语言 >编译 OpenCV 的 Python 依赖

编译 OpenCV 的 Python 依赖

时间:2023-09-21 22:25:00浏览次数:39  
标签:编译 Python dev OpenCV apt install

这一次编译 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

标签:编译,Python,dev,OpenCV,apt,install
From: https://www.cnblogs.com/freeweb/p/17721112.html

相关文章

  • 20230921-python的get请求和post请求区别
    1.。get请求  2。post请求   ......
  • python+playwright 学习-81 page.expect_request()捕获网络请求
    前言page.expect_request()可以捕获网页上发出去的请求,当有多个请求时,可以根据请求url,请求方式判断。expect_request官方文档示例withpage.expect_request("http://example.com/resource")asfirst:page.get_by_text("triggerrequest").click()first_request=firs......
  • python: Essential Algorithms
     #encoding:utf-8#版权所有2023涂聚文有限公司#许可信息查看:#描述:#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python311#Datetime:2023/9/2121:28#User:geovindu#Product:PyCharm#Project:EssentialAlgor......
  • Python 内置数据类型详解
    内置数据类型在编程中,数据类型是一个重要的概念。变量可以存储不同类型的数据,不同类型可以执行不同的操作。Python默认内置了以下这些数据类型,分为以下几类:文本类型:str数值类型:int、float、complex序列类型:list、tuple、range映射类型:dict集合类型:set、frozenset布尔类型......
  • 【C#】【Python】【实例】统计多个文件夹下的图片
    因工作需要繁琐的进行同一目录多个文件夹下的图片统计,便使用代码来解决。需求:统计的是多少个文件夹包含了图片,并非是统计有多少张图。 我们先用Python来创建一个现场环境(巩固巩固py知识):1importos23#根目录4root_path=r"C:\Users\Desktop\1111"56forit......
  • 在不用插件和断网的情况下怎么实现编译python?
    要在不使用插件和断网的情况下编译Python代码,您通常不需要进行编译,因为Python是一种解释型语言,它将代码逐行执行而不需要显式编译过程。然而,如果您希望将Python代码打包成一个独立的可执行文件以便于分发,您可以使用一些第三方工具,如PyInstaller、cx_Freeze或Py2exe,但这些工具在没有......
  • Python中*args(参数)和 **kwargs(关键字参数)的区别
    *args--Python可以使用*args传递多个参数,但是不能使用它来传递键值对(字典)参数。**kwargs--Python另一个名为**kwargs的参数允许我们将字典类型的键值对参数传递给函数。注:两者均支持可变数量的参数传递。......
  • python打包文件过大的解决方法
       开发完一个python客户端文件后,一般需要发布为exe文件以便用户下载安装。但很多初学者开发的一个仅有几M的小软件,打包的exe文件却高达几十M甚至几百M。这里根据工作实践总结了一个有效方法分享给大家。   首先,在选定路径下创建一个文件夹folder   其次,在新建文......
  • Cygwin 编译的动态库文件.dll.a
    前提Cygwin编译OpenSSL出来的有两种文件:libcrypto.a和libcrypto.dll.a,VS编译调用没有问题,运行卡住,暂时未解决测试代码#include<openssl/evp.h>intmain(intargc,char*argv[]){ EVP_MD_CTX*mdctx; mdctx=EVP_MD_CTX_new(); EVP_MD_CTX_init(mdctx); EVP_DigestInit(m......
  • Python Web开发:Django框架入门
    Django是一个高级的PythonWeb框架,它鼓励快速开发和干净,务实的设计。它旨在使开发人员能够快速地构建和维护高质量的Web应用程序。在本博文中,我们将介绍Django框架的基础知识,并通过具体案例说明其功能。Django安装首先,我们需要在计算机上安装Django。你可以使用pip(Python包管理器)来......