OpenCV API 手册#
cv2 模块提供了 OpenCV 计算机视觉库的 MicroPython 绑定,支持图像 I/O、滤波、形态学、阈值、颜色空间转换、几何变换、绘图、轮廓分析、模板匹配、霍夫变换、直方图、角点检测、图像分割等经典计算机视觉功能。
图像数据使用 ulab.numpy 的 ndarray 表示,与 image.Image 对象可通过 image.Image.to_numpy_ref() 方法互转。
import cv2
from ulab import numpy as np
函数列表#
imgcodecs — 图像读写(4 个)#
函数 |
说明 |
|---|---|
|
从文件读取图像 |
|
将图像保存到文件 |
|
从内存缓冲区解码图像 |
|
将图像编码到内存缓冲区 |
core — 核心运算(23 个)#
函数 |
说明 |
|---|---|
|
逐元素加法 |
|
逐元素减法 |
|
逐元素乘法 |
|
逐元素除法 |
|
两图像加权混合: |
|
两图像逐元素绝对差 |
|
逐位与运算 |
|
逐位或运算 |
|
逐位异或运算 |
|
逐位取反运算 |
|
拆分多通道图像为单通道列表 |
|
合并单通道列表为多通道图像 |
|
计算各通道均值 |
|
归一化图像数值范围 |
|
逐元素比较两图像,返回二值掩码 |
|
颜色范围过滤,返回二值掩码 |
|
缩放取绝对值后转为 8 位 |
|
查找最小/最大值及其位置 |
|
查找表映射变换 |
|
统计非零像素个数 |
|
图像翻转(垂直/水平/对角线) |
|
图像旋转(90°/180°/270°) |
|
矩阵转置 |
imgproc — 图像处理(65 个)#
图像滤波
函数 |
说明 |
|---|---|
|
Canny 边缘检测 |
|
高斯模糊 |
|
均值模糊(盒式滤波) |
|
中值模糊 |
|
双边滤波(保边去噪) |
|
方框滤波 |
|
自定义卷积核滤波 |
|
Sobel 边缘检测(一阶导数) |
|
Scharr 边缘检测(比 Sobel 精度更高) |
|
拉普拉斯边缘检测(二阶导数) |
形态学
函数 |
说明 |
|---|---|
|
腐蚀操作 |
|
膨胀操作 |
|
高级形态学(开/闭/梯度/顶帽/黑帽) |
|
获取结构元素(矩形/十字/椭圆) |
阈值
函数 |
说明 |
|---|---|
|
全局阈值分割(支持 OTSU / Triangle) |
|
自适应阈值分割(均值/高斯) |
颜色转换
函数 |
说明 |
|---|---|
|
颜色空间转换(BGR↔GRAY/HSV/LAB/YUV 等 23 种) |
几何变换
函数 |
说明 |
|---|---|
|
图像缩放 |
|
仿射变换 |
|
透视变换 |
|
获取 2D 旋转矩阵 |
|
从三对点计算仿射变换矩阵 |
|
从四对点计算透视变换矩阵 |
|
像素重映射 |
金字塔
函数 |
说明 |
|---|---|
|
高斯金字塔降采样(尺寸减半) |
|
高斯金字塔升采样(尺寸加倍) |
绘图
函数 |
说明 |
|---|---|
|
绘制直线 |
|
绘制矩形 |
|
绘制圆形 |
|
绘制椭圆/弧 |
|
绘制文字(支持 8 种 Hershey 字体) |
|
绘制带箭头的线段 |
|
绘制标记点(十字/星形/菱形等 7 种) |
|
填充多边形 |
|
绘制多边形边框 |
|
获取文字渲染尺寸及基线 |
轮廓
函数 |
说明 |
|---|---|
|
查找二值图像中的轮廓 |
|
绘制轮廓 |
|
计算轮廓面积 |
|
计算轮廓周长 |
|
计算外接正矩形 |
|
多边形逼近 |
|
计算凸包(支持返回点坐标或索引) |
|
最小外接旋转矩形 |
|
最小外接圆 |
|
拟合椭圆(需 ≥5 个点) |
|
拟合直线 |
|
点与轮廓位置关系测试 |
|
计算凸包缺陷 |
|
形状匹配(基于 Hu 矩) |
|
判断轮廓是否为凸 |
模板匹配 & 矩
函数 |
说明 |
|---|---|
|
模板匹配(6 种匹配方法) |
|
计算图像矩(空间矩/中心矩/归一化矩) |
霍夫变换
函数 |
说明 |
|---|---|
|
标准霍夫直线检测 |
|
概率霍夫直线检测(返回线段端点) |
|
霍夫圆检测(梯度法) |
直方图
函数 |
说明 |
|---|---|
|
计算图像直方图 |
|
直方图反向投影 |
|
直方图比较(6 种比较方法) |
|
直方图均衡化 |
角点检测
函数 |
说明 |
|---|---|
|
Harris 角点检测 |
|
Shi-Tomasi 角点检测 |
|
亚像素角点精确定位 |
分割
函数 |
说明 |
|---|---|
|
分水岭分割 |
|
距离变换 |
|
漫水填充 |
|
GrabCut 前景分割 |
|
连通组件标记 |
highgui — 交互(2 个)#
函数 |
说明 |
|---|---|
|
等待按键(支持超时) |
|
增强版 waitKey |
总计 94 个函数。⚠ 表示平台限制:
getAffineTransform/getPerspectiveTransform/grabCut默认 128KB 线程栈下可能溢出;cornerSubPix此移植版 OpenCV 的InputOutputArray包装路径不兼容。
imgcodecs — 图像读写#
imread#
从文件读取图像。
img = cv2.imread(filename, flags=cv2.IMREAD_COLOR)
参数 |
类型 |
说明 |
|---|---|---|
|
|
图像文件路径,支持 BMP、PNG、JPEG 等格式 |
|
|
读取模式(见常量表),默认为 |
返回值: ndarray,读取失败返回 None。
示例:
img = cv2.imread("/sdcard/photo.jpg")
gray = cv2.imread("/sdcard/photo.jpg", cv2.IMREAD_GRAYSCALE)
imwrite#
将图像保存到文件。
success = cv2.imwrite(filename, img)
参数 |
类型 |
说明 |
|---|---|---|
|
|
保存路径,扩展名决定格式(如 |
|
|
图像数组 |
返回值: bool,成功返回 True。
示例:
img = np.zeros((240, 320, 3), dtype=np.uint8)
cv2.imwrite("/sdcard/output.png", img)
imdecode#
从内存缓冲区解码图像。
img = cv2.imdecode(buf, flags=cv2.IMREAD_COLOR)
参数 |
类型 |
说明 |
|---|---|---|
|
|
图像数据的字节缓冲区 |
|
|
解码模式,同 |
返回值: ndarray,解码失败返回 None。
imencode#
将图像编码到内存缓冲区。
success, buf = cv2.imencode(ext, img, params=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
图像格式扩展名,如 |
|
|
待编码的图像 |
|
|
可选,编码参数列表 |
返回值: (bool, bytes) 元组。success 表示是否编码成功,buf 为编码后的字节数据。
示例:
success, buf = cv2.imencode(".jpg", img, [1, 50]) # JPEG quality=50
decoded = cv2.imdecode(buf, cv2.IMREAD_COLOR)
图像读写常量#
常量 |
值 |
说明 |
|---|---|---|
|
-1 |
保持原始格式 |
|
0 |
转为灰度图 |
|
1 |
转为 BGR 彩色图 |
|
2 |
保留原始位深 |
|
4 |
保留原始通道数 |
|
128 |
忽略 EXIF 方向标记 |
core — 核心运算#
算术运算#
add#
两图像或图像与标量的逐元素加法。
dst = cv2.add(src1, src2, dst=None, mask=None, dtype=-1)
参数 |
类型 |
说明 |
|---|---|---|
|
|
第一个输入图像 |
|
|
第二个输入图像(或标量 ndarray) |
|
|
可选,输出图像 |
|
|
可选,8 位单通道掩码 |
|
|
可选,输出深度(-1 表示与 src1 相同) |
返回值: ndarray。
subtract#
逐元素减法。
dst = cv2.subtract(src1, src2, dst=None, mask=None, dtype=-1)
参数同 add。
multiply#
逐元素乘法。
dst = cv2.multiply(src1, src2, dst=None, scale=None, dtype=-1)
参数 |
类型 |
说明 |
|---|---|---|
|
|
可选,缩放因子,默认为 1.0 |
divide#
逐元素除法。
dst = cv2.divide(src1, src2, dst=None, scale=None, dtype=-1)
addWeighted#
两图像加权混合。
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=-1)
计算公式:dst = alpha * src1 + beta * src2 + gamma
参数 |
类型 |
说明 |
|---|---|---|
|
|
第一个输入 |
|
|
第一个输入的权重 |
|
|
第二个输入 |
|
|
第二个输入的权重 |
|
|
加到每个和上的标量 |
result = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
absdiff#
计算两图像逐元素绝对差。
dst = cv2.absdiff(src1, src2, dst=None)
位运算#
bitwise_and#
dst = cv2.bitwise_and(src1, src2, dst=None, mask=None)
bitwise_or#
dst = cv2.bitwise_or(src1, src2, dst=None, mask=None)
bitwise_xor#
dst = cv2.bitwise_xor(src1, src2, dst=None, mask=None)
bitwise_not#
dst = cv2.bitwise_not(src, dst=None, mask=None)
通道操作#
split#
将多通道图像拆分为单通道列表。
channels = cv2.split(m)
参数 |
类型 |
说明 |
|---|---|---|
|
|
多通道输入图像 |
返回值: list[ndarray],每个元素为一个通道。
b, g, r = cv2.split(img) # 拆分为 B、G、R 三个通道
merge#
将单通道列表合并为多通道图像。
merged = cv2.merge(mv)
参数 |
类型 |
说明 |
|---|---|---|
|
|
单通道 ndarray 列表 |
返回值: ndarray,合并后的多通道图像。
merged = cv2.merge([b_channel, g_channel, r_channel])
统计与归一化#
mean#
计算图像均值。
mean_vals = cv2.mean(src, mask=None)
返回值: list[float],各通道均值。
normalize#
归一化图像数值范围。
dst = cv2.normalize(src, dst=None, alpha=None, beta=None, norm_type=cv2.NORM_L2, dtype=-1, mask=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
范围归一化时的最小值,或范数归一化时的目标值 |
|
|
范围归一化时的最大值( |
|
|
归一化类型(见常量表) |
normed = cv2.normalize(src, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX)
compare#
逐元素比较两图像。
dst = cv2.compare(src1, src2, cmpop)
参数 |
类型 |
说明 |
|---|---|---|
|
|
比较操作类型(见常量表) |
返回值: ndarray (dtype=uint8),匹配位置为 255,不匹配为 0。
mask = cv2.compare(img, threshold_val, cv2.CMP_GT)
其他 core 函数#
inRange#
颜色范围过滤。
dst = cv2.inRange(src, lowerb, upperb, dst=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
下界值(与 src 通道数一致) |
|
|
上界值 |
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lo = np.array([0, 50, 50], dtype=np.uint8)
hi = np.array([10, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, lo, hi)
convertScaleAbs#
缩放并取绝对值转换为 8 位。
dst = cv2.convertScaleAbs(src, dst=None, alpha=None, beta=None)
dst = saturate_cast<uchar>(|alpha * src + beta|)
minMaxLoc#
查找最小值、最大值及其位置。
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(src, mask=None)
返回值: (float, float, (int,int), (int,int))
LUT#
查找表映射变换。
dst = cv2.LUT(src, lut, dst=None)
countNonZero#
统计非零像素个数。
count = cv2.countNonZero(src)
flip#
图像翻转。
dst = cv2.flip(src, flipCode, dst=None)
|
效果 |
|---|---|
0 |
垂直翻转 |
1 |
水平翻转 |
-1 |
对角线翻转 |
rotate#
图像旋转。
dst = cv2.rotate(src, rotateCode, dst=None)
rotateCode 取值见旋转常量表。
transpose#
矩阵转置。
dst = cv2.transpose(src, dst=None)
core 常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
顺时针旋转 90° |
|
1 |
旋转 180° |
|
2 |
逆时针旋转 90° |
|
0 |
等于 |
|
1 |
大于 |
|
2 |
大于等于 |
|
3 |
小于 |
|
4 |
小于等于 |
|
5 |
不等于 |
|
1 |
无穷范数 |
|
2 |
L1 范数 |
|
4 |
L2 范数 |
|
32 |
范围归一化 |
imgproc — 图像处理#
图像滤波#
Canny#
Canny 边缘检测。
edges = cv2.Canny(image, threshold1, threshold2, edges=None, apertureSize=3, L2gradient=False)
参数 |
类型 |
说明 |
|---|---|---|
|
|
输入(单通道灰度图) |
|
|
低阈值 |
|
|
高阈值 |
|
|
Sobel 核大小,默认 3 |
|
|
是否使用 L2 范数 |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 80, 200)
GaussianBlur#
高斯模糊。
dst = cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=cv2.BORDER_DEFAULT)
参数 |
类型 |
说明 |
|---|---|---|
|
|
核大小,如 |
|
|
X 方向标准差 |
blur#
均值模糊(盒式滤波)。
dst = cv2.blur(src, ksize, dst=None, anchor=None, borderType=cv2.BORDER_DEFAULT)
medianBlur#
中值模糊。
dst = cv2.medianBlur(src, ksize, dst=None)
ksize 为奇数,如 5。
bilateralFilter#
双边滤波(保边去噪)。
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=cv2.BORDER_DEFAULT)
参数 |
类型 |
说明 |
|---|---|---|
|
|
像素邻域直径 |
|
|
颜色空间标准差 |
|
|
坐标空间标准差 |
boxFilter#
方框滤波。
dst = cv2.boxFilter(src, ddepth, ksize, dst=None, anchor=None, normalize=True, borderType=cv2.BORDER_DEFAULT)
filter2D#
自定义卷积核滤波。
dst = cv2.filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=cv2.BORDER_DEFAULT)
参数 |
类型 |
说明 |
|---|---|---|
|
|
输出深度(-1 表示与输入相同) |
|
|
卷积核 |
|
|
加到每个像素的可选偏移 |
kernel = np.ones((3, 3), dtype=np.float) / 9.0
result = cv2.filter2D(img, -1, kernel)
Sobel#
Sobel 边缘检测。
dst = cv2.Sobel(src, ddepth, dx, dy, dst=None, ksize=3, scale=None, delta=None, borderType=cv2.BORDER_DEFAULT)
参数 |
类型 |
说明 |
|---|---|---|
|
|
X 方向导数阶数 |
|
|
Y 方向导数阶数 |
|
|
核大小(1/3/5/7) |
grad_x = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
grad_y = cv2.Sobel(gray, cv2.CV_8U, 0, 1, ksize=3)
Scharr#
Scharr 边缘检测(比 Sobel 精度更高)。
dst = cv2.Scharr(src, ddepth, dx, dy, dst=None, scale=None, delta=None, borderType=cv2.BORDER_DEFAULT)
Laplacian#
拉普拉斯边缘检测。
dst = cv2.Laplacian(src, ddepth, dst=None, ksize=1, scale=None, delta=None, borderType=cv2.BORDER_DEFAULT)
形态学操作#
erode#
腐蚀操作。
dst = cv2.erode(src, kernel, dst=None, anchor=None, iterations=1, borderType=cv2.BORDER_CONSTANT)
dilate#
膨胀操作。
dst = cv2.dilate(src, kernel, dst=None, anchor=None, iterations=1, borderType=cv2.BORDER_CONSTANT)
morphologyEx#
高级形态学操作。
dst = cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=1, borderType=cv2.BORDER_CONSTANT)
op 取值见形态学常量表。
kernel = np.ones((3, 3), dtype=np.uint8)
opened = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
getStructuringElement#
获取结构元素。
kernel = cv2.getStructuringElement(shape, ksize, anchor=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
形状( |
|
|
大小,如 |
阈值处理#
threshold#
全局阈值分割。
retval, dst = cv2.threshold(src, thresh, maxval, type, dst=None)
返回值: (float, ndarray) — 使用的实际阈值和输出图像。
ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
ret, otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
adaptiveThreshold#
自适应阈值分割。
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
|
|
|
邻域大小(奇数) |
|
|
从均值/加权均值中减去的常数 |
result = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
颜色空间转换#
cvtColor#
颜色空间转换。
dst = cv2.cvtColor(src, code, dst=None, dstCn=0)
参数 |
类型 |
说明 |
|---|---|---|
|
|
转换码(见颜色转换常量表) |
|
|
目标通道数(0 表示自动) |
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
几何变换#
resize#
图像缩放。
dst = cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=cv2.INTER_LINEAR)
参数 |
类型 |
说明 |
|---|---|---|
|
|
目标大小 |
|
|
可选,X 方向缩放因子 |
|
|
可选,Y 方向缩放因子 |
small = cv2.resize(img, (160, 120))
warpAffine#
仿射变换。
dst = cv2.warpAffine(src, M, dsize, dst=None, flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_CONSTANT, borderValue=None)
M 为 2x3 变换矩阵。
warpPerspective#
透视变换。
dst = cv2.warpPerspective(src, M, dsize, dst=None, flags=cv2.INTER_LINEAR,
borderMode=cv2.BORDER_CONSTANT, borderValue=None)
M 为 3x3 变换矩阵。
注意:
getPerspectiveTransform/getAffineTransform内部矩阵求解栈消耗较大,在默认 128KB 线程栈上可能触发栈溢出,建议从主 REPL 线程调用或增大线程栈。
getRotationMatrix2D#
获取 2D 旋转矩阵。
M = cv2.getRotationMatrix2D(center, angle, scale)
参数 |
类型 |
说明 |
|---|---|---|
|
|
旋转中心 |
|
|
旋转角度(度,逆时针为正) |
|
|
缩放因子 |
M = cv2.getRotationMatrix2D((160, 120), 45, 1.0)
rotated = cv2.warpAffine(img, M, (320, 240))
getAffineTransform ⚠#
从三对点计算 2x3 仿射变换矩阵。
M = cv2.getAffineTransform(src, dst)
src 和 dst 为 3x2 点集矩阵。
getPerspectiveTransform ⚠#
从四对点计算 3x3 透视变换矩阵。
M = cv2.getPerspectiveTransform(src, dst, solveMethod=cv2.DECOMP_LU)
src 和 dst 为 4x2 点集矩阵。
remap#
像素重映射。
dst = cv2.remap(src, map1, map2, interpolation, dst=None,
borderMode=cv2.BORDER_CONSTANT, borderValue=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
X 坐标映射表 |
|
|
Y 坐标映射表 |
|
|
插值方式(见插值常量表) |
图像金字塔#
pyrDown#
高斯金字塔降采样。
dst = cv2.pyrDown(src, dst=None, dstsize=None, borderType=cv2.BORDER_DEFAULT)
图像尺寸减半。
pyrUp#
高斯金字塔升采样。
dst = cv2.pyrUp(src, dst=None, dstsize=None, borderType=cv2.BORDER_DEFAULT)
图像尺寸加倍。
绘图函数#
所有绘图函数直接修改输入图像并返回,支持链式调用。
line#
绘制直线。
img = cv2.line(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)
参数 |
类型 |
说明 |
|---|---|---|
|
|
起点 |
|
|
终点 |
|
|
颜色,BGR 元组如 |
rectangle#
绘制矩形。
img = cv2.rectangle(img, pt1, pt2, color, thickness=1, lineType=cv2.LINE_8, shift=0)
thickness=-1 时填充矩形。
cv2.rectangle(img, (10, 10), (80, 60), (0, 0, 255), -1) # 填充红色矩形
circle#
绘制圆形。
img = cv2.circle(img, center, radius, color, thickness=1, lineType=cv2.LINE_8, shift=0)
ellipse#
绘制椭圆/弧。
img = cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color,
thickness=1, lineType=cv2.LINE_8, shift=0)
参数 |
类型 |
说明 |
|---|---|---|
|
|
椭圆中心 |
|
|
半轴长度 |
|
|
旋转角度 |
|
|
起始角度 |
|
|
终止角度 |
putText#
绘制文字。
img = cv2.putText(img, text, org, fontFace, fontScale, color,
thickness=1, lineType=cv2.LINE_8, bottomLeftOrigin=False)
参数 |
类型 |
说明 |
|---|---|---|
|
|
文字内容 |
|
|
文字左下角位置 |
|
|
字体(见字体常量表) |
|
|
字体缩放因子 |
arrowedLine#
绘制带箭头的线段。
img = cv2.arrowedLine(img, pt1, pt2, color, thickness=1, line_type=cv2.LINE_8, shift=0, tipLength=None)
drawMarker#
绘制标记点。
img = cv2.drawMarker(img, position, color, markerType=cv2.MARKER_CROSS,
markerSize=20, thickness=1, line_type=cv2.LINE_8)
markerType 见标记常量表。
fillPoly#
填充多边形。
img = cv2.fillPoly(img, pts, color, lineType=cv2.LINE_8, shift=0, offset=None)
pts 为轮廓点列表,每个轮廓是 Nx2 ndarray。
tri = np.array([[20, 20], [80, 20], [50, 80]], dtype=np.float)
cv2.fillPoly(img, [tri], (0, 255, 0))
polylines#
绘制多边形边框。
img = cv2.polylines(img, pts, isClosed, color, thickness=1, lineType=cv2.LINE_8, shift=0)
getTextSize#
获取文字渲染尺寸。
size, baseline = cv2.getTextSize(text, fontFace, fontScale, thickness)
返回值: ((width, height), baseline)
轮廓分析#
findContours#
查找二值图像中的轮廓。
contours, hierarchy = cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
轮廓检索模式( |
|
|
轮廓近似方法( |
返回值: (list[ndarray], ndarray) — 轮廓列表和层次结构。
drawContours#
绘制轮廓。
img = cv2.drawContours(image, contours, contourIdx, color, thickness=1,
lineType=cv2.LINE_8, hierarchy=None, maxLevel=INT_MAX, offset=None)
contourIdx=-1 时绘制所有轮廓。
contourArea#
计算轮廓面积。
area = cv2.contourArea(contour, oriented=False)
arcLength#
计算轮廓周长。
perimeter = cv2.arcLength(curve, closed)
boundingRect#
计算外接正矩形。
x, y, w, h = cv2.boundingRect(array)
approxPolyDP#
多边形逼近。
approx = cv2.approxPolyDP(curve, epsilon, closed)
epsilon 通常设为 0.02 * cv2.arcLength(curve, True)。
convexHull#
计算凸包。
hull = cv2.convexHull(points, hull=None, clockwise=False, returnPoints=True)
参数 |
类型 |
说明 |
|---|---|---|
|
|
|
minAreaRect#
最小外接旋转矩形。
center, size, angle = cv2.minAreaRect(points)
返回值: ((cx, cy), (w, h), angle) — 中心、尺寸、旋转角。
minEnclosingCircle#
最小外接圆。
center, radius = cv2.minEnclosingCircle(points)
fitEllipse#
拟合椭圆。
center, size, angle = cv2.fitEllipse(points)
输入至少需要 5 个点。
fitLine#
拟合直线。
line = cv2.fitLine(points, distType, param, reps, aeps)
返回值: (vx, vy, x0, y0) — 单位方向向量 + 直线上一点。
pointPolygonTest#
点与轮廓位置关系测试。
dist = cv2.pointPolygonTest(contour, pt, measureDist)
|
行为 |
|---|---|
|
返回带符号最短距离 |
|
返回 +1(内部)、0(在边上)、-1(外部) |
convexityDefects#
计算凸包缺陷。
defects = cv2.convexityDefects(contour, convexhull)
convexhull 必须为 1D 索引数组(即 convexHull(..., returnPoints=False) 的输出)。
matchShapes#
形状匹配(基于 Hu 矩)。
score = cv2.matchShapes(contour1, contour2, method, parameter)
isContourConvex#
判断轮廓是否为凸。
result = cv2.isContourConvex(contour)
返回 bool。
模板匹配#
matchTemplate#
模板匹配。
result = cv2.matchTemplate(image, templ, method, result=None, mask=None)
method 可选值见 TM_* 常量表。
result = cv2.matchTemplate(img, templ, cv2.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv2.minMaxLoc(result)
图像矩#
moments#
计算图像矩。
m = cv2.moments(array, binaryImage=False)
返回 dict,包含空间矩 (m00, m10, …)、中心矩 (mu20, …) 和归一化中心矩 (nu20, …)。
m = cv2.moments(binary)
cx = m['m10'] / m['m00'] # 质心 X
cy = m['m01'] / m['m00'] # 质心 Y
霍夫变换#
HoughLines#
标准霍夫直线检测。
lines = cv2.HoughLines(image, rho, theta, threshold, lines=None,
srn=None, stn=None, min_theta=None, max_theta=None)
返回值: Nx2 ndarray,每行为 (rho, theta)。
HoughLinesP#
概率霍夫直线检测(线段)。
lines = cv2.HoughLinesP(image, rho, theta, threshold, lines=None,
minLineLength=None, maxLineGap=None)
返回值: Nx4 ndarray,每行为 (x1, y1, x2, y2)。
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50, minLineLength=30)
for i in range(lines.shape[0]):
x1, y1, x2, y2 = lines[i, 0], lines[i, 1], lines[i, 2], lines[i, 3]
HoughCircles#
霍夫圆检测。
circles = cv2.HoughCircles(image, method, dp, minDist, circles=None,
param1=None, param2=None, minRadius=0, maxRadius=0)
参数 |
类型 |
说明 |
|---|---|---|
|
|
检测方法(3 = |
|
|
累加器分辨率与图像分辨率的反比 |
|
|
圆心间最小距离 |
|
|
Canny 高阈值,默认 100 |
|
|
圆心累加器阈值,默认 100 |
|
|
最小半径 |
|
|
最大半径 |
返回值: Nx3 ndarray,每行为 (cx, cy, r)。
直方图#
calcHist#
计算图像直方图。
hist = cv2.calcHist(images, channels, mask, histSize, ranges)
参数 |
类型 |
说明 |
|---|---|---|
|
|
输入图像列表 |
|
|
要计算的通道索引列表 |
|
|
可选 8 位单通道掩码 |
|
|
每个维度的 bin 数 |
|
|
每个维度的取值范围(平铺列表) |
hist = cv2.calcHist([img], [0], None, [32], [0, 256])
calcBackProject#
直方图反向投影。
dst = cv2.calcBackProject(images, channels, hist, dst=None, ranges, scale=None)
用于在图像中寻找与直方图匹配的区域。
compareHist#
直方图比较。
score = cv2.compareHist(H1, H2, method)
method 取值见 HISTCMP_* 常量表。
equalizeHist#
直方图均衡化。
dst = cv2.equalizeHist(src, dst=None)
角点检测#
cornerHarris#
Harris 角点检测。
dst = cv2.cornerHarris(src, blockSize, ksize, k, dst=None, borderType=cv2.BORDER_DEFAULT)
参数 |
类型 |
说明 |
|---|---|---|
|
|
角点检测邻域大小 |
|
|
Sobel 孔径大小 |
|
|
Harris 检测器自由参数(通常 0.04-0.06) |
goodFeaturesToTrack#
Shi-Tomasi 角点检测。
corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance,
mask=None, blockSize=3, useHarrisDetector=False, k=None)
参数 |
类型 |
说明 |
|---|---|---|
|
|
最大角点数 |
|
|
质量阈值(0.01-0.1) |
|
|
角点间最小欧氏距离 |
|
|
梯度计算窗口大小 |
返回值: Nx2 ndarray,每行为 (x, y)(float 坐标)。
cornerSubPix ⚠#
亚像素角点精确定位。
refined = cv2.cornerSubPix(image, corners, winSize, zeroZone, criteria)
参数 |
类型 |
说明 |
|---|---|---|
|
|
初始角点坐标(如 |
|
|
搜索窗口半宽 |
|
|
死区半宽 |
|
|
终止条件 |
平台限制: 此移植版 OpenCV 的
InputOutputArray(std::vector<Point2f>&)包装路径与标准版不一致,调用会触发count >= 0断言失败。实时检测场景请使用goodFeaturesToTrack代替。
图像分割#
watershed#
分水岭分割。
markers = cv2.watershed(image, markers)
参数 |
类型 |
说明 |
|---|---|---|
|
|
3 通道 8 位输入图像 |
|
|
int32 标记图(输入输出参数) |
distanceTransform#
距离变换。
dst = cv2.distanceTransform(src, distanceType, maskSize, dst=None, dstType=cv2.CV_32F, labelType=cv2.DIST_LABEL_CCOMP)
参数 |
类型 |
说明 |
|---|---|---|
|
|
距离类型( |
|
|
距离变换掩码大小(3 或 5) |
floodFill#
漫水填充。
filled, rect = cv2.floodFill(image, mask, seedPoint, newVal, loDiff=None, upDiff=None, flags=4)
返回值: (ndarray, (x, y, w, h)) — 填充后图像和填充区域边界框。
filled, rect = cv2.floodFill(img, None, (50, 50), (0, 255, 0))
grabCut ⚠#
GrabCut 前景分割。
mask, bgd, fgd = cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode=cv2.GC_INIT_WITH_RECT)
注意: 内部 GMM 迭代栈消耗较大,默认 128KB 线程栈下可能溢出。建议加大栈或从主 REPL 线程调用。
connectedComponents#
连通组件标记。
nlabels, labels = cv2.connectedComponents(image, labels=None, connectivity=8, ltype=cv2.CV_32S)
返回值: (int, ndarray) — 标签数和标记图。
highgui — 交互#
waitKey#
等待按键。
key = cv2.waitKey(delay=0)
|
行为 |
|---|---|
0 |
一直等待 |
>0 |
等待 |
在 K230 MicroPython 上,从串口 REPL 读取输入。
waitKeyEx#
增强版 waitKey,行为与 waitKey 相同。
key = cv2.waitKeyEx(delay=0)
常量参考#
形态学常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
腐蚀 |
|
1 |
膨胀 |
|
2 |
开运算 |
|
3 |
闭运算 |
|
4 |
形态学梯度 |
|
5 |
顶帽 |
|
6 |
黑帽 |
|
7 |
击中击不中 |
|
0 |
矩形结构元素 |
|
1 |
十字形结构元素 |
|
2 |
椭圆形结构元素 |
阈值常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
二值化 |
|
1 |
反二值化 |
|
2 |
截断 |
|
3 |
置零 |
|
4 |
反置零 |
|
8 |
OTSU(可与上述组合) |
|
16 |
Triangle 法 |
自适应阈值常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
均值法 |
|
1 |
高斯法 |
边界常量#
常量 |
值 |
|---|---|
|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
4 |
|
5 |
|
16 |
插值常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
最近邻 |
|
1 |
双线性(默认) |
|
2 |
双三次 |
|
3 |
区域插值 |
|
4 |
Lanczos |
|
5 |
精确双线性 |
|
7 |
插值掩码 |
|
8 |
填充异常值 |
|
16 |
逆向映射 |
颜色转换常量#
常量 |
值 |
说明 |
|---|---|---|
|
6 |
BGR → 灰度 |
|
7 |
RGB → 灰度 |
|
8 |
灰度 → BGR |
|
8 |
灰度 → RGB |
|
4 |
BGR ↔ RGB |
|
40 |
BGR → HSV |
|
54 |
HSV → BGR |
|
41 |
RGB → HSV |
|
55 |
HSV → RGB |
|
82 |
BGR → YUV |
|
84 |
YUV → BGR |
|
36 |
BGR → YCrCb |
|
38 |
YCrCb → BGR |
|
44 |
BGR → LAB |
|
56 |
LAB → BGR |
|
50 |
BGR → LUV |
|
58 |
LUV → BGR |
|
32 |
BGR → XYZ |
|
34 |
XYZ → BGR |
|
52 |
BGR → HLS |
|
60 |
HLS → BGR |
|
45 |
BGRA → BGR |
|
43 |
BGR → BGRA |
字体常量#
常量 |
值 |
|---|---|
|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
16(可与上述叠加) |
线条常量#
常量 |
值 |
说明 |
|---|---|---|
|
4 |
4 连通线 |
|
8 |
8 连通线 |
|
16 |
抗锯齿线 |
|
-1 |
填充(用于 thickness 参数) |
轮廓常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
只检测最外层轮廓 |
|
1 |
检测所有轮廓 |
|
2 |
两级层次 |
|
3 |
完整层次树 |
|
4 |
漫水填充 |
|
1 |
保存所有轮廓点 |
|
2 |
压缩并保留端点 |
|
3 |
Teh-Chin 链 L1 |
|
4 |
Teh-Chin 链 kCos |
形状匹配常量#
常量 |
值 |
说明 |
|---|---|---|
|
1 |
方法 1 |
|
2 |
方法 2 |
|
3 |
方法 3 |
连通组件常量#
常量 |
值 |
说明 |
|---|---|---|
|
4 |
4 连通 |
|
8 |
8 连通 |
|
-1 |
默认算法 |
|
0 |
Wu |
|
1 |
Grana |
|
2 |
Bolelli |
|
3 |
SAUF |
|
4 |
BBDT |
|
5 |
Spaghetti |
距离变换常量#
常量 |
值 |
说明 |
|---|---|---|
|
1 |
曼哈顿距离 |
|
2 |
欧氏距离 |
|
3 |
棋盘距离 |
|
4 |
L1-L2 混合 |
|
5 |
Fair |
|
6 |
Welsch |
|
7 |
Huber |
|
0 |
CComp 标记 |
|
1 |
像素标记 |
模板匹配常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
平方差 |
|
1 |
归一化平方差 |
|
2 |
相关性 |
|
3 |
归一化相关性 |
|
4 |
相关系数 |
|
5 |
归一化相关系数 |
标记类型常量#
常量 |
值 |
|---|---|
|
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
直方图比较常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
相关性 |
|
1 |
卡方 |
|
2 |
相交 |
|
3 |
Bhattacharyya |
|
3 |
Hellinger(同 Bhattacharyya) |
|
4 |
替代卡方 |
|
5 |
KL 散度 |
GrabCut 常量#
常量 |
值 |
说明 |
|---|---|---|
|
0 |
确定背景 |
|
1 |
确定前景 |
|
2 |
可能背景 |
|
3 |
可能前景 |
|
0 |
矩形初始化 |
|
1 |
掩码初始化 |
|
2 |
评估模式 |
|
3 |
冻结模型评估 |
终止条件常量#
常量 |
值 |
说明 |
|---|---|---|
|
1 |
迭代次数 |
|
2 |
精度 |
|
1 |
最大迭代(同 COUNT) |
使用示例#
完整流程:读取、处理、保存#
import cv2
from ulab import numpy as np
img = cv2.imread("/sdcard/input.jpg")
if img is None:
img = np.zeros((240, 320, 3), dtype=np.uint8)
cv2.circle(img, (160, 120), 80, (0, 255, 0), -1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
result = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
cv2.drawContours(result, contours, -1, (0, 255, 0), 2)
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(result, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imwrite("/sdcard/output.jpg", result)
图像算术混合#
img1 = cv2.imread("/sdcard/img1.jpg")
img2 = cv2.imread("/sdcard/img2.jpg")
blended = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)
cv2.imwrite("/sdcard/blended.jpg", blended)
颜色分割(inRange)#
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
green_lo = np.array([35, 50, 50], dtype=np.uint8)
green_hi = np.array([85, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, green_lo, green_hi)
result = cv2.bitwise_and(img, img, mask=mask)
直方图分析#
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
hist2 = cv2.calcHist([img2], [0], None, [256], [0, 256])
score = cv2.compareHist(hist, hist2, cv2.HISTCMP_CORREL)
摄像头实时检测#
从摄像头取帧,转为 numpy 后用 OpenCV 实时处理。图像分辨率建议 320x240 以获得较高帧率。
import time, gc
from media.sensor import *
from media.display import *
from media.media import *
import cv2
from ulab import numpy as np
sensor = Sensor(width=1280, height=960, fps=90)
sensor.reset()
sensor.set_framesize(width=320, height=240)
sensor.set_pixformat(Sensor.RGB888) # OpenCV 需 RGB888
sensor.run()
Display.init(Display.ST7701, width=800, height=480, to_ide=True)
try:
while True:
img = sensor.snapshot() # image.Image
img_np = img.to_numpy_ref() # 共享内存转 ndarray
gray = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 60, 150)
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 60,
minLineLength=40, maxLineGap=15)
if lines is not None:
for i in range(lines.shape[0]):
x1, y1, x2, y2 = lines[i, 0], lines[i, 1], lines[i, 2], lines[i, 3]
cv2.line(img_np, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
gc.collect()
Display.show_image(img) # 直接显示 (OpenCV 已修改共享内存)
finally:
sensor.stop()
Display.deinit()
更多实时检测示例见
resources/examples/24-OpenCV/下的demo_camera_*.py文件。
