[深度学习]目标检测:Opencv与Yolov8实战

📅 2026/6/17 14:09:16
[深度学习]目标检测:Opencv与Yolov8实战
个人主页星柚程精选文章《MATLAB多目标优化》《Kaggle:CV、Public LB 》、《我的第一次 Kaggle》、《C构造传参》、《蛇形机械臂的模拟退火优化》️专栏建设|深度学习|、|Python量化|、|C学习|、|数据结构|流水不争先争得是涛涛不绝。OpenCV应用以下是一个基于图像处理的机场检测代码适用于卫星或航拍图像。它通过检测跑道长直线来定位机场位置并返回边界框坐标。import cv2 import numpy as np import argparse from typing import Tuple, Optional def detect_airport(image_path: str, canny_low: int 50, canny_high: int 150, min_line_length_ratio: float 0.1, angle_tolerance: float 15.0) - Optional[Tuple[int, int, int, int]]: 检测卫星/航拍图像中的机场位置基于跑道特征 参数: image_path: 输入图像路径 canny_low: Canny边缘检测的低阈值 canny_high: Canny边缘检测的高阈值 min_line_length_ratio: 最小线段长度相对于图像对角线长度的比例 angle_tolerance: 主方向角度容差度 返回: 边界框 (x, y, w, h) 或 None (未检测到机场) # 1. 读取图像 img cv2.imread(image_path) if img is None: raise FileNotFoundError(f无法读取图像: {image_path}) h, w img.shape[:2] diag_len np.sqrt(h**2 w**2) min_line_length int(diag_len * min_line_length_ratio) # 2. 预处理灰度化 高斯模糊去噪 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blurred cv2.GaussianBlur(gray, (5, 5), 0) # 3. 边缘检测 edges cv2.Canny(blurred, canny_low, canny_high) # 4. 霍夫线检测 lines cv2.HoughLinesP(edges, rho1, thetanp.pi/180, threshold50, minLineLengthmin_line_length, maxLineGap10) if lines is None: print(未检测到足够长的线段) return None # 5. 提取有效的线段长度足够 valid_lines [] lengths [] angles [] for line in lines: x1, y1, x2, y2 line[0] length np.hypot(x2 - x1, y2 - y1) if length min_line_length: continue # 计算线段角度0~180度 angle np.degrees(np.arctan2(y2 - y1, x2 - x1)) % 180 valid_lines.append((x1, y1, x2, y2)) lengths.append(length) angles.append(angle) if not valid_lines: print(没有符合条件的线段) return None angles np.array(angles) lengths np.array(lengths) # 6. 寻找主方向角度直方图统计加权长度 hist, bins np.histogram(angles, bins36, range(0, 180), weightslengths) main_angle_idx np.argmax(hist) main_angle (bins[main_angle_idx] bins[main_angle_idx 1]) / 2 # 7. 筛选与主方向一致的线段 angle_diff np.abs(angles - main_angle) angle_diff np.minimum(angle_diff, 180 - angle_diff) # 考虑角度环绕 mask angle_diff angle_tolerance selected_indices np.where(mask)[0] if len(selected_indices) 0: print(未找到与主方向匹配的线段) return None # 8. 收集这些线段的端点用于确定机场区域边界 points [] for idx in selected_indices: x1, y1, x2, y2 valid_lines[idx] points.append((x1, y1)) points.append((x2, y2)) points np.array(points) # 9. 使用旋转矩形(minAreaRect)更贴合跑道方向 if len(points) 4: # 端点太少退化为轴对齐矩形 x_min, y_min points.min(axis0) x_max, y_max points.max(axis0) x, y, w, h x_min, y_min, x_max - x_min, y_max - y_min else: rect cv2.minAreaRect(points) box cv2.boxPoints(rect) box np.int0(box) # 转换为轴对齐矩形保留外接范围 x_min, y_min box.min(axis0) x_max, y_max box.max(axis0) x, y, w, h x_min, y_min, x_max - x_min, y_max - y_min # 10. 添加少量扩展使边界包含整个机场区域 expand_ratio 0.1 expand_w int(w * expand_ratio) expand_h int(h * expand_ratio) x max(0, x - expand_w) y max(0, y - expand_h) w min(w 2 * expand_w, img.shape[1] - x) h min(h 2 * expand_h, img.shape[0] - y) return (x, y, w, h) def draw_result(image_path: str, bbox: Optional[Tuple[int, int, int, int]]): 绘制检测结果并显示 img cv2.imread(image_path) if bbox is not None: x, y, w, h bbox cv2.rectangle(img, (x, y), (x w, y h), (0, 255, 0), 3) cv2.putText(img, Airport, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) print(f检测到机场位置: x{x}, y{y}, width{w}, height{h}) else: print(未检测到机场) cv2.putText(img, No airport detected, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) cv2.imshow(Airport Detection, img) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ __main__: parser argparse.ArgumentParser(description从卫星/航拍图像中检测机场位置) parser.add_argument(image, help输入图像路径) parser.add_argument(--canny_low, typeint, default50, helpCanny低阈值) parser.add_argument(--canny_high, typeint, default150, helpCanny高阈值) parser.add_argument(--min_line_ratio, typefloat, default0.1, help最小线段长度相对于图像对角线的比例) args parser.parse_args() bbox detect_airport( args.image, canny_lowargs.canny_low, canny_highargs.canny_high, min_line_length_ratioargs.min_line_ratio ) draw_result(args.image, bbox)YOLOv8应用从 OpenCV 转向 YOLOv8意味着从传统视觉方法迈入了深度学习的目标检测领域。得益于其强大的预训练模型这种方法在复杂环境下的检测能力远超前者。你可以像用计算器一样通过极简的代码直接调用最先进的SOTA目标检测能力。 YOLOv8 简介为什么用它YOLOv8 是目前最先进的目标检测算法之一官方提供的 ultralytics 库让使用变得异常简单。· 解耦式头结构Decoupled Head将分类和回归任务分开处理让模型更专注于学习不同的特征。· Anchor-Free 设计相比需要预设锚框的传统方法这种方式更灵活泛化能力更强。· PAN-FPN 结构能更好地融合不同尺度的特征有效提升对小目标的检测能力。️ 极简推理代码 (YOLOv8)有了预训练模型几行代码就能实现检测特别适合快速验证。前提确保你的 Python 环境已安装 ultralytics 和 opencv-python 库。pip install ultralytics opencv-python以下是一个完整的图片检测脚本它能加载模型、执行推理并保存带标注的结果图片。import cv2 from ultralytics import YOLO # 1. 加载预训练模型 (选择最适合你场景的版本) # yolov8n.pt 是 Nano 版本速度快但精度相对较低yolov8x.pt 是 Extra Large 版本精度高但速度慢 model YOLO(yolov8x.pt) # 2. 执行预测 # 输入可以是图片路径、视频路径、图片URL等 # 这里以输入图片路径为例 image_path your_image.jpg results model(image_path) # 3. 查看与保存结果 # results 是一个列表包含每张图片的检测结果 for i, result in enumerate(results): # 获取检测到的对象如 airplane, car 等 boxes result.boxes if boxes is not None: for box in boxes: # 获取类别ID和置信度 cls int(box.cls[0]) conf float(box.conf[0]) # 打印检测信息 print(fDetected object: {model.names[cls]} with confidence: {conf:.2f}) # 保存带检测框的图片 result.save(filenamefresult_{i}.jpg) print(fResult saved to result_{i}.jpg) 训练你自己的机场检测模型预训练模型如 yolov8n.pt是在通用数据集如 COCO上训练的识别普通 airplane 通常没问题。但要获得最佳效果还是建议用自己的数据训练一个专用模型。1. 准备数据集收集包含机场的航拍或卫星图用标注工具如 LabelImg框出飞机或跑道转为 YOLO 格式的 .txt 文件。2. 编排数据按如下结构组织并创建 dataset.yaml 配置文件。datasets/├── train/│ └── images/ (图片), labels/ (标签)└── val/└── images/ (图片), labels/ (标签)# dataset.yaml path: ../datasets # 数据集根目录 train: train/images # 训练集图片路径 val: val/images # 验证集图片路径 nc: 2 # 类别数量例如1飞机2跑道 names: [airplane, runway]3. 开始训练在命令行执行以下命令即可。yolo train modelyolov8s.pt datadataset.yaml epochs100 imgsz640YOLOv8优势从传统方法切换到 YOLOv8 的思路关键在于· 准确率大幅提升YOLOv8 能处理复杂背景、光照变化和部分遮挡这是传统方法难以做到的。· 开发极其简单用几行代码就能完成推理快速验证想法。· 高性能YOLOv8 模型经过优化即便是中低端 GPU 也能做到实时检测。结合之前的代码我画了个对比图YOLOv8 的优势应该会更直观一些mermaidflowchart LRA[输入图片] -- B{选择方法}B -- OpenCV方法 -- C[预处理br颜色、边缘等]C -- D[人工特征提取br如霍夫变换]D -- E[规则匹配与分类]E -- F[输出结果可能误检]B -- YOLOv8方法 -- G[深度神经网络br自动提取特征]G -- H[端到端检测]H -- I[输出结果高精度]OpenCV优势虽然YOLOv8功能强大但它无法独立完成一个完整的视觉项目。它的局限性恰恰是OpenCV的核心优势1. 基础操作YOLOv8无能为力· 图像I/OYOLOv8本身无法读取图片、操作摄像头或保存结果而这些几乎完全依赖OpenCV完成。· 图像预处理缩放、颜色转换YOLO通常需要RGB输入而OpenCV默认是BGR格式、去噪滤波等操作为模型准备高质量输入图像都离不开OpenCV。· 后处理与可视化将YOLOv8的检测结果绘制成直观的边界框和文本标签也是由OpenCV完成的。· 其他基础功能YOLOv8无法进行摄像头的标定和立体视觉、图像拼接、复杂的形态学处理、3D重建等操作。2. 功能范围YOLOv8望尘莫及· 广度OpenCV是“百宝箱”涵盖数千种功能而YOLOv8则是“精品店”专注于少数前沿AI任务。· 深度OpenCV不仅限于AI还包含相机校准、3D重建、机器学习等模块YOLOv8的核心始终围绕深度学习。思考在以下情况才值得考虑C否则坚持纯Python。· 你要在嵌入式设备上运行内存/CPU极其有限· 你必须用某个只有C版本的专用库· 你的项目有严格毫秒级实时要求