QT开发技术 [opencv加载onnx模型,dnn推理]

一、导出onnx 模型

yolo export model=xx\xx\best.pt format=onnx

二、qt加载onnx模型,推理显示

cpp 复制代码
 std::string fileName = QCoreApplication::applicationDirPath().toStdString() + "/Model/best.onnx";

 cv::dnn::Net net = cv::dnn::readNetFromONNX(fileName);
 if (net.empty()) {
     std::cerr << "Failed to load ONNX model. Check: " << std::endl
         << "1. File path: " << fileName << std::endl
         << "2. OpenCV version (require >= 4.5)" << std::endl
         << "3. ONNX opset compatibility" << std::endl;
     return;
 }

 cv::Mat image = cv::imread(QCoreApplication::applicationDirPath().toStdString() + "/Data/test3.jpg");
 if (image.empty()) {
     std::cerr << "Failed to load image" << std::endl;
     return;
 }

 // 预处理增强
 cv::Mat blob;
 try {
     bool swapRB = true;  // OpenCV默认BGR,YOLO需要RGB
     bool crop = false;
     cv::Scalar mean = cv::Scalar(0, 0, 0);
     double scale = 1.0 / 255.0;

     blob = cv::dnn::blobFromImage(image,
         scale,
         cv::Size(640, 640),
         mean,
         swapRB,
         crop,
         CV_32F);
 }
 catch (...) {
     std::cerr << "Blob creation failed" << std::endl;
     return;
 }

 // 设置计算后端(根据环境配置)
 net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
 net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);

 std::vector<std::string> outLayerNames = net.getUnconnectedOutLayersNames();
 std::vector<cv::Mat> predictions;

 try {
     net.setInput(blob);
     net.forward(predictions, outLayerNames);
 }
 catch (const cv::Exception& e) {
     std::cerr << "Forward pass failed: " << e.what() << std::endl;
     return;
 }


 // 后处理
 std::vector<int> classIds;
 std::vector<float> confidences;
 std::vector<cv::Rect> boxes;
 float x_factor = image.cols / 640.0;
 float y_factor = image.rows / 640.0;
 // YOLO 专用预处理参数
 float confThreshold = 0.25;
 float nmsThreshold = 0.45;

 for (const auto& pred : predictions) {
     for (int i = 0; i < pred.rows; ++i) {
         cv::Mat scores = pred.row(i).colRange(5, pred.cols);
         cv::Point classIdPoint;
         double confidence;
         cv::minMaxLoc(scores, 0, &confidence, 0, &classIdPoint);
         if (confidence > confThreshold) {
             int centerX = static_cast<int>(pred.at<float>(i, 0) * x_factor);
             int centerY = static_cast<int>(pred.at<float>(i, 1) * y_factor);
             int width = static_cast<int>(pred.at<float>(i, 2) * x_factor);
             int height = static_cast<int>(pred.at<float>(i, 3) * y_factor);
             int left = centerX - width / 2;
             int top = centerY - height / 2;

             classIds.push_back(classIdPoint.x);
             confidences.push_back(static_cast<float>(confidence));
             boxes.push_back(cv::Rect(left, top, width, height));
         }
     }
 }

 // 非极大值抑制
 std::vector<int> indices;
 cv::dnn::NMSBoxes(boxes, confidences, confThreshold, nmsThreshold, indices);

 // 在图像上绘制边界框和标签
 for (int idx : indices) {
     cv::Rect box = boxes[idx];
     cv::rectangle(image, box, cv::Scalar(0, 255, 0), 2);
     std::string label = cv::format("%.2f", confidences[idx]);
     cv::putText(image, label, cv::Point(box.x, box.y - 10), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0), 2);
 }

 // 在 ui->label_Map 上显示图像
 cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
 QPixmap pixmap = QPixmap::fromImage(QImage(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888));
 ui->label_Map->setPixmap(pixmap);
相关推荐
把我格子衫拿来4 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
晨间晓9 小时前
图片里的细小噪点怎么平滑?用华为云码道开发 OpenCV 图像滤波对比工具
人工智能·opencv·华为云
把我格子衫拿来10 小时前
VTK 与 Qt 的 CMake 工程怎么组织?模块、工具链与二进制兼容排错
c++·qt·vtk·cmake·工程实践
偷吃米饭12 小时前
图片特征怎么描述?用华为云码道开发 OpenCV ORB 特征提取工具
人工智能·opencv·华为云
代钦塔拉12 小时前
【C++/Qt 进阶】设计模式系列(4):原型模式——用“克隆“代替“重新构造“
c++·qt·设计模式
Python图像识别12 小时前
56-【2027毕设】YOLO11X光安检危险物品检测系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
晨间晓13 小时前
图片里的关键点怎么找?用华为云码道开发 OpenCV FAST 特征点检测工具
人工智能·opencv·华为云
晨间晓13 小时前
二值图里的噪点怎么去掉?用华为云码道开发 OpenCV 形态学操作工具
人工智能·opencv·华为云
把我格子衫拿来15 小时前
鼠标点到哪里才算选中?Qt 与 VTK 的拾取坐标、DPI 与体素定位
python·qt·vtk·坐标变换·三维交互
晨间晓15 小时前
图片里的角点在哪里?用华为云码道开发 OpenCV Harris 角点检测工具
人工智能·opencv·华为云