Qt C++ 调用 YOLO / SAM2的方案
🧱 一、Qt C++ 为什么不能直接调用 YOLO / SAM2
模型 | 实现语言 | 依赖生态 | 是否有官方 C++ 接口 | 说明 |
---|---|---|---|---|
YOLOv11 (Ultralytics) | Python | PyTorch + Numpy + OpenCV | ❌ 没有 | Ultralytics 是纯 Python 封装,C++ 无法直接 import 或 link |
SAM2 (Meta) | Python | PyTorch | ❌ 没有 | 官方只提供 Python + torch 权重加载方式,没有 TorchScript 或 libtorch 接口 |
Qt C++ | C++ | Qt / OpenCV / CUDA / etc | ✅ 纯 C++ | 不能 import Python 模块 |
👉 所以直接写:
YOLO model("yolo11n.pt");
或者:
auto predictor = SAM2ImagePredictor(...);
在 C++ 是不可能编译通过的,因为这些类不存在于 C++ 的命名空间中,它们只在 Python 模块中定义。
✅ 二、想在 Qt C++ 里使用这些模型,有三种可行方案
方案 ①:QProcess 调用 Python 脚本(最简单)
Qt 通过启动 Python 进程运行
yolo_sam2.py
,获取检测结果。
QProcess process; process.start("python3", QStringList() << "/home/bing/sam2-main/yolo_sam2.py" << "image.jpg"); process.waitForFinished(-1); QString output = process.readAllStandardOutput(); qDebug() << output;
你可以在 Python 脚本里输出检测结果为 JSON 格式:
import json print(json.dumps({"boxes": boxes.tolist(), "classes": cls_ids.tolist()}))
C++ 再解析:
QJsonDocument doc = QJsonDocument::fromJson(output.toUtf8()); auto boxes = doc["boxes"].toArray();
✅ 优点: 不需要修改 YOLO 或 SAM2
❌ 缺点: 启动 Python 子进程性能较低,不适合高频实时调用。
方案 ②:嵌入 Python 解释器(Pybind11 / Python.h)
在 C++ 中嵌入 Python 解释器,直接 import Python 模块并调用函数。
这种方式是:
#include <pybind11/embed.h> namespace py = pybind11; py::scoped_interpreter guard{}; // 启动解释器 py::object yolo = py::module::import("ultralytics").attr("YOLO")("yolo11n.pt"); py::object results = yolo.attr("__call__")("bus.jpg");
✅ 优点:
-
模型加载一次可反复调用
-
Qt 界面可以直接与 Python 模型交互
❌ 缺点:
-
需要编译 pybind11 并管理 Python 环境路径
-
比纯 Python 稍复杂
方案 ③:转换模型 → C++ 推理框架
如果你追求 纯 C++ + 高性能(不依赖 Python),则必须 导出模型为 ONNX/TensorRT:
模型 | 转换路径 | Qt 调用接口 |
---|---|---|
YOLOv11 | yolo export format=onnx 或 export format=engine | 通过 TensorRT 或 ONNX Runtime C++ API 加载 |
SAM2 | 手动导出为 TorchScript 或 ONNX(需要修改部分代码) | 同样使用 TensorRT / ONNXRuntime |
例如 YOLOv11:
yolo export model=yolo11n.pt format=onnx
然后在 Qt 中使用 ONNX Runtime:
#include <onnxruntime_cxx_api.h> Ort::Session session(env, "yolo11n.onnx", session_options);
✅ 优点: 真正的 C++ 推理,无需 Python
❌ 缺点: 转换 SAM2 非常困难(模型太大、动态 shape、TorchScript 不完全兼容)
🧩 三、建议你的开发路径(结合 Jetson 平台)
目标 | 推荐方案 |
---|---|
✅ 先跑通 Qt 调用 YOLO+SAM2 | 用 QProcess 调 Python 脚本(最容易) |
🚀 想优化推理速度 | 转 YOLO → TensorRT,SAM2 暂保留 Python |
🧠 最终版本 | Qt 主控 + C++ TensorRT YOLO + Python SAM2 分割 |
💡 总结一句话
❌ Qt C++ 不能直接调用 YOLO 或 SAM2(它们是 Python 类)。
✅ 可以通过 子进程调用 或 嵌入 Python 解释器 实现间接调用。
🚀 若要纯 C++ 实现,则需导出为 ONNX / TensorRT 模型 再用 C++ 推理。
是否希望我帮你写一个:
-
✅ Qt + Python(QProcess)调用 YOLO + SAM2 的模板(带 JSON 通信示例),
这样你只需在 Qt 按钮事件中执行,就能显示检测与分割结果?