以下是OpenCV中最常用的100个函数及其作用与注意事项的全面整理,按功能模块分类,结合官方文档与工业实践优化排序。各函数均标注Python(cv2
)和C++(cv::
)命名,重点参数以加粗突出:
📷 一、图像输入/输出(8个)
函数名 (Python/C++) | 作用 | 注意事项 |
---|---|---|
cv2.imread /cv::imread |
读取图像文件 | 参数flags :cv2.IMREAD_GRAYSCALE (灰度)、cv2.IMREAD_COLOR (彩色) |
cv2.imshow /cv::imshow |
显示图像窗口 | 需搭配cv2.waitKey() 使用,否则窗口瞬间关闭 |
cv2.imwrite /cv::imwrite |
保存图像到文件 | 参数params 控制格式:如cv2.IMWRITE_JPEG_QUALITY 设置JPEG质量(0-100) |
cv2.waitKey /cv::waitKey |
等待键盘输入 | 参数delay=0 表示无限等待,返回按键ASCII值 |
cv2.destroyAllWindows /cv::destroyAllWindows |
关闭所有窗口 | 需在程序结束前调用,避免内存泄漏 |
cv2.VideoCapture /cv::VideoCapture |
打开摄像头/视频文件 | 用.isOpened() 检查是否成功打开,.read() 逐帧读取 |
cv2.VideoWriter /cv::VideoWriter |
保存视频文件 | 需指定编码器(如cv2.VideoWriter_fourcc('M','J','P','G') )和帧率 |
cv2.namedWindow /cv::namedWindow |
创建可调整的窗口 | 支持cv2.WINDOW_NORMAL 实现窗口大小调整 |
🎨 二、图像处理与变换(25个)
函数名 (Python/C++) | 作用 | 注意事项 |
---|---|---|
cv2.cvtColor /cv::cvtColor |
颜色空间转换 | 常用:cv2.COLOR_BGR2GRAY (BGR→灰度)、cv2.COLOR_BGR2HSV |
cv2.resize /cv::resize |
调整图像尺寸 | 插值方法:cv2.INTER_LINEAR (平衡速度质量)、cv2.INTER_NEAREST (最快) |
cv2.flip /cv::flip |
图像翻转 | 参数flipCode=0 垂直翻转,=1 水平翻转 |
cv2.rotate /cv::rotate |
旋转图像(90°倍数) | 实际由cv2.getRotationMatrix2D +warpAffine 实现 |
cv2.warpAffine /cv::warpAffine |
仿射变换(平移/旋转/缩放) | 需先计算变换矩阵(cv2.getRotationMatrix2D ) |
cv2.warpPerspective /cv::warpPerspective |
透视变换(矫正倾斜) | 需用cv2.getPerspectiveTransform 计算变换矩阵 |
cv2.threshold /cv::threshold |
固定阈值二值化 | 参数thresh=127 (阈值)、maxval=255 (最大值) |
cv2.adaptiveThreshold /cv::adaptiveThreshold |
自适应阈值二值化 | 适合光照不均图像,常用cv2.ADAPTIVE_THRESH_GAUSSIAN_C |
cv2.GaussianBlur /cv::GaussianBlur |
高斯模糊降噪 | 核尺寸需为奇数(如(5,5) ),sigmaX 控制平滑强度 |
cv2.medianBlur /cv::medianBlur |
中值滤波(去除椒盐噪声) | 核尺寸为奇数(如5 ) |
cv2.bilateralFilter /cv::bilateralFilter |
双边滤波(保边降噪) | 参数d (邻域直径)、sigmaColor (颜色空间标准差) |
cv2.erode /cv::erode |
形态学腐蚀(消除小物体) | 需定义结构元素(如cv2.getStructuringElement ) |
cv2.dilate /cv::dilate |
形态学膨胀(填充空洞) | 同上,常与腐蚀组合使用 |
cv2.morphologyEx /cv::morphologyEx |
高级形态学操作 | 支持开运算(cv2.MORPH_OPEN )、闭运算(cv2.MORPH_CLOSE ) |
cv2.pyrUp /cv::pyrUp |
图像放大(高斯金字塔上采样) | 尺寸变为2倍,模糊度增加 |
cv2.pyrDown /cv::pyrDown |
图像缩小(高斯金字塔下采样) | 尺寸减半,抗混叠 |
cv2.filter2D /cv::filter2D |
自定义卷积核滤波 | 需预先定义核(如锐化核[[-1,-1,-1],[-1,9,-1],[-1,-1,-1]] ) |
cv2.sepFilter2D /cv::sepFilter2D |
可分离卷积(提升速度) | 将二维卷积拆分为两个一维卷积 |
cv2.inRange /cv::inRange |
按颜色范围提取区域 | 常用于HSV空间(如提取绿色:lower=[35,50,50] , upper=[85,255,255] ) |
cv2.split /cv::split |
分离多通道图像(如BGR→B,G,R) | 返回单通道列表,需用cv2.merge 合并 |
cv2.merge /cv::merge |
合并单通道为多通道图像 | 输入为列表(如[b,g,r] →BGR图像) |
cv2.addWeighted /cv::addWeighted |
图像加权融合(透明度混合) | 公式:dst = src1*alpha + src2*beta + gamma |
cv2.bitwise_and /cv::bitwise_and |
按位与(提取ROI) | 常与掩码结合(如cv2.bitwise_and(img, img, mask=mask) ) |
cv2.bitwise_or /cv::bitwise_or |
按位或(合并区域) | 用途较少,多用于二进制操作 |
cv2.bitwise_not /cv::bitwise_not |
按位取反(图像反色) | 反转所有像素值 |
🔍 三、特征检测与分析(22个)
函数名 (Python/C++) | 作用 | 注意事项 |
---|---|---|
cv2.Canny /cv::Canny |
Canny边缘检测 | 参数threshold1=100 , threshold2=200 (滞后阈值) |
cv2.Sobel /cv::Sobel |
Sobel算子边缘检测 | 可指定方向(dx=1,dy=0 检测垂直边缘) |
cv2.Laplacian /cv::Laplacian |
拉普拉斯边缘检测 | 对噪声敏感,需先模糊 |
cv2.findContours /cv::findContours |
查找图像轮廓 | 返回轮廓列表和层级关系,模式cv2.RETR_EXTERNAL (仅外轮廓) |
cv2.drawContours /cv::drawContours |
绘制轮廓 | 参数contourIdx=-1 绘制所有轮廓 |
cv2.contourArea /cv::contourArea |
计算轮廓面积 | 输入单个轮廓点集 |
cv2.arcLength /cv::arcLength |
计算轮廓周长 | 参数closed=True 表示闭合轮廓 |
cv2.boundingRect /cv::boundingRect |
计算轮廓外接矩形 | 返回(x,y,w,h) |
cv2.minAreaRect /cv::minAreaRect |
计算最小外接旋转矩形 | 返回中心点、尺寸、旋转角度 |
cv2.minEnclosingCircle /cv::minEnclosingCircle |
计算最小外接圆 | 返回圆心和半径 |
cv2.HoughLines /cv::HoughLines |
霍夫变换检测直线 | 返回极坐标参数(ρ,θ) |
cv2.HoughLinesP /cv::HoughLinesP |
概率霍夫变换检测线段 | 返回线段端点(x1,y1,x2,y2) |
cv2.HoughCircles /cv::HoughCircles |
霍夫变换检测圆 | 参数minDist (圆间最小距离)避免重复检测 |
cv2.matchTemplate /cv::matchTemplate |
模板匹配(目标搜索) | 方法cv2.TM_CCOEFF_NORMED (归一化互相关)效果最佳 |
cv2.calcHist /cv::calcHist |
计算图像直方图 | 用于分析亮度分布或颜色分布 |
cv2.equalizeHist /cv::equalizeHist |
直方图均衡化(增强对比度) | 仅支持单通道灰度图 |
cv2.goodFeaturesToTrack /cv::goodFeaturesToTrack |
Shi-Tomasi角点检测 | 替代Harris角点,参数maxCorners 控制角点数 |
cv2.cornerHarris /cv::cornerHarris |
Harris角点检测 | 需阈值处理输出响应矩阵 |
cv2.SIFT_create /cv::SIFT::create |
SIFT特征检测器(需额外安装) | OpenCV 4.6+需编译时启用OPENCV_ENABLE_NONFREE |
cv2.ORB_create /cv::ORB::create |
ORB特征检测器(免费替代) | 速度快,适合实时系统 |
cv2.BFMatcher /cv::BFMatcher |
暴力特征匹配器 | 参数normType=cv2.NORM_HAMMING (二进制描述符) |
cv2.FLANNBasedMatcher /cv::FlannBasedMatcher |
FLANN近似匹配器(大数据集更快) | 需描述符为浮点类型 |
✏️ 四、几何绘制与标注(15个)
函数名 (Python/C++) | 作用 | 注意事项 |
---|---|---|
cv2.line /cv::line |
绘制直线 | 参数thickness 控制线宽,-1 表示填充 |
cv2.rectangle /cv::rectangle |
绘制矩形框 | pt1 和pt2 为对角顶点 |
cv2.circle /cv::circle |
绘制圆形 | thickness=-1 绘制实心圆 |
cv2.ellipse /cv::ellipse |
绘制椭圆/圆弧 | 参数startAngle=0 , endAngle=360 绘制完整椭圆 |
cv2.putText /cv::putText |
添加文字标注 | 字体可选cv2.FONT_HERSHEY_SIMPLEX ,fontScale 控制大小 |
cv2.polylines /cv::polylines |
绘制多边形 | 参数isClosed=True 闭合多边形 |
cv2.fillPoly /cv::fillPoly |
填充多边形区域 | 输入点集列表 |
cv2.arrowedLine /cv::arrowedLine |
绘制带箭头线段 | 参数tipLength=0.1 (箭头长度比例) |
cv2.drawMarker /cv::drawMarker |
绘制标记点(十字/星形等) | 样式cv2.MARKER_CROSS (十字) |
cv2.getTextSize /cv::getTextSize |
获取文本尺寸 | 用于动态计算文本位置 |
cv2.clipLine /cv::clipLine |
裁剪线段至矩形区域内 | 返回布尔值表示是否相交 |
cv2.ellipse2Poly /cv::ellipse2Poly |
将椭圆离散化为点集 | 用于自定义绘制虚线椭圆 |
cv2.drawKeypoints /cv::drawKeypoints |
绘制特征点(如SIFT/ORB) | 参数flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS 绘制方向与尺度 |
cv2.drawMatches /cv::drawMatches |
绘制特征匹配结果 | 并排显示两图的匹配点对 |
cv2.add /cv::add |
图像像素加法(饱和运算) | 防止溢出:max(0, min(255, a+b)) |
⚙️ 五、高级工具与工具函数(30个)
函数名 (Python/C++) | 作用 | 注意事项 |
---|---|---|
cv2.calibrateCamera /cv::calibrateCamera |
相机标定(计算内参/畸变系数) | 需多张棋盘格图片 |
cv2.findChessboardCorners /cv::findChessboardCorners |
检测棋盘格角点 | 角点顺序需与patternSize 一致 |
cv2.solvePnP /cv::solvePnP |
求解物体3D位姿(PnP问题) | 需已知3D-2D点对应关系 |
cv2.undistort /cv::undistort |
图像畸变校正 | 依赖标定得到的相机矩阵和畸变系数 |
cv2.connectedComponents /cv::connectedComponents |
连通域分析 | 返回标签图,背景=0 |
cv2.connectedComponentsWithStats /cv::connectedComponentsWithStats |
带统计信息的连通域分析 | 返回各区域面积、质心等 |
cv2.integral /cv::integral |
计算积分图(快速区域求和) | 用于加速Haar特征计算 |
cv2.dct /cv::dct |
离散余弦变换(图像压缩) | 输入需为浮点型 |
cv2.idct /cv::idct |
离散余弦逆变换 | 与dct 配套使用 |
cv2.dft /cv::dft |
离散傅里叶变换(频域分析) | 需用cv2.magnitude 计算幅值谱 |
cv2.idft /cv::idft |
离散傅里叶逆变换 | 恢复空域图像 |
cv2.magnitude /cv::magnitude |
计算复数矩阵幅值 | 输入实部x 和虚部y :sqrt(x²+y²) |
cv2.phase /cv::phase |
计算复数矩阵相位 | 返回弧度制角度 |
cv2.normalize /cv::normalize |
矩阵归一化 | 模式cv2.NORM_MINMAX 缩放到[0,255] |
cv2.minMaxLoc /cv::minMaxLoc |
查找矩阵极值及位置 | 返回(min_val, max_val, min_loc, max_loc) |
cv2.mean /cv::mean |
计算均值 | 可搭配掩码使用 |
cv2.meanStdDev /cv::meanStdDev |
计算均值与标准差 | 分析图像统计特征 |
cv2.countNonZero /cv::countNonZero |
统计非零像素数 | 用于二值图前景计数 |
cv2.findHomography /cv::findHomography |
计算单应性矩阵(图像配准) | 需至少4组点对 |
cv2.warpPerspective /cv::warpPerspective |
应用单应性变换 | 与findHomography 配合 |
cv2.getAffineTransform /cv::getAffineTransform |
计算仿射变换矩阵 | 需3组点对 |
cv2.getPerspectiveTransform /cv::getPerspectiveTransform |
计算透视变换矩阵 | 需4组点对 |
cv2.convertScaleAbs /cv::convertScaleAbs |
缩放并取绝对值(增强对比度) | 常用于Sobel结果可视化 |
cv2.log /cv::log |
自然对数运算 | 用于频域滤波 |
cv2.exp /cv::exp |
自然指数运算 | 与log 配套使用 |
cv2.patchNaNs /cv::patchNaNs |
替换NaN值为指定数 | 处理无效浮点结果 |
cv2.copyMakeBorder /cv::copyMakeBorder |
图像边界填充 | 模式cv2.BORDER_REFLECT (镜像填充) |
cv2.vconcat /cv::vconcat |
垂直拼接图像 | 所有图像宽度必须相同 |
cv2.hconcat /cv::hconcat |
水平拼接图像 | 所有图像高度必须相同 |
cv2.merge /cv::merge |
合并通道(见图像处理模块) | 与split 互为逆操作 |
💎 使用建议
- 性能优化:视频处理中避免循环内重复创建
Mat
对象(C++)或numpy
数组(Python),预分配内存可提速30%以上。 - 参数调试:边缘检测(如Canny)的阈值比例推荐
low:high ≈ 1:2
或1:3
;形态学操作的结构元素尺寸通常取3×3
或5×5
。 - 兼容性注意:
cv2.findContours
返回参数在OpenCV 3.4+版本中为(contours, hierarchy)
,旧版可能多返回一个image
。 - 深度学习整合:OpenCV DNN模块支持加载ONNX/TensorFlow/PyTorch模型(
cv2.dnn.readNet
),但预处理需手动对齐(如缩放、归一化)。
完整函数文档见:OpenCV 4.7.0 Docs,实战代码参考官方示例库。