一、OpenCV 的概述
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,提供了从基本操作到复杂算法的广泛工具集。无论你是图像处理的新手还是希望提升技能的专业人士,OpenCV 都能成为你的强大助手。它是一个跨平台的库,实现了多种编程语言的接口,包括 Python。它被广泛用于实时图像处理、对象检测、人脸识别、视频分析等领域。
OpenCV 开源计算机视觉库的概念、特性及适用场景,详细说明了 OpenCV-Python 的环境配置与 pip 安装方法。内容涵盖图像读取显示、灰度转换、边缘检测、人脸及车牌识别等核心代码示例,并列举了 OpenCV 主要功能模块及版本冲突解决策略。

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,提供了从基本操作到复杂算法的广泛工具集。无论你是图像处理的新手还是希望提升技能的专业人士,OpenCV 都能成为你的强大助手。它是一个跨平台的库,实现了多种编程语言的接口,包括 Python。它被广泛用于实时图像处理、对象检测、人脸识别、视频分析等领域。
OpenCV 基于 BSD 许可发行,可运行在 Linux、Windows、Android 和 Mac OS 操作系统上。它轻量级且高效,由一系列 C 函数和少量 C++ 类构成,同时提供了 Python、Ruby、MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 用 C++ 语言编写,主要接口也是 C++ 语言,但保留了大量的 C 语言接口。
在计算机视觉项目的开发中,OpenCV 作为大众化的开源库,拥有丰富的常用图像处理函数库,采用 C/C++ 语言编写,能够快速地实现一些图像处理和识别的任务。此外,它还提供了 Java、Python、CUDA 等的使用接口及机器学习的基础算法调用,使得图像处理和图像分析变得更加易于上手。
OpenCV-Python 是一个用于解决计算机视觉问题的 Python 绑定库。
Python 是由 Guido van Rossum 开发的一种通用编程语言,由于其简单性和代码可读性,它很快就变得非常流行。它使程序员能够在不降低可读性的情况下用更少的代码行来表达思想。与 C/C++ 这样的语言相比,Python 要慢一些。也就是说,使用 C/C++ 可以轻松地扩展 Python,这允许我们用 C/C++ 编写计算密集型代码,并创建可以用作 Python 模块的 Python 包装器。这给了我们两个好处:首先,代码和原始的 C/C++ 代码一样快;其次,用 Python 编写代码比用 C/C++ 更容易。
OpenCV-Python 是原始 OpenCV C++ 实现的 Python 包装器。
OpenCV-Python 使用 Numpy,它是一个高度优化的库,用于使用 MATLAB 风格的语法进行数值操作。所有的 OpenCV 数组结构都被转换为 Numpy 数组和从 Numpy 数组转换而来。这也使得与其他使用 Numpy(如 SciPy 和 Matplotlib)的库集成更加容易。
因为 OpenCV 依赖一些库,如 Numpy 方法等,安装 OpenCV 之前需要先安装 numpy、matplotlib。
在安装 OpenCV 之前,确保您的 Python 环境已正确设置。
OpenCV 支持 Python 3.x 版本,并且需要在您的机器上安装 Python 和 pip。
如果 Python 3.x 版本安装或您的 Python 环境存在问题,可以尝试在虚拟环境中安装 OpenCV。
创建和使用虚拟环境
虚拟环境是一个独立于系统 Python 环境的空间,可以在其中安装和管理 Python 包。按照以下步骤创建和使用虚拟环境:
创建虚拟环境:
python3 -m venv myenv
这将在当前目录下创建一个名为 myenv 的虚拟环境。
激活虚拟环境:
source myenv/bin/activate
myenv\Scripts\activate
当虚拟环境激活后,终端提示符会显示为 (myenv),表示你现在在虚拟环境中工作。
在虚拟环境中安装 OpenCV: 确保在虚拟环境中后,使用普通的 pip 命令来安装 OpenCV:
pip install opencv-python
Python:确保已安装 Python 3.x 版本。
可以通过在命令行输入以下命令检查:
python --version 或 python3.12 --version
pip 是 Python 的包管理工具。
它通常与 Python 一起安装,但如果没有安装 pip,可以通过以下命令安装:
python -m ensurepip --upgrade
查看 pip 的版本号
pip --version
安装 opencv-python
pip3 install opencv-python
安装 opencv-contrib-python(可选) 如果我们要利用 SIFT 和 SURF 等进行特征提取或支持 contrib 模块,需要安装完整版。
pip3 install opencv-contrib-python 或(指定版本号)pip3 install opencv-contrib-python==3.4.2.17
pip install opencv-python # 提供核心模块
pip install opencv-python-headless # 适合无图形界面(如服务器环境)
安装完成后,可以通过在 Python 中导入 OpenCV 库来验证安装是否成功。
在 Python 交互式命令行或脚本中输入以下命令:
import cv2
print(cv2.__version__)
**注意:**安装的时候是 opencv_python,但在导入的时候采用 import cv2。
如果输出 OpenCV 的版本号,说明安装成功。
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
说明:
cv2.imread 函数用于读取图像。cv2.imshow 函数用于显示图像。cv2.waitKey(0) 使得窗口等待直到用户按下任意键。cv2.destroyAllWindows 关闭所有 OpenCV 创建的窗口。Matplotlib 是 Python 的一个绘图库,里头有各种各样的绘图方法。现在,你可以学习怎样用 Matplotlib 显示图像,你可以放大、保存图像等等。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('example.jpg', 0)
plt.imshow(img, cmap='gray', interpolation='bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()
**注意:**彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotlib 是 RGB 模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotlib 正确显示。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('example.jpg')
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
plt.subplot(121); plt.imshow(img) # expects distorted color
plt.subplot(122); plt.imshow(img2) # expect true color
plt.show()
cv2.imshow('bgr image', img) # expects true color
cv2.imshow('rgb image', img2) # expects distorted color
cv2.waitKey(0)
cv2.destroyAllWindows()
正常绘制且展示:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 创建一个空白的图像
img = np.zeros((512, 512, 3), np.uint8)
# 2 绘制图形
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
cv.circle(img, (447, 63), 63, (0, 0, 255), -1)
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img, 'OpenCV', (10, 500), font, 4, (255, 255, 255), 2, cv.LINE_AA)
# 3 图像展示
plt.imshow(img[:, :, ::-1])
plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
plt.show()
import cv2
# 读取彩色图像
image = cv2.imread('example.jpg')
# 将图像转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 显示灰度图
cv2.imshow('Gray Image', gray_image)
# 保存处理后的图像
cv2.imwrite('gray_example.jpg', gray_image)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭窗口
cv2.destroyAllWindows()
说明:
cv2.cvtColor 函数用于转换图像的颜色空间,这里我们将图像从 BGR 转换为灰度。cv2.COLOR_BGR2GRAY 表示将 BGR 格式图像转换为灰度图。使用 Canny 算法进行边缘检测:
edges = cv2.Canny(image, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
参数说明:
使用 OpenCV 进行人脸识别是一个高级应用。
import cv2
# 加载预训练的人脸识别模型
face_cascade = cv2.CascadeClassifier('path_to_haarcascade_frontalface_default.xml')
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5)
# 在检测到的人脸周围画矩形
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 3)
# 显示结果
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
说明:
CascadeClassifier 类用于加载预训练的级联分类器。detectMultiScale 方法用于在图像中检测人脸。import cv2
# 读取图像
image = cv2.imread('path_to_image.jpg')
# 转换为灰度图
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
_, thresh = cv2.threshold(gray_image, 150, 255, cv2.THRESH_BINARY_INV)
# 寻找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓,寻找车牌
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
if w > 100 and h > 30: # 假设车牌的最小尺寸
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('License Plate Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
实现思路和关键步骤:
其中 core、highgui、imgproc 是最基础的模块,分别如下:
对于图像处理其他更高层次的方向及应用,OpenCV 也有相关的模块实现
解决方法:使用虚拟环境隔离项目依赖:
python -m venv opencv_env
source opencv_env/bin/activate # Linux/Mac
opencv_env\Scripts\activate # Windows

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online