opencv知识点总结

目录

[1. OpenCV 是什么?它的主要功能有哪些?](#1. OpenCV 是什么?它的主要功能有哪些?)

[2. OpenCV 中图像的默认颜色通道是什么顺序?如何转换为 RGB?](#2. OpenCV 中图像的默认颜色通道是什么顺序?如何转换为 RGB?)

[3. 如何将彩色图像转换为灰度图像?原理是什么?](#3. 如何将彩色图像转换为灰度图像?原理是什么?)

[4. 什么是图像滤波?OpenCV 中有哪些滤波器?](#4. 什么是图像滤波?OpenCV 中有哪些滤波器?)

[5. 高斯滤波和均值滤波的区别?](#5. 高斯滤波和均值滤波的区别?)

[6. 什么是双边滤波?参数含义?](#6. 什么是双边滤波?参数含义?)

[7. 什么是边缘检测?OpenCV 中常见边缘检测方法?](#7. 什么是边缘检测?OpenCV 中常见边缘检测方法?)

[8. Sobel 与 Scharr 有什么区别?](#8. Sobel 与 Scharr 有什么区别?)

[9. 简述 Canny 边缘检测的步骤](#9. 简述 Canny 边缘检测的步骤)

[10. OpenCV 的 DNN 模块可以做什么?支持哪些模型格式?](#10. OpenCV 的 DNN 模块可以做什么?支持哪些模型格式?)

[11. 什么是图像金字塔?OpenCV 中如何构建?](#11. 什么是图像金字塔?OpenCV 中如何构建?)

[12. 什么是轮廓?OpenCV 中如何查找和绘制轮廓?](#12. 什么是轮廓?OpenCV 中如何查找和绘制轮廓?)

[13. 图像腐蚀和膨胀的原理?常见用途?](#13. 图像腐蚀和膨胀的原理?常见用途?)

[14. 什么是直方图均衡化?用途?](#14. 什么是直方图均衡化?用途?)

[15. OpenCV 中如何提取图像的 HOG 特征?](#15. OpenCV 中如何提取图像的 HOG 特征?)

[16. 什么是图像金字塔匹配?优点?](#16. 什么是图像金字塔匹配?优点?)

[17. 什么是模板匹配?常用的方法有哪些?](#17. 什么是模板匹配?常用的方法有哪些?)

[18. OpenCV 中如何进行图像拼接?需要哪些关键步骤?](#18. OpenCV 中如何进行图像拼接?需要哪些关键步骤?)

[19. 简述 OpenCV 中如何加载深度学习模型并推理?](#19. 简述 OpenCV 中如何加载深度学习模型并推理?)

[20. OpenCV 与深度学习框架(如 PyTorch、TensorFlow)的关系?](#20. OpenCV 与深度学习框架(如 PyTorch、TensorFlow)的关系?)

[21. OpenCV 中如何实现图像分割?常见方法有哪些?](#21. OpenCV 中如何实现图像分割?常见方法有哪些?)

[22. 什么是分水岭算法?原理是什么?](#22. 什么是分水岭算法?原理是什么?)

[23. 什么是 GrabCut?其原理和使用方法?](#23. 什么是 GrabCut?其原理和使用方法?)

[24. 如何使用 OpenCV 对图像进行颜色空间转换?常用的颜色空间有哪些?](#24. 如何使用 OpenCV 对图像进行颜色空间转换?常用的颜色空间有哪些?)

[25. 什么是单应矩阵?它在图像拼接中的作用?](#25. 什么是单应矩阵?它在图像拼接中的作用?)

[26. 什么是 ORB?它与 SIFT、SURF 的区别?](#26. 什么是 ORB?它与 SIFT、SURF 的区别?)

[27. OpenCV 中如何进行特征匹配?FLANN 和 BFMatcher 有什么区别?](#27. OpenCV 中如何进行特征匹配?FLANN 和 BFMatcher 有什么区别?)

[28. 如何进行 KNN 特征匹配?如何判断匹配质量?](#28. 如何进行 KNN 特征匹配?如何判断匹配质量?)

[29. OpenCV 中如何进行仿射变换和透视变换?](#29. OpenCV 中如何进行仿射变换和透视变换?)

[30. 什么是 OpenCV 的 blobFromImage?它在深度学习中有什么用?](#30. 什么是 OpenCV 的 blobFromImage?它在深度学习中有什么用?)

[31. 什么是图像直方图?在 OpenCV 中如何计算和显示?](#31. 什么是图像直方图?在 OpenCV 中如何计算和显示?)

[32. OpenCV 中如何进行图像阈值分割?常见方法有哪些?](#32. OpenCV 中如何进行图像阈值分割?常见方法有哪些?)

[33. OpenCV 中如何对图像进行旋转、缩放和翻转?](#33. OpenCV 中如何对图像进行旋转、缩放和翻转?)

[34. 什么是图像金字塔中的上采样和下采样?有何作用?](#34. 什么是图像金字塔中的上采样和下采样?有何作用?)

[35. 如何使用 OpenCV 实现图像模板匹配?结果如何解释?](#35. 如何使用 OpenCV 实现图像模板匹配?结果如何解释?)

[36. OpenCV 如何判断两个图像是否相似?](#36. OpenCV 如何判断两个图像是否相似?)

[37. OpenCV 中如何提取图像的轮廓面积、周长与形状特征?](#37. OpenCV 中如何提取图像的轮廓面积、周长与形状特征?)

[38. 如何使用 OpenCV 实现图像锐化?常用锐化核有哪些?](#38. 如何使用 OpenCV 实现图像锐化?常用锐化核有哪些?)

[39. OpenCV DNN 模块加载 ONNX 模型的完整流程?](#39. OpenCV DNN 模块加载 ONNX 模型的完整流程?)

[40. 如何将 PyTorch 模型部署到 OpenCV?](#40. 如何将 PyTorch 模型部署到 OpenCV?)

[41. OpenCV 中如何实现图像的亮度与对比度调整?](#41. OpenCV 中如何实现图像的亮度与对比度调整?)

[42. OpenCV 如何提取图像的边界框(bounding box)?](#42. OpenCV 如何提取图像的边界框(bounding box)?)

[43. OpenCV 中如何检测和消除噪声?](#43. OpenCV 中如何检测和消除噪声?)

[44. 什么是非极大值抑制(NMS)?在 Canny 和目标检测中的作用?](#44. 什么是非极大值抑制(NMS)?在 Canny 和目标检测中的作用?)

[45. OpenCV 如何进行图像通道分离与合并?](#45. OpenCV 如何进行图像通道分离与合并?)

[46. 如何用 OpenCV 实现图像叠加(融合)?](#46. 如何用 OpenCV 实现图像叠加(融合)?)

[47. 如何在 OpenCV 中进行图像归一化处理?](#47. 如何在 OpenCV 中进行图像归一化处理?)

[48. 什么是图像金字塔融合?OpenCV 如何实现?](#48. 什么是图像金字塔融合?OpenCV 如何实现?)

[49. OpenCV 如何对目标检测结果进行可视化?](#49. OpenCV 如何对目标检测结果进行可视化?)

[50. OpenCV 如何读取视频并逐帧处理?](#50. OpenCV 如何读取视频并逐帧处理?)

[51. OpenCV 中的几种插值方法分别适用于什么场景?](#51. OpenCV 中的几种插值方法分别适用于什么场景?)

[52. OpenCV 中如何对图像做颜色反转?常见用途是什么?](#52. OpenCV 中如何对图像做颜色反转?常见用途是什么?)

[53. 如何利用 OpenCV 对图像做"旋转 + 缩放 + 平移"的组合变换?](#53. 如何利用 OpenCV 对图像做“旋转 + 缩放 + 平移”的组合变换?)

[54. 如何用 OpenCV 实现图像通道置换(如 RGB→BGR)?](#54. 如何用 OpenCV 实现图像通道置换(如 RGB→BGR)?)

[55. 什么是图像边缘检测?OpenCV 中有哪些常见方法?](#55. 什么是图像边缘检测?OpenCV 中有哪些常见方法?)

[56. OpenCV 中如何计算两个图像的差异?](#56. OpenCV 中如何计算两个图像的差异?)

[57. 什么是图像腐蚀和膨胀操作?如何影响图像结构?](#57. 什么是图像腐蚀和膨胀操作?如何影响图像结构?)

[58. OpenCV 中如何提取图像中的轮廓层级结构?](#58. OpenCV 中如何提取图像中的轮廓层级结构?)

[59. OpenCV 中如何对图像应用透视变换?与仿射变换有何区别?](#59. OpenCV 中如何对图像应用透视变换?与仿射变换有何区别?)

[60. OpenCV DNN 模块与其他推理框架(如 TensorRT、ONNXRuntime)的优劣比较?](#60. OpenCV DNN 模块与其他推理框架(如 TensorRT、ONNXRuntime)的优劣比较?)

[61. 什么是非最大抑制(NMS)?YOLO 检测中如何使用?](#61. 什么是非最大抑制(NMS)?YOLO 检测中如何使用?)

[62. YOLO 模型的输出是什么格式?OpenCV 如何解析?](#62. YOLO 模型的输出是什么格式?OpenCV 如何解析?)

[63. UNet 是什么?它适用于哪类图像任务?](#63. UNet 是什么?它适用于哪类图像任务?)

[64. OpenCV 如何部署深度学习语义分割模型(如 UNet、SegNet)?](#64. OpenCV 如何部署深度学习语义分割模型(如 UNet、SegNet)?)

[65. 什么是图像语义分割与实例分割的区别?](#65. 什么是图像语义分割与实例分割的区别?)

[66. OpenCV 中如何可视化语义分割输出?](#66. OpenCV 中如何可视化语义分割输出?)

[67. 训练时图像增强的作用是什么?有哪些方法?](#67. 训练时图像增强的作用是什么?有哪些方法?)

[68. OpenCV 是否可以处理视频流目标检测?实现方式?](#68. OpenCV 是否可以处理视频流目标检测?实现方式?)

[69. OpenCV 与深度学习部署框架(如 ONNX、TensorRT、OpenVINO)如何结合?](#69. OpenCV 与深度学习部署框架(如 ONNX、TensorRT、OpenVINO)如何结合?)

[70. OpenCV 中如何进行摄像头标定?用途是什么?](#70. OpenCV 中如何进行摄像头标定?用途是什么?)

[71. 图像配准(Image Registration)是什么?有哪些方法?](#71. 图像配准(Image Registration)是什么?有哪些方法?)

[72. OpenCV 实现目标跟踪的方式有哪些?](#72. OpenCV 实现目标跟踪的方式有哪些?)

[73. 视频稳定(Video Stabilization)的一般原理?OpenCV 如何实现?](#73. 视频稳定(Video Stabilization)的一般原理?OpenCV 如何实现?)

[74. 什么是三维重建?OpenCV 支持哪些 3D 功能?](#74. 什么是三维重建?OpenCV 支持哪些 3D 功能?)

[75. 如何用 OpenCV 实现视频写入(保存)?](#75. 如何用 OpenCV 实现视频写入(保存)?)

[76. OpenCV 中如何计算两个图像之间的光流(Optical Flow)?](#76. OpenCV 中如何计算两个图像之间的光流(Optical Flow)?)

[77. 如何对 OpenCV DNN 模型做推理加速?](#77. 如何对 OpenCV DNN 模型做推理加速?)

[78. OpenCV 中如何进行特征点匹配过滤?为什么要过滤?](#78. OpenCV 中如何进行特征点匹配过滤?为什么要过滤?)

[79. OpenCV 与深度学习联合项目有哪些典型应用?](#79. OpenCV 与深度学习联合项目有哪些典型应用?)

[80. 如何使用 OpenCV 对图像进行 Gamma 校正?作用是什么?](#80. 如何使用 OpenCV 对图像进行 Gamma 校正?作用是什么?)


1. OpenCV 是什么?它的主要功能有哪些?

OpenCV(Open Source Computer Vision Library)是一个跨平台的开源计算机视觉和图像处理库,支持 C++、Python 等语言。主要功能包括图像处理、特征提取、物体识别、视频分析、机器学习、DNN 推理等。


2. OpenCV 中图像的默认颜色通道是什么顺序?如何转换为 RGB?

OpenCV 默认使用 BGR(蓝绿红)顺序。可使用以下代码转换为 RGB:

复制代码
rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

3. 如何将彩色图像转换为灰度图像?原理是什么?

使用加权平均法:

Gray=0.299R+0.587G+0.114B

OpenCV 实现:

复制代码
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

该公式更符合人眼对亮度的感知。


4. 什么是图像滤波?OpenCV 中有哪些滤波器?

图像滤波用于降噪、平滑、边缘增强等操作。

常见滤波器:

  • cv2.blur():均值滤波,简单平均

  • cv2.GaussianBlur():高斯加权平均,保留边缘

  • cv2.medianBlur():中值滤波,抗椒盐噪声

  • cv2.bilateralFilter():双边滤波,保边去噪


5. 高斯滤波和均值滤波的区别?

项目 高斯滤波 均值滤波
原理 加权平均,中心权重大 所有像素平均
保边性 强,边缘模糊较少 弱,边缘易模糊
抗噪能力 较强 较弱

6. 什么是双边滤波?参数含义?

双边滤波是一种保边去噪方法:

复制代码
cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)
  • d:邻域直径

  • sigmaColor:颜色差容忍度

  • sigmaSpace:空间距离影响因子

它综合考虑像素距离和颜色差异,适合保留边缘的图像平滑。


7. 什么是边缘检测?OpenCV 中常见边缘检测方法?

边缘检测是检测图像中灰度变化突变的区域。

常用方法:

  • Sobel:梯度法,检测水平/垂直边缘

  • Laplacian:二阶导数,对噪声敏感

  • Canny:推荐,完整边缘检测流程(降噪 + 梯度 + 非极大值抑制 + 双阈值)


8. Sobel 与 Scharr 有什么区别?

两者都是一阶微分算子:

  • Sobel:常规梯度检测,受采样限制

  • Scharr:优化后的 Sobel,能更准确计算梯度,适合边缘细节要求高的场景

OpenCV 使用:

复制代码
sobel = cv2.Sobel(img, cv2.CV_64F, 1, 0) scharr = cv2.Scharr(img, cv2.CV_64F, 1, 0)

9. 简述 Canny 边缘检测的步骤

Canny 是经典边缘检测算法,步骤如下:

  1. 高斯滤波降噪

  2. 计算梯度幅值和方向(Sobel)

  3. 非极大值抑制(NMS)

  4. 双阈值处理 + 边缘连接

OpenCV 调用:

复制代码
edges = cv2.Canny(img, 100, 200)

10. OpenCV 的 DNN 模块可以做什么?支持哪些模型格式?

OpenCV 的 cv2.dnn 模块用于加载和推理已有的深度学习模型(不支持训练)。

支持的模型格式:

  • .caffemodel(Caffe)

  • .pb(TensorFlow)

  • .onnx(通用)

  • .weights + .cfg(YOLO)

  • .t7(Torch)

支持图像分类、目标检测、人脸识别、图像分割等任务。

11. 什么是图像金字塔?OpenCV 中如何构建?

图像金字塔是一种将图像按比例逐层缩小或放大的结构,常用于图像配准、特征提取等任务。

  • 高斯金字塔(Gaussian Pyramid):连续模糊 + 下采样

  • 拉普拉斯金字塔(Laplacian Pyramid):图像差值金字塔

OpenCV 中:

复制代码
lower = cv2.pyrDown(img) # 下采样 upper = cv2.pyrUp(img) # 上采样

12. 什么是轮廓?OpenCV 中如何查找和绘制轮廓?

轮廓是连接所有连续边缘像素的闭合曲线。

查找轮廓:

复制代码
contours, _ = cv2.findContours(binary_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

绘制轮廓:

复制代码
cv2.drawContours(img, contours, -1, (0,255,0), 2)

13. 图像腐蚀和膨胀的原理?常见用途?

操作 原理 作用
腐蚀 最小值滤波 去小物体、缩小白区域
膨胀 最大值滤波 填补小孔、扩大白区域

用途:形态学处理、去噪、前景提取、形状分析等

复制代码
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
eroded = cv2.erode(img, kernel) dilated = cv2.dilate(img, kernel)

14. 什么是直方图均衡化?用途?

直方图均衡化是一种提升图像对比度的方法,通过拉伸灰度值分布使图像更清晰。

OpenCV 实现:

复制代码
equalized = cv2.equalizeHist(gray_img)

常用于低对比度图像增强,如夜间图像、人脸图像等。


15. OpenCV 中如何提取图像的 HOG 特征?

HOG(Histogram of Oriented Gradients)是常见的梯度方向直方图特征,常用于目标检测(如行人)。

OpenCV 使用:

复制代码
hog = cv2.HOGDescriptor() features = hog.compute(gray_img)

16. 什么是图像金字塔匹配?优点?

金字塔匹配在多个尺度上对图像进行配准或模板匹配。

优点是可以处理不同尺寸、缩放下的匹配,鲁棒性强。


17. 什么是模板匹配?常用的方法有哪些?

模板匹配用于在图像中查找与模板相似的区域。

OpenCV:

复制代码
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

常用方法:

  • cv2.TM_CCOEFF

  • cv2.TM_SQDIFF

  • cv2.TM_CCORR_NORMED


18. OpenCV 中如何进行图像拼接?需要哪些关键步骤?

图像拼接的一般步骤:

  1. 特征点提取(如 SIFT、ORB)

  2. 特征匹配(如 FLANN)

  3. 计算单应性矩阵(cv2.findHomography

  4. 图像透视变换(cv2.warpPerspective

  5. 图像叠加


19. 简述 OpenCV 中如何加载深度学习模型并推理?

以加载 ONNX 模型为例:

复制代码
net = cv2.dnn.readNetFromONNX('model.onnx')
blob = cv2.dnn.blobFromImage(img, scalefactor=1/255.0, size=(224, 224)) net.setInput(blob) output = net.forward()

DNN 模块支持推理但不支持训练。


20. OpenCV 与深度学习框架(如 PyTorch、TensorFlow)的关系?

  • OpenCV 主要用于图像处理、预处理、数据增强

  • OpenCV 的 dnn 模块支持模型加载与推理(效率高、轻量)

  • 在实际部署中常结合使用:PyTorch 训练,OpenCV 推理部署(如边缘设备)

21. OpenCV 中如何实现图像分割?常见方法有哪些?

图像分割是将图像划分为具有相似特征的区域。

常见方法:

  • 阈值法(cv2.threshold, cv2.adaptiveThreshold

  • 边缘检测 + 轮廓提取

  • 分水岭算法(Watershed)

  • GrabCut 图像分割

  • MeanShift 分割

  • 深度学习语义分割模型(如 UNet、DeepLab)


22. 什么是分水岭算法?原理是什么?

分水岭是一种基于拓扑形态的图像分割算法。

原理:将图像灰度看作地形图,从标记的"前景"和"背景"向外"蓄水"生长,最终"水池交汇处"作为边界。

OpenCV 使用:

复制代码
cv2.watershed(img, markers)

23. 什么是 GrabCut?其原理和使用方法?

GrabCut 是一种基于图割的图像分割算法,用于交互式前景提取。

原理:

  • 用户标注前景/背景区域

  • 建立 GMM 模型

  • 迭代优化并分割前景

OpenCV 使用:

复制代码
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, iterCount, mode)

24. 如何使用 OpenCV 对图像进行颜色空间转换?常用的颜色空间有哪些?

颜色空间转换:

复制代码
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

常见颜色空间:

  • BGR / RGB:默认/可视化

  • HSV:色调/饱和度/亮度(适合颜色分割)

  • LAB:更接近人眼感知

  • YCrCb:亮度与色彩分离


25. 什么是单应矩阵?它在图像拼接中的作用?

单应矩阵(Homography)表示两个平面间的透视变换关系,是一个 3×3 齐次矩阵。

作用:

  • 图像配准

  • 拼接

  • 透视校正

计算方式:

复制代码
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)

26. 什么是 ORB?它与 SIFT、SURF 的区别?

ORB(Oriented FAST and Rotated BRIEF)是 OpenCV 提供的快速、高效的特征点检测算法。

算法 是否免费 特点
SIFT/SURF 有专利(老版本) 准确率高,耗时长
ORB 免费开源 快速、适合移动设备,略逊于 SIFT

27. OpenCV 中如何进行特征匹配?FLANN 和 BFMatcher 有什么区别?

特征匹配流程:

  1. 提取特征(SIFT/ORB)

  2. 使用 BFMatcherFlannBasedMatcher 匹配特征

区别:

匹配器 特点
BFMatcher 暴力搜索,精度高,速度慢
FLANN 近似搜索,速度快,适合大规模数据

28. 如何进行 KNN 特征匹配?如何判断匹配质量?

使用 knnMatch()

复制代码
matches = flann.knnMatch(des1, des2, k=2)

常用判断方法:Lowe's Ratio Test

复制代码
good = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good.append(m)

29. OpenCV 中如何进行仿射变换和透视变换?

  • 仿射变换 :保持平行线、比例关系
    cv2.getAffineTransform() + cv2.warpAffine()

  • 透视变换 :可处理倾斜、透视投影
    cv2.getPerspectiveTransform() + cv2.warpPerspective()


30. 什么是 OpenCV 的 blobFromImage?它在深度学习中有什么用?

cv2.dnn.blobFromImage() 是用于将图像转换为深度学习模型可接受的 标准化张量格式

功能包括:

  • 图像缩放、均值减去

  • 通道顺序变换(BGR→RGB)

  • 尺寸归一化

示例:

复制代码
blob = cv2.dnn.blobFromImage(img, 1/255.0, (224, 224), swapRB=True)

31. 什么是图像直方图?在 OpenCV 中如何计算和显示?

图像直方图表示图像中每个灰度级像素的数量,是统计图像亮度分布的工具。

计算直方图:

复制代码
hist = cv2.calcHist([gray], [0], None, [256], [0, 256])

显示直方图需使用 matplotlib

复制代码
import matplotlib.pyplot as plt plt.plot(hist)

32. OpenCV 中如何进行图像阈值分割?常见方法有哪些?

用于将图像像素分成"前景"和"背景"。

方法:

  • 固定阈值:cv2.threshold()

  • 自适应阈值:cv2.adaptiveThreshold()

  • Otsu 自动阈值:cv2.threshold(..., cv2.THRESH_OTSU)

示例:

复制代码
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

33. OpenCV 中如何对图像进行旋转、缩放和翻转?

  • 旋转

    M = cv2.getRotationMatrix2D(center, angle, scale)
    rotated = cv2.warpAffine(img, M, (w, h))

  • 缩放

    resized = cv2.resize(img, (new_w, new_h))

  • 翻转

    flipped = cv2.flip(img, flipCode=0) # 0:上下, 1:左右, -1:同时


34. 什么是图像金字塔中的上采样和下采样?有何作用?

  • 下采样 (cv2.pyrDown):减小图像尺寸,提取全局特征,降噪

  • 上采样 (cv2.pyrUp):放大图像,用于图像恢复或金字塔融合

金字塔常用于:目标检测多尺度处理、图像融合、人脸特征金字塔提取。


35. 如何使用 OpenCV 实现图像模板匹配?结果如何解释?

使用 cv2.matchTemplate() 计算模板与原图的相似度。

复制代码
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

匹配结果是一个热图,值越高(或越低,取决于方法),表示越相似。


36. OpenCV 如何判断两个图像是否相似?

常用方法:

  • 结构相似度 SSIM(需使用 skimage

  • 均方误差(MSE)

  • 特征点匹配数量(如 SIFT + RANSAC)

  • 直方图对比:cv2.compareHist()


37. OpenCV 中如何提取图像的轮廓面积、周长与形状特征?

复制代码
cv2.contourArea(cnt) cv2.arcLength(cnt, True)

其他形状描述:

  • 矩形拟合:cv2.boundingRect()

  • 最小外接圆:cv2.minEnclosingCircle()

  • 质心坐标、偏心率等


38. 如何使用 OpenCV 实现图像锐化?常用锐化核有哪些?

图像锐化强调边缘,可使用卷积核进行处理:

复制代码
kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])
sharpened = cv2.filter2D(img, -1, kernel)

也可以用 Laplacian 算子或高通滤波器。


39. OpenCV DNN 模块加载 ONNX 模型的完整流程?

复制代码
net = cv2.dnn.readNetFromONNX("model.onnx")
blob = cv2.dnn.blobFromImage(img, 1/255.0, (224,224), mean=(0,0,0), swapRB=True) net.setInput(blob)
output = net.forward()

适合轻量部署模型,如分类、检测、分割等。


40. 如何将 PyTorch 模型部署到 OpenCV?

部署步骤:

  1. 使用 torch.onnx.export() 将模型导出为 .onnx

  2. 在 OpenCV 中使用 readNetFromONNX()

  3. 利用 blobFromImage() 准备输入

  4. forward() 推理

注意:

  • 模型需静态图

  • 预处理参数应一致(均值、标准化等)

41. OpenCV 中如何实现图像的亮度与对比度调整?

亮度和对比度通过线性变换实现:

复制代码
new_img = cv2.convertScaleAbs(img, alpha=1.2, beta=30)
  • alpha: 对比度(乘数)

  • beta: 亮度(加数)


42. OpenCV 如何提取图像的边界框(bounding box)?

常用方法:

复制代码
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness)

也可以使用:

  • cv2.minAreaRect() → 最小外接矩形

  • cv2.minEnclosingCircle() → 外接圆


43. OpenCV 中如何检测和消除噪声?

常见噪声类型与处理方法:

  • 高斯噪声 :使用 cv2.GaussianBlur()

  • 椒盐噪声 :使用 cv2.medianBlur()

  • 综合去噪 :使用 cv2.bilateralFilter() 或非局部均值(NLM)


44. 什么是非极大值抑制(NMS)?在 Canny 和目标检测中的作用?

NMS 是去除冗余响应的关键步骤:

  • Canny 中:保留局部最大梯度作为边缘

  • 目标检测中:去掉重叠 IOU 高的框,只保留得分最高的

NMS 通常不在 OpenCV 中显式调用,需自己实现或使用深度学习框架封装。


45. OpenCV 如何进行图像通道分离与合并?

复制代码
b, g, r = cv2.split(img) merged = cv2.merge([b, g, r])

可对每个通道进行独立处理,比如增强对比度或遮盖颜色。


46. 如何用 OpenCV 实现图像叠加(融合)?

复制代码
blended = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

其中:

  • 前两个参数是两张图像

  • 后两个参数是权重和偏移(gamma)


47. 如何在 OpenCV 中进行图像归一化处理?

用于将像素值压缩到固定区间,例如 [0, 1] 或 [0, 255]:

复制代码
normalized = cv2.normalize(img, None, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

深度学习输入通常需要归一化。


48. 什么是图像金字塔融合?OpenCV 如何实现?

图像金字塔融合用于将不同曝光、对焦图像融合成一张清晰图。

流程:

  1. 构建拉普拉斯金字塔(图像)

  2. 构建高斯金字塔(掩膜)

  3. 对各层图像加权融合

  4. 重构图像

OpenCV 本身不提供高级封装,但可通过 cv2.pyrUp, cv2.pyrDown 手动实现。


49. OpenCV 如何对目标检测结果进行可视化?

常见可视化方式:

复制代码
cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2)
cv2.putText(img, "class: 90%", (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)

常用于标注 YOLO/SSD/Faster R-CNN 的检测框与类别信息。


50. OpenCV 如何读取视频并逐帧处理?

复制代码
cap = cv2.VideoCapture("video.mp4")
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break # 图像处理逻辑
    cv2.imshow("frame", frame)
    if cv2.waitKey(1) == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

可用于视频分析、目标跟踪、行为识别等任务。

51. OpenCV 中的几种插值方法分别适用于什么场景?

插值方法 OpenCV 常量 适用场景说明
最近邻插值 cv2.INTER_NEAREST 速度最快,适合分类图(如 mask)
双线性插值(默认) cv2.INTER_LINEAR 常用于仿射变换、缩放
三次插值 cv2.INTER_CUBIC 图像放大时清晰度更好
区域插值 cv2.INTER_AREA 图像缩小时效果佳(抗锯齿)
Lanczos 插值 cv2.INTER_LANCZOS4 放大质量最高,计算开销大

52. OpenCV 中如何对图像做颜色反转?常见用途是什么?

复制代码
inverted = cv2.bitwise_not(img)

常用于:

  • 二值图像处理

  • 制作图像掩码

  • 医学图像负片处理等


53. 如何利用 OpenCV 对图像做"旋转 + 缩放 + 平移"的组合变换?

组合形式通常通过 cv2.getRotationMatrix2D() 生成 2×3 仿射矩阵:

复制代码
M = cv2.getRotationMatrix2D(center=(x,y), angle=45, scale=1.2)
rotated_scaled = cv2.warpAffine(img, M, (width, height))

如果需要组合多个变换,建议构造 3×3 齐次矩阵 形式并使用 warpPerspective


54. 如何用 OpenCV 实现图像通道置换(如 RGB→BGR)?

复制代码
bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)

也可手动交换:

复制代码
bgr = img[..., ::-1]

深度学习部署前常需调整通道顺序(如模型要求 RGB 输入)。


55. 什么是图像边缘检测?OpenCV 中有哪些常见方法?

图像边缘是像素值剧烈变化的区域。

常见方法:

  • Sobel 算子

  • Laplacian 算子

  • Canny 边缘检测(推荐)

    edges = cv2.Canny(gray, 100, 200)


56. OpenCV 中如何计算两个图像的差异?

常用方式:

复制代码
diff = cv2.absdiff(img1, img2)

可用于运动检测、帧间差分、图像变化监测等。


57. 什么是图像腐蚀和膨胀操作?如何影响图像结构?

  • 腐蚀(Erode):缩小亮区域,消除噪点

  • 膨胀(Dilate):扩大亮区域,填补小孔

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
    eroded = cv2.erode(img, kernel)
    dilated = cv2.dilate(img, kernel)

常用于图像预处理、遮罩精化、连通区域分析。


58. OpenCV 中如何提取图像中的轮廓层级结构?

使用 cv2.findContours()

复制代码
contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  • hierarchy 中包含每个轮廓的父子关系

  • 可用于嵌套轮廓提取(如同心圆、洞中洞)


59. OpenCV 中如何对图像应用透视变换?与仿射变换有何区别?

透视变换:

复制代码
M = cv2.getPerspectiveTransform(src_pts, dst_pts)
warped = cv2.warpPerspective(img, M, (w, h))
  • 仿射变换保持直线平行性

  • 透视变换则可发生倾斜、消失点等真实场景变化(如拍照矫正、图像配准)


60. OpenCV DNN 模块与其他推理框架(如 TensorRT、ONNXRuntime)的优劣比较?

框架 优点 缺点
OpenCV DNN 轻量、跨平台、C++集成方便 推理速度一般,功能有限
TensorRT NVIDIA GPU 推理最快 仅支持 NVIDIA 平台
ONNXRuntime 通用、支持 CPU/GPU/TPU 封装复杂,需额外依赖

61. 什么是非最大抑制(NMS)?YOLO 检测中如何使用?

非最大抑制用于去除检测框冗余,保留得分最高的。

YOLO 中:

  1. 计算所有候选框的置信度

  2. 对每一类,保留得分最高的框

  3. 与其 IOU 超过阈值的其他框被抑制

OpenCV 有内置函数:

复制代码
cv2.dnn.NMSBoxes(boxes, scores, score_thresh, nms_thresh)

62. YOLO 模型的输出是什么格式?OpenCV 如何解析?

YOLO 输出通常是:

复制代码
[center_x, center_y, width, height, conf, class_probs...]

在 OpenCV 中使用:

复制代码
net.setInput(blob) outputs = net.forward(output_names)

需解析 outputs → 筛选高置信框 + 执行 NMS。


63. UNet 是什么?它适用于哪类图像任务?

UNet 是经典的 语义分割模型,常用于医疗图像、遥感图像、工业缺陷检测等。

特点:

  • 编码器-解码器结构

  • 跳跃连接融合低层细节与高层语义

  • 对小数据训练友好


64. OpenCV 如何部署深度学习语义分割模型(如 UNet、SegNet)?

步骤:

  1. 将模型导出为 ONNX 格式

  2. 使用 cv2.dnn.readNetFromONNX("model.onnx")

  3. 准备 blob 输入并调用 net.forward()

  4. 对输出使用 argmax 获取像素级类别


65. 什么是图像语义分割与实例分割的区别?

类型 描述
语义分割 对每个像素分类,不区分实例(如整张车都是一类)
实例分割 对每个像素分类并区分每个独立对象(多辆车)

常见模型:

  • 语义分割:UNet、DeepLab

  • 实例分割:Mask R-CNN、YOLACT


66. OpenCV 中如何可视化语义分割输出?

方法:

  1. 将类别索引转换为颜色映射

  2. 使用 cv2.applyColorMap() 或手动 LUT

  3. 使用 cv2.addWeighted() 叠加原图与掩码

    colored = cv2.applyColorMap(mask.astype(np.uint8)*10, cv2.COLORMAP_JET)
    blended = cv2.addWeighted(original, 0.6, colored, 0.4, 0)


67. 训练时图像增强的作用是什么?有哪些方法?

作用:增加数据多样性、防止过拟合、提高泛化能力

常见方法:

  • 几何变换:旋转、平移、缩放、裁剪

  • 色彩调整:亮度、对比度、色调

  • 噪声扰动:高斯噪声、模糊

  • CutMix、Mixup 等策略增强


68. OpenCV 是否可以处理视频流目标检测?实现方式?

是的,可以。核心流程:

复制代码
cap = cv2.VideoCapture(0) # 或视频文件
while True:
    ret, frame = cap.read()
    blob = cv2.dnn.blobFromImage(...)
    net.setInput(blob)
    out = net.forward() # 解析 out,绘制检测框

可实时检测目标、打标、写入视频等。


69. OpenCV 与深度学习部署框架(如 ONNX、TensorRT、OpenVINO)如何结合?

OpenCV 可加载 ONNX 模型,也可作为前端与 TensorRT、OpenVINO 集成:

  • OpenCV 作为预处理/后处理工具

  • 模型部分使用:

    • ONNXRuntime → 高性能 CPU/GPU 通用部署

    • TensorRT → NVIDIA 加速部署

    • OpenVINO → Intel 硬件优化


70. OpenCV 中如何进行摄像头标定?用途是什么?

摄像头标定用于消除图像畸变,恢复真实世界几何关系。

步骤:

  1. 拍摄棋盘图

  2. 使用 cv2.findChessboardCorners()

  3. 使用 cv2.calibrateCamera() 获取内参和畸变系数

  4. cv2.undistort() 去畸变图像

用途包括:

  • 三维重建

  • AR 增强现实

  • 精确测量

71. 图像配准(Image Registration)是什么?有哪些方法?

图像配准是将两幅图像对齐到同一视角坐标系中的过程。常用于图像融合、变化检测、医学成像。

常见方法:

  • 基于特征点(SIFT、ORB + RANSAC + 单应矩阵)

  • 基于灰度(互信息、ECC)

  • 几何变换:仿射、透视

OpenCV 实现:

复制代码
cv2.findHomography()
cv2.warpPerspective()

72. OpenCV 实现目标跟踪的方式有哪些?

OpenCV 提供多个跟踪器(通过 cv2.Tracker_create() 创建):

跟踪器名称 特点
KCF 快速,高精度
CSRT 精度高,速度稍慢
MOSSE 非常快,适合实时场景
MIL 多实例,鲁棒性强

使用方式:

复制代码
tracker = cv2.TrackerCSRT_create()
tracker.init(frame, bbox)
success, bbox = tracker.update(frame)

73. 视频稳定(Video Stabilization)的一般原理?OpenCV 如何实现?

核心思路:

  1. 估计相邻帧之间的全局运动(仿射/透视)

  2. 平滑运动轨迹

  3. 应用反向变换到当前帧进行矫正

OpenCV 可用:

  • cv2.estimateAffinePartial2D()

  • cv2.warpAffine() + 滤波轨迹


74. 什么是三维重建?OpenCV 支持哪些 3D 功能?

三维重建是从多视角图像中恢复场景的 3D 结构。

OpenCV 支持:

  • 立体匹配(StereoBM / StereoSGBM)

  • 深度图 → 点云(使用 Q 矩阵)

  • cv2.reprojectImageTo3D()

  • 与结构光 / 深度摄像头结合使用


75. 如何用 OpenCV 实现视频写入(保存)?

复制代码
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 30, (width, height))
while cap.isOpened():
    ret, frame = cap.read()
    out.write(frame)

注意格式(.avi, .mp4)和编码器(XVID, MJPG, H264)的匹配。


76. OpenCV 中如何计算两个图像之间的光流(Optical Flow)?

光流表示图像像素的运动。

常用算法:

  • 稠密光流:cv2.calcOpticalFlowFarneback()

  • 稀疏光流(基于特征点):cv2.calcOpticalFlowPyrLK()

示例:

复制代码
p1, st, err = cv2.calcOpticalFlowPyrLK(prev_gray, gray, p0, None)

常用于:目标跟踪、运动估计、稳定、动态检测


77. 如何对 OpenCV DNN 模型做推理加速?

  1. 使用轻量模型(如 MobileNet、YOLOv5n)

  2. 转换为 ONNX 格式

  3. 使用 cv2.dnn.readNetFromONNX() 加载

  4. 调用 net.setPreferableBackend() 设置加速后端:

    net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)


78. OpenCV 中如何进行特征点匹配过滤?为什么要过滤?

过滤原因:减少误匹配,提高鲁棒性

常用方法:

  • 比值测试(Lowe's ratio test):

    for m, n in matches:
    if m.distance < 0.75 * n.distance:
    good.append(m)

  • RANSAC 去除外点:

    H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC)


79. OpenCV 与深度学习联合项目有哪些典型应用?

  • 实时目标检测 + 跟踪(YOLO + CSRT)

  • 视频实时分割(SegNet + OpenCV)

  • OCR 文本检测 + Tesseract 识别

  • 人脸识别 + 表情分析

  • 工业缺陷检测 + 可视化系统


80. 如何使用 OpenCV 对图像进行 Gamma 校正?作用是什么?

Gamma 校正用于调整图像整体亮度(非线性增强):

复制代码
img_corrected = np.power(img/255.0, gamma) * 255.0
img_corrected = np.uint8(img_corrected)
  • γ < 1 → 图像变亮

  • γ > 1 → 图像变暗

    常用于:增强夜间图像、图像预处理