OpenCV Python 基础入门教程
本文详细介绍了 OpenCV 在 Python 环境下的基础使用方法。内容涵盖安装配置、图像与视频的读写及处理、绘图操作、像素级访问与修改、图像算术运算、色彩空间转换、几何变换、阈值处理以及模板匹配等核心技术。此外还补充了轮廓检测和形态学操作等实用章节。文章提供了完整的代码示例,旨在帮助初学者快速掌握计算机视觉库的基本技能,为后续深入学习算法打下基础。

本文详细介绍了 OpenCV 在 Python 环境下的基础使用方法。内容涵盖安装配置、图像与视频的读写及处理、绘图操作、像素级访问与修改、图像算术运算、色彩空间转换、几何变换、阈值处理以及模板匹配等核心技术。此外还补充了轮廓检测和形态学操作等实用章节。文章提供了完整的代码示例,旨在帮助初学者快速掌握计算机视觉库的基本技能,为后续深入学习算法打下基础。

OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉库,最初由 C++ 编写,提供了 Python、Java 等语言的接口。它广泛应用于图像识别、视频分析、机器学习等领域。
apt 安装是最稳定的方式:sudo apt install python3-opencv
在 UOS 系统上同样适用。支持 AMD、ARM、MIPS 架构。
NumPy 是 Python 中用于科学计算的核心库,OpenCV 的所有数组操作都基于 NumPy。sudo apt -y install python3-numpy
虽然可以使用 pip 安装,但考虑到兼容性和稳定性,官方文档建议优先使用系统包管理器。
所有 OpenCV 类和函数都在 cv2 模块下,导入时通常简写为 cv:
import cv2 as cv
import numpy as np
img = cv.imread('path/to/image.jpg', flags=cv.IMREAD_COLOR)
cv.IMREAD_COLOR:加载彩色图像,忽略 alpha 通道(默认值)。cv.IMREAD_GRAYSCALE:加载灰度图像。cv.IMREAD_UNCHANGED:加载包括 alpha 通道的图像。1, 0, -1 代替。cv.imshow('Window Name', img)
销毁窗口:
cv.destroyAllWindows() # 销毁所有窗口
cv.destroyWindow('Window Name') # 销毁指定窗口
注意:显示窗口后通常需要配合 waitKey() 保持窗口打开。
cv.imwrite('output.jpg', img)
cap = cv.VideoCapture(0) # 0 代表默认摄像头
if not cap.isOpened():
exit()
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('frame', gray)
if cv.waitKey(1) == ord('q'):
break
cap.release()
cv.destroyAllWindows()
cap.read() 返回两个值:布尔值 ret(是否成功读取)和帧 frame。cap.get(id) 获取视频属性(如帧率、宽高),id 范围通常为 0-18。原理相同,只需修改输入源:
cap = cv.VideoCapture('video.mp4')
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
out.write(frame)
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
out.release()
cv.destroyAllWindows()
(width, height)。img = np.zeros((512, 512, 3), np.uint8)
cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
# 颜色格式为 BGR,最后一个参数为线宽
cv.circle(img, (center_x, center_y), radius, color, thickness)
# thickness=-1 表示填充
cv.rectangle(img, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), color, thickness)
px = img[100, 100] # 获取像素值 [B, G, R]
blue = img[100, 100, 0]
img[100, 100] = [255, 255, 255] # 直接赋值修改
高效访问方法:
val = img.item(10, 10, 2) # 访问 R 值
img.itemset((10, 10, 2), 100) # 修改 R 值
print(img.shape) # (行,列,通道数)
print(img.size) # 像素总数
print(img.dtype) # 数据类型
ball = img[280:340, 330:390] # 提取 ROI
img[273:333, 100:160] = ball # 复制 ROI
b, g, r = cv.split(img) # 分离
img = cv.merge((b, g, r)) # 合并
# 或者切片操作
img[:, :, 2] = 0 # 将红色通道置零
OpenCV 加法是饱和运算(超过 255 截断为 255),而 NumPy 是取模运算。
x = np.uint8([250])
y = np.uint8([10])
print(cv.add(x, y)) # 255
print(x + y) # 4
dst = cv.addWeighted(img1, 0.7, img2, 0.3, 0)
# 权重分别为 0.7 和 0.3,alpha 值为 0
常用于图像掩膜处理。
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo.png')
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
img1_bg = cv.bitwise_and(roi, roi, mask=mask_inv)
img2_fg = cv.bitwise_and(img2, img2, mask=mask)
dst = cv.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv.imshow('res', img1)
cv.waitKey(0)
cv.destroyAllWindows()
OpenCV 支持多种色彩空间转换,最常用的是 BGR 转灰度和 HSV。
grey = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
灰度图能显著提高处理速度,适用于大多数特征提取场景。
HSV 更适合颜色分割,因为它将亮度与色度分离。
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])
mask = cv.inRange(hsv, lower_blue, upper_blue)
res = cv.bitwise_and(frame, frame, mask=mask)
res = cv.resize(img, None, fx=2, fy=2, interpolation=cv.INTER_CUBIC)
插值方法可选 INTER_LINEAR(默认)、INTER_CUBIC 等。
rows, cols = img.shape
M = cv.getRotationMatrix2D(((cols-1)/2.0, (rows-1)/2.0), 90, 1)
dst = cv.warpAffine(img, M, (cols, rows))
ret, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
类型包括 THRESH_BINARY, THRESH_BINARY_INV, THRESH_TRUNC 等。
适用于光照不均的图像。
th2 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C,
cv.THRESH_BINARY, 11, 2)
th3 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C,
cv.THRESH_BINARY, 11, 2)
在图像中搜索特定模板的位置。
res = cv.matchTemplate(source, template, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
多目标匹配需结合阈值过滤:
loc = np.where(res >= 0.8)
for pt in zip(*loc[::-1]):
cv.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
轮廓检测是形状分析和物体识别的基础。
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
contours, hierarchy = cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 绘制所有轮廓
cv.drawContours(img, contours, -1, (0, 255, 0), 2)
可计算轮廓面积、周长及近似多边形。
用于预处理和二值图像优化。
kernel = np.ones((5, 5), np.uint8)
dilated_img = cv.dilate(thresh, kernel, iterations=2)
eroded_img = cv.erode(thresh, kernel, iterations=1)
# 开运算:先腐蚀后膨胀,去除小噪点
closed_img = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel)
本文介绍了 OpenCV 在 Python 中的基础应用,涵盖图像读写、视频处理、绘图、像素操作、色彩空间转换、几何变换及模板匹配等核心功能。通过掌握这些基础操作,可以进一步探索更复杂的计算机视觉任务,如人脸识别、目标跟踪等。建议在实际项目中多练习代码示例,熟悉 API 用法,并结合 NumPy 进行高效的数据处理。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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