目录
2. OpenCV 中图像的默认颜色通道是什么顺序?如何转换为 RGB?
10. OpenCV 的 DNN 模块可以做什么?支持哪些模型格式?
18. OpenCV 中如何进行图像拼接?需要哪些关键步骤?
20. OpenCV 与深度学习框架(如 PyTorch、TensorFlow)的关系?
24. 如何使用 OpenCV 对图像进行颜色空间转换?常用的颜色空间有哪些?
27. OpenCV 中如何进行特征匹配?FLANN 和 BFMatcher 有什么区别?
30. 什么是 OpenCV 的 blobFromImage?它在深度学习中有什么用?
31. 什么是图像直方图?在 OpenCV 中如何计算和显示?
32. OpenCV 中如何进行图像阈值分割?常见方法有哪些?
35. 如何使用 OpenCV 实现图像模板匹配?结果如何解释?
37. OpenCV 中如何提取图像的轮廓面积、周长与形状特征?
38. 如何使用 OpenCV 实现图像锐化?常用锐化核有哪些?
39. OpenCV DNN 模块加载 ONNX 模型的完整流程?
42. OpenCV 如何提取图像的边界框(bounding box)?
44. 什么是非极大值抑制(NMS)?在 Canny 和目标检测中的作用?
52. OpenCV 中如何对图像做颜色反转?常见用途是什么?
53. 如何利用 OpenCV 对图像做“旋转 + 缩放 + 平移”的组合变换?
54. 如何用 OpenCV 实现图像通道置换(如 RGB→BGR)?
55. 什么是图像边缘检测?OpenCV 中有哪些常见方法?
59. OpenCV 中如何对图像应用透视变换?与仿射变换有何区别?
60. OpenCV DNN 模块与其他推理框架(如 TensorRT、ONNXRuntime)的优劣比较?
61. 什么是非最大抑制(NMS)?YOLO 检测中如何使用?
62. YOLO 模型的输出是什么格式?OpenCV 如何解析?
64. OpenCV 如何部署深度学习语义分割模型(如 UNet、SegNet)?
68. OpenCV 是否可以处理视频流目标检测?实现方式?
69. OpenCV 与深度学习部署框架(如 ONNX、TensorRT、OpenVINO)如何结合?
71. 图像配准(Image Registration)是什么?有哪些方法?
73. 视频稳定(Video Stabilization)的一般原理?OpenCV 如何实现?
74. 什么是三维重建?OpenCV 支持哪些 3D 功能?
76. OpenCV 中如何计算两个图像之间的光流(Optical Flow)?
78. OpenCV 中如何进行特征点匹配过滤?为什么要过滤?
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 → 图像变暗
常用于:增强夜间图像、图像预处理