以下是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,实战代码参考官方示例库。