机器视觉在航空行业已从“可选技术”变为“关键基础设施”,其落地场景贯穿设计、制造、运营、维护全生命周期。下面从“现状概览”与“具体案例”两个维度进行归纳。
一、应用现状概览
-
制造阶段
• 视觉测量:用结构光/双目视觉对机翼、机身对接部位进行 0.01 mm 级位姿测量,取代传统工装定位。
• 视觉引导:机器人根据实时视觉反馈完成铆接、涂胶、紧固件安装,人工干预减少 70 % 以上。
• 缺陷检测:在复材蒙皮、发动机叶片工位部署 AI 视觉,实时发现裂纹、缺胶、划痕,漏检率降至 0.1 %。 -
运营/维护阶段
• 无人机+视觉的“绕机检查”已在多家 MRO 机构常态化,检查一架窄体机由 2 小时缩短到 15 分钟。
• 机场跑道 FOD(异物)监测系统 7×24 在线,深圳机场试点表明误报率 < 3 %。
• 基于数字孪生的“预测性维护”正与视觉检测数据融合,实现从“定时检修”向“视情维修”过渡。 -
飞行试验与空域管理
• 高速摄像机以 10 000 fps 记录火箭级间分离、飞机投弹姿态,为 CFD 模型校准提供高保真数据。
• 部分机场正在测试“视觉着陆辅助系统”,在 ILS 失效或低能见度下用摄像头实时计算飞机与跑道入口的相对位置,作为冗余备份。
二、具体案例拆解
表格
复制
案例 | 技术方案 | 效果与数据 | 来源 |
---|---|---|---|
汉莎技术飞机蒙皮检测 | 无人机搭载 1.2 亿像素相机 + YOLOv8 缺陷模型 | 单架 A320 检查时间由 120 min ↓ 15 min;裂纹检出率 99.3 % | |
深圳机场跑道异物监测 | 跑道两侧 24 台 4K 相机 + 边缘 AI 盒子 | 异物识别精度 95 %,平均告警延迟 < 2 s | |
涡轮转子“零缺陷”装配线 | 5 组协作机器人 + 8 台 500 mm 远心镜头 | 叶片漏装率 0;装配节拍 6 min/级 ↓ 2.5 min/级 | |
菲特 3D 扫描叶片检测 | 蓝光 3D 扫描 + AI 比对 | 单件扫描 2-4 min;尺寸偏差检出阈值 0.02 mm | |
神舟十八号返回舱着陆监测 | 高速摄像机 10 000 fps + 数字图像相关法 | 成功捕获 20 ms 级降落伞展开过程,为结构改进提供关键数据 |
三、趋势展望
• “多模态”融合:视觉+毫米波+红外同步采集,解决夜间/雨雾场景的缺陷检测盲区。
• 小样本学习:针对航空罕见缺陷(如复合材料分层),正采用 Few-shot Learning 降低对大规模标注数据的依赖。
• 机载视觉:部分新研飞机在襟翼、起落架舱内嵌入微型视觉节点,实现“在飞状态”实时自检,预计 2026 年进入适航验证。
*“航空蒙皮裂纹检测”**的 Python 示例(基于 YOLOv8),
复制
-
缺陷检测(裂纹/划痕)
场景:灰度金属表面,检测裂纹或划痕。
思路:传统方法(Canny + 形态学 + 轮廓)即可快速验证;如数据量大再迁移到深度学习。
Python
复制
# detect_crack.py
import cv2
import numpy as np
def detect_crack(img_path, save_path="crack_out.jpg"):
img = cv2.imread(img_path, 0) # 灰度读取
blur = cv2.GaussianBlur(img, (5, 5), 0)
edges = cv2.Canny(blur, 50, 150) # 边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 15))
dilate = cv2.dilate(edges, kernel, 1) # 纵向增强
contours, _ = cv2.findContours(dilate, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
out = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
for c in contours:
area = cv2.contourArea(c)
if area < 100: # 过滤噪声
continue
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(out, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.imwrite(save_path, out)
print("done, result saved to", save_path)
if __name__ == "__main__":
detect_crack("metal_surface.jpg")
运行:
bash
复制
pip install opencv-python
python detect_crack.py
输入:metal_surface.jpg(800×600 左右灰度或彩色金属图)。
输出:crack_out.jpg(红框标注裂纹)。
-
尺寸测量(机翼对接缝隙宽度)
场景:已知相机内参,拍摄一条缝隙,计算物理宽度。
思路:单目像素→物理比例标定,再测量缝隙像素宽度。
Python
复制
# gap_measure.py
import cv2
import numpy as np
# 标定:已知缝隙实际宽度 2 mm,对应像素 80 px
PX_PER_MM = 80 / 2.0 # 40 px/mm
def measure_gap(img_path):
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 50,
minLineLength=50, maxLineGap=10)
# 取最长线段作为缝隙方向
longest = max(lines, key=lambda x: np.linalg.norm((x[0]-x[2], x[1]-x[3])))
x1, y1, x2, y2 = longest[0]
px_length = np.hypot(x2-x1, y2-y1)
mm = px_length / PX_PER_MM
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(img, f"{mm:.2f} mm", (x1, y1-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)
cv2.imwrite("gap_result.jpg", img)
print("gap width = %.2f mm" % mm)
if __name__ == "__main__":
measure_gap("wing_gap.jpg")
运行:
bash
复制
python gap_measure.py
提示:先用尺子拍一张 2 mm 缝隙图,量出像素值修改 PX_PER_MM
,再测未知图。
-
目标识别/跟踪(跑道异物 FOD)
场景:机场跑道定点摄像头,实时检测小石块、螺母等异物。
思路:YOLOv8 检测 + DeepSORT 跟踪。
Python
复制
# fod_track.py
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSort
import cv2
model = YOLO("yolov8n.pt") # 或训练好的 best.pt
tracker = DeepSort(max_age=5, n_init=2)
cap = cv2.VideoCapture("runway.mp4") # 或 rtsp:// 摄像头
while cap.isOpened():
ok, frame = cap.read()
if not ok:
break
results = model.predict(frame, conf=0.3, classes=[0, 25, 39]) # 人、背包、手提箱
dets = []
for r in results[0].boxes:
x1, y1, x2, y2 = r.xyxy[0].cpu().numpy()
conf = r.conf[0].cpu().numpy()
dets.append([[x1, y1, x2, y2], conf])
tracks = tracker.update_tracks(dets, frame=frame)
for t in tracks:
if not t.is_confirmed():
continue
x1, y1, x2, y2 = map(int, t.to_ltrb())
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, f"{t.track_id}", (x1, y1-5),
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
cv2.imshow("FOD Track", frame)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
安装:
bash
复制
pip install ultralytics deep-sort-realtime opencv-python
准备:一段 1920×1080 的跑道视频;若想检测螺母等自定义类别,用 YOLOv8 训练 50 张图即可得到 best.pt,再替换模型路径。
-
3D 重建(叶片扫描)
场景:用单相机 + 旋转台拍摄叶片一周,离线重建 3D 点云。
思路:OpenCV 自带 Structure from Motion (SfM),无需深度相机。
Python
复制
# blade_sfm.py
import cv2, glob, numpy as np
images = sorted(glob.glob("blade/*.jpg"))
detector = cv2.SIFT_create()
matcher = cv2.BFMatcher(cv2.NORM_L2, crossCheck=False)
# 提取所有图像特征
kps, descs = [], []
for img_path in images:
img = cv2.imread(img_path, 0)
kp, des = detector.detectAndCompute(img, None)
kps.append(kp)
descs.append(des)
# 匹配两两图像
idx1, idx2 = 0, 5 # 任选两张做演示
matches = matcher.knnMatch(descs[idx1], descs[idx2], k=2)
good = [m for m, n in matches if m.distance < 0.7*n.distance]
# 计算 Fundamental 矩阵并筛选匹配
pts1 = np.float32([kps[idx1][m.queryIdx].pt for m in good])
pts2 = np.float32([kps[idx2][m.trainIdx].pt for m in good])
F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_RANSAC, 1.0, 0.99)
pts1 = pts1[mask.ravel()==1]
pts2 = pts2[mask.ravel()==1]
# 三角测量
K = np.array([[800, 0, 640], [0, 800, 360], [0, 0, 1]]) # 相机内参
E, _ = cv2.findEssentialMat(pts1, pts2, K, method=cv2.RANSAC, prob=0.999, threshold=1.0)
_, R, t, _ = cv2.recoverPose(E, pts1, pts2, K)
P1 = K @ np.hstack([np.eye(3), np.zeros((3,1))])
P2 = K @ np.hstack([R, t])
points4D = cv2.triangulatePoints(P1, P2, pts1.T, pts2.T)
points3D = points4D[:3] / points4D[3]
# 保存点云
np.savetxt("blade.xyz", points3D.T)
print("Saved blade.xyz, open with CloudCompare/MeshLab")
运行:
bash
复制
pip install opencv-contrib-python numpy glob2
python blade_sfm.py
准备:手机固定拍叶片 20-30 张不同角度,放 blade/ 文件夹,内参需用棋盘格标定后替换 K。若要完整 360° 重建,可用 COLMAP/MVE 一键 SfM,再导入 MeshLab。
小结
• 缺陷检测:传统图像处理即可跑通,数据量大再转深度模型。
• 尺寸测量:先像素标定,再几何计算。
• FOD 跟踪:YOLO + DeepSORT 在 1080p 上可达 30 FPS(RTX3060)。
• 3D 重建:SfM 无硬件成本,精度 0.1-0.5 mm(取决于标定)。
-
缺陷检测(detect_crack.py)
表格
复制
步骤 | 规则说明 |
---|---|
准备 | 1. 收集 20 张以上金属/复材表面照片(裂纹、划痕为正样本,无缺陷为负样本)。 |
标定 | 可选:若用传统方法无需标注;若转深度学习,用 Labelme 画多边形,导出 JSON。 |
运行 | python detect_crack.py --input data/raw/xxx.jpg --output results/ |
验证 | 打开 results/crack_out.jpg ,红框即为检出缺陷;漏检→调低 Canny 低阈值或换深度模型。 |
维护 | 每月追加 10 张现场新缺陷图,重新训练 YOLO → 替换 best.pt ;传统方法则更新面积阈值。 |
-
尺寸测量(gap_measure.py)
表格
复制
步骤 | 规则说明 |
---|---|
准备 | 1. 打印 100 mm 标准标尺贴在工作台; |
标定 | 运行 python tools/calibrate.py --image calib.jpg --real 100 ,得到 px_per_mm.json 。 |
运行 | python gap_measure.py --image wing_gap.jpg --calib px_per_mm.json |
验证 | 用游标卡尺实测同一条缝隙,误差 ≤0.1 mm 为通过;>0.1 mm 重新标定。 |
维护 | 每季度检查相机是否移位,若移位 >2 mm 需重拍 calib.jpg。 |
-
跑道异物 FOD 跟踪(fod_track.py)
表格
复制
步骤 | 规则说明 |
---|---|
准备 | 1. 摄像头:海康 4K 枪机,固定俯角 30°; |
标注 | 用 CVAT 标注 2000 张,类别 FOD ,导出 YOLO 格式 → data/fod.yaml 。 |
训练 | yolo train data=fod.yaml model=yolov8n.pt epochs=50 imgsz=1280 |
运行 | python fod_track.py --source rtsp://admin:pwd@192.168.1.100 --weights runs/train/exp/weights/best.pt |
验证 | 现场投放 10 个异物(螺母 5 mm-30 mm),系统需在 3 s 内告警,漏报 ≤1 个。 |
维护 | 每半年用新季节光照视频增量训练 10 epoch;边缘盒子固件 OTA 更新。 |
-
3D 叶片重建(blade_sfm.py)
表格
复制
步骤 | 规则说明 |
---|---|
准备 | 1. 单反/手机固定在三脚架; |
标定 | 打印 9×6 棋盘格,用 python tools/calib_camera.py --pattern 9x6 --size 20mm ,得到 K.yaml 。 |
运行 | python blade_sfm.py --images blade/ --intrinsics K.yaml |
验证 | 用卡尺量叶片最大弦长,与重建模型 MeshLab 测量值误差 ≤0.5 %。 |
维护 | 若换镜头或焦距,必须重新标定 K.yaml 。 |
通用运维 checklist
✅ 所有脚本加 --help
查看参数
✅ 日志统一写到 logs/YYYY-MM-DD.log
✅ 异常退出时自动邮件到 ops@company.com
✅ Docker 镜像:docker run -v $(pwd)/data:/app/data ghcr.io/xxx/vision:1.0
# 安装依赖:pip install ultralytics opencv-python
from ultralytics import YOLO
import cv2
# 1. 加载预训练模型(官方YOLOv8n或自己训练的裂纹检测模型)
model = YOLO("yolov8n.pt") # 替换为你的 best.pt
# 2. 推理单张图片
img_path = "aircraft_skin.jpg"
results = model.predict(source=img_path, conf=0.25, save=True)
# 3. 解析结果并画框
for r in results:
im_array = r.plot() # 返回带标注的BGR numpy数组
cv2.imshow("Crack Detection", im_array)
cv2.imwrite("result.jpg", im_array)
cv2.waitKey(0)