目录
[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 是经典边缘检测算法,步骤如下:
-
高斯滤波降噪
-
计算梯度幅值和方向(Sobel)
-
非极大值抑制(NMS)
-
双阈值处理 + 边缘连接
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 中如何进行图像拼接?需要哪些关键步骤?
图像拼接的一般步骤:
-
特征点提取(如 SIFT、ORB)
-
特征匹配(如 FLANN)
-
计算单应性矩阵(
cv2.findHomography
) -
图像透视变换(
cv2.warpPerspective
) -
图像叠加
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 有什么区别?
特征匹配流程:
-
提取特征(SIFT/ORB)
-
使用
BFMatcher
或FlannBasedMatcher
匹配特征
区别:
匹配器 | 特点 |
---|---|
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?
部署步骤:
-
使用
torch.onnx.export()
将模型导出为.onnx
-
在 OpenCV 中使用
readNetFromONNX()
-
利用
blobFromImage()
准备输入 -
用
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 如何实现?
图像金字塔融合用于将不同曝光、对焦图像融合成一张清晰图。
流程:
-
构建拉普拉斯金字塔(图像)
-
构建高斯金字塔(掩膜)
-
对各层图像加权融合
-
重构图像
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 中:
-
计算所有候选框的置信度
-
对每一类,保留得分最高的框
-
与其 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)?
步骤:
-
将模型导出为 ONNX 格式
-
使用
cv2.dnn.readNetFromONNX("model.onnx")
-
准备
blob
输入并调用net.forward()
-
对输出使用
argmax
获取像素级类别
65. 什么是图像语义分割与实例分割的区别?
类型 | 描述 |
---|---|
语义分割 | 对每个像素分类,不区分实例(如整张车都是一类) |
实例分割 | 对每个像素分类并区分每个独立对象(多辆车) |
常见模型:
-
语义分割:UNet、DeepLab
-
实例分割:Mask R-CNN、YOLACT
66. OpenCV 中如何可视化语义分割输出?
方法:
-
将类别索引转换为颜色映射
-
使用
cv2.applyColorMap()
或手动 LUT -
使用
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 中如何进行摄像头标定?用途是什么?
摄像头标定用于消除图像畸变,恢复真实世界几何关系。
步骤:
-
拍摄棋盘图
-
使用
cv2.findChessboardCorners()
-
使用
cv2.calibrateCamera()
获取内参和畸变系数 -
用
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 如何实现?
核心思路:
-
估计相邻帧之间的全局运动(仿射/透视)
-
平滑运动轨迹
-
应用反向变换到当前帧进行矫正
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 模型做推理加速?
-
使用轻量模型(如 MobileNet、YOLOv5n)
-
转换为 ONNX 格式
-
使用
cv2.dnn.readNetFromONNX()
加载 -
调用
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 → 图像变暗
常用于:增强夜间图像、图像预处理