广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Qt+OpenCV实现目标检测详解
  • 465
分享到

Qt+OpenCV实现目标检测详解

2024-04-02 19:04:59 465人浏览 安东尼
摘要

目录一、创建项目&UI设计二、代码与演示演示效果拓展阅读一、创建项目&UI设计 创建项目,UI设计如下 文件类型判断 简单的判断文件类型 QString file(

一、创建项目&UI设计

创建项目,UI设计如下

文件类型判断

简单的判断文件类型

QString file("sample.jpg");
if (file.contains(".jpg") || file.contains(".bmp") || file.contains(".png"))
    qDebug()<<"这是图片。";

推荐使用QMimeDatabase类

QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile("sample.bmp");
if (mime.name().startsWith("image/")) 
    qDebug()<<"这是图片。";
类型描述 示例
text普通文本text/plain,
text/html,
text/CSS,
text/javascript
image图像文件(包含动态gif)image/gif,
image/png,
image/jpeg,
image/bmp,
image/WEBp
audio音频文件audio/wav,
audio/mpeg,
audio/midi,
audio/webm,
audio/ogg
video视频文件video/mp4,
video/x-flv,
video/webm,
video/ogg
application二进制数据application/xml,
application/pdf

二、代码与演示

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QFileDialog>
#include <QFile>
#include <OpenCV2/opencv.hpp>
#include <QMainWindow>
#include <Qtimer>
#include <QImage>
#include <QPixmap>
#include <QDateTime>
#include <QMutex>
#include <QMutexLocker>
#include <QMimeDatabase>
#include <iOStream>

QPixmap Mat2Image(cv::Mat src);

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    void Init();
    ~MainWindow();

private slots:
    void readFrame(); //自定义信号处理函数

    void on_pushButton_OpenFile_clicked();

    void on_pushButton_StartDetect_clicked();

    void on_pushButton_StopDetect_clicked();

    void on_pushButton_FlushDevice_clicked();

private:
    Ui::MainWindow *ui;
    QTimer *timer;
    QImage *img;
    QString mp4_path = NULL;
    cv::VideoCapture *capture;
    cv::CascadeClassifier *classifier;
    std::vector<cv::Rect> bodys;
    int display_HeightWidth = 500;
    int IsDetect_ok = 0;     //用于判断是否加载了MP4和xml
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    timer = new QTimer(this);
    timer->setInterval(33);
    connect(timer,SIGNAL(timeout()),this,SLOT(readFrame()));
    ui->pushButton_StartDetect->setEnabled(false);
    ui->pushButton_StopDetect->setEnabled(false);
    Init();
}

void MainWindow::Init()
{
    capture = new cv::VideoCapture();
    classifier = new cv::CascadeClassifier;
}

MainWindow::~MainWindow()
{
    capture->release();
    delete ui;
}


void MainWindow::readFrame()
{
    cv::Mat frame, hsv_img, mask_img, gray_src;
    capture->read(frame);
    if (frame.empty()) return;
//    int frame_width = capture->get(cv::CAP_PROP_FRAME_WIDTH);
//    int frame_height = capture->get(cv::CAP_PROP_FRAME_HEIGHT);
//    if (frame_width / frame_height >= 1){
//        cv::resize(frame, frame, cv::Size(display_HeightWidth, (int)(frame_height * display_HeightWidth / frame_width)));
//    }else{
//        cv::resize(frame, frame, cv::Size((int)(frame_width * display_HeightWidth / frame_height), display_HeightWidth));
//    }

    //算法一:行人检测
    cv::cvtColor(frame, gray_src, cv::COLOR_BGR2GRAY);
    cv::equalizeHist(gray_src, gray_src);
    classifier->detectMultiScale(gray_src, bodys, 1.1, 3, 0, cv::Size(30, 30));
    for (size_t i = 0; i < bodys.size(); i++){
        cv::rectangle(frame, bodys[i], cv::Scalar(0, 0, 255), 2, 8, 0);
    }

    //算法二:颜色跟踪
    cv::cvtColor(frame, hsv_img, cv::COLOR_BGR2HSV);
    cv::inRange(hsv_img, cv::Scalar(35, 43, 46), cv::Scalar(155, 255, 255), mask_img);
    cv::Mat kernel = getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
    morphologyEx(mask_img, mask_img, cv::MORPH_CLOSE, kernel);
    erode(mask_img, mask_img, kernel);
    GaussianBlur(mask_img, mask_img, cv::Size(3, 3), 0, 0);
    if (cv::waiTKEy(30) == 27) {
        ui->textEdit_log->setText("Exit...");
        ui->label_raw->clear();
        return;
    }
    cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);
    QImage rawImage = QImage((uchar*)(frame.data),frame.cols,frame.rows,frame.step,QImage::FORMat_RGB888);
    ui->label_raw->setPixmap(QPixmap::fromImage(rawImage));     //显示源图像
    QImage dstImage = QImage((uchar*)(mask_img.data),mask_img.cols,mask_img.rows,mask_img.step,QImage::Format_Grayscale8);
    ui->label_detect->setPixmap(QPixmap::fromImage(dstImage));  //显示图像
}


void MainWindow::on_pushButton_OpenFile_clicked()
{
    QString filename = QFileDialog::getOpenFileName(this,"打开文件",".","*.mp4 *.avi;;*.png *.jpg *.jpeg *.bmp");
    if(!QFile::exists(filename)){
        return;
    }
    ui->statusbar->showMessage(filename);
    IsDetect_ok +=1;
    if (IsDetect_ok ==2)
        ui->pushButton_StartDetect->setEnabled(true);
    QMimeDatabase db;
    QMimeType mime = db.mimeTypeForFile(filename);
    if (mime.name().startsWith("image/")) {
        cv::Mat src = cv::imread(filename.toLatin1().data());
        if(src.empty()){
            ui->statusbar->showMessage("图像不存在!");
            return;
        }
        cv::Mat temp;
        if(src.channels()==4)
            cv::cvtColor(src,temp,cv::COLOR_BGRA2RGB);
        else if (src.channels()==3)
            cv::cvtColor(src,temp,cv::COLOR_BGR2RGB);
        else
            cv::cvtColor(src,temp,cv::COLOR_GRAY2RGB);
        QImage img = QImage((uchar*)temp.data,temp.cols,temp.rows,temp.step,QImage::Format_RGB888);
        ui->label_raw->setPixmap(QPixmap::fromImage(img));
        ui->label_raw->resize(ui->label_raw->pixmap()->size());
        filename.clear();
    }else if (mime.name().startsWith("video/")) {
        capture->open(filename.toLatin1().data());
        if (!capture->isOpened()){
            ui->textEdit_log->append("fail to open MP4!");
            return;
        }
        ui->textEdit_log->append(QString::fromUtf8("Open video: %1 succesfully!").arg(filename));

        //获取整个帧数
        long totalFrameNumber = capture->get(CV_CAP_PROP_FRAME_COUNT);
        ui->textEdit_log->append(QString::fromUtf8("整个视频共 %1 帧").arg(totalFrameNumber));
        ui->label_raw->resize(QSize(capture->get(CV_CAP_PROP_FRAME_WIDTH), capture->get(CV_CAP_PROP_FRAME_HEIGHT)));

        //设置开始帧()
        long frameToStart = 0;
        capture->set(CV_CAP_PROP_POS_FRAMES, frameToStart);
        ui->textEdit_log->append(QString::fromUtf8("从第 %1 帧开始读").arg(frameToStart));

        //获取帧率
        double rate = capture->get(CV_CAP_PROP_FPS);
        ui->textEdit_log->append(QString::fromUtf8("帧率为: %1 ").arg(rate));
    }
}

void MainWindow::on_pushButton_StartDetect_clicked()
{
    timer->start();
    ui->pushButton_StartDetect->setEnabled(false);
    ui->pushButton_StopDetect->setEnabled(true);
}

void MainWindow::on_pushButton_StopDetect_clicked()
{
    ui->pushButton_StartDetect->setEnabled(true);
    ui->pushButton_StopDetect->setEnabled(false);
    timer->stop();
}

void MainWindow::on_pushButton_FlushDevice_clicked()
{

    QString xmlfilename = QFileDialog::getOpenFileName(this,"打开文件",".","*.xml");
    if(!QFile::exists(xmlfilename)){
        return;
    }
    ui->statusbar->showMessage(xmlfilename);
    if (!classifier->load(xmlfilename.toLatin1().data())) {
        ui->textEdit_log->append("fail to open classifier_path!");
        return;
    }
    IsDetect_ok +=1;
    ui->textEdit_log->append(QString::fromUtf8("Open xmlfile: %1 succesfully!").arg(xmlfilename));
    if (IsDetect_ok ==2)
        ui->pushButton_StartDetect->setEnabled(true);
}

演示效果

拓展阅读

直接在属性栏目搜索中设置(如下图),或者 pushbutton设置icon和文字

下面是pushbutton设置icon和文字的四种方法详解

1.使用系统自带api

    ui->pushButton->setIconSize(QSize(32,32));
    ui->pushButton->setIcon(QIcon(":/images/Setting.png"));
    ui->pushButton->setText(QString::fromLocal8Bit("系统设置"));
    ui->pushButton->setStyleSheet("QPushButton{border:1px solid blue;background:white;}"
                                  "QPushButton:hover{border:0px;background:blue;}"
                                  "QPushButton:pressed{border:0px;background:red;}");

无法设置icon和文字之间的距离。

2.如果想让icon显示在文字上方可使用QToolButton

ui->toolButton->setIconSize(QSize(32,32));
    ui->toolButton->setIcon(QIcon(":/images/Setting.png"));
    ui->toolButton->setText(QString::fromLocal8Bit("系统设置"));
    ui->toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);

3.在pushbutton上面使用label进行布局

 QLabel *iconLabel = new QLabel;
    QLabel *textLabel = new QLabel;
    iconLabel->setFixedSize(32,32);
    iconLabel->setStyleSheet("border:1px solid red;");
    textLabel->setStyleSheet("border:1px solid red;");
    iconLabel->setPixmap(QPixmap(":/images/Setting.png"));
    textLabel->setText(QString::fromLocal8Bit("系统设置"));
    textLabel->setFixedWidth(60);
    QHBoxLayout *myLayout = new QHBoxLayout();
    myLayout->addSpacing(10);
    myLayout->addWidget(iconLabel);
    myLayout->addSpacing(30);
    myLayout->addWidget(textLabel);
    myLayout->addStretch();
    ui->pushButton_2->setLayout(myLayout);
    ui->pushButton_2->setStyleSheet("QPushButton{border:1px solid blue;background:white;}"
                                  "QPushButton:hover{border:0px;background:blue;}"
                                  "QPushButton:pressed{border:0px;background:red;}");

4.使用图片,设置stylesheet即可

以上三种方法,需要设置,比较麻烦,最好还是找UI设计按钮图片,这样软件的适配性也比较好。 

到此这篇关于Qt+OpenCV实现目标检测详解的文章就介绍到这了,更多相关Qt OpenCV目标检测内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Qt+OpenCV实现目标检测详解

本文链接: https://www.lsjlt.com/news/141679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Qt+OpenCV实现目标检测详解
    目录一、创建项目&UI设计二、代码与演示演示效果拓展阅读一、创建项目&UI设计 创建项目,UI设计如下 文件类型判断 简单的判断文件类型 QString file(...
    99+
    2022-11-13
  • opencv-python+yolov3实现目标检测
    目录目标检测概况目标检测是?目标检测算法?yolov3模型简介性能介绍架构介绍opencv-python实现why opencv?正文因为最近的任务有用到目标检测,所以昨天晚...
    99+
    2022-11-12
  • opencv-python+yolov3怎么实现目标检测
    这篇文章给大家分享的是有关opencv-python+yolov3怎么实现目标检测的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。目标检测概况目标检测是?目标检测,粗略来说就是:输入图片/视频,经过处理,得到:目标...
    99+
    2023-06-15
  • python目标检测基于opencv实现目标追踪示例
    目录主要代码信息封装类更新utilspython-opencv3.0新增了一些比较有用的追踪器算法,这里根据官网示例写了一个追踪器类 程序只能运行在安装有opencv3.0以上版本和...
    99+
    2022-11-11
  • Python+OpenCV实现边缘检测与角点检测详解
    目录一、边缘检测1.1、读取图像1.2、图像转换成灰度图像1.3、Sobel算子1.4、Canny算子1.5、显示正常中文的标签1.6、边缘检测结果二、角点检测2.1、读取图像2.2...
    99+
    2023-02-03
    Python OpenCV边缘检测 Python OpenCV角点检测 Python OpenCV 检测
  • OpenCV目标检测Meanshif和Camshift算法解析
    目录学习目标MeanshiftOpenCV中的MeanshiftCamshiftOpenCV中的Camshift附加资源学习目标 在本章中,将学习用于跟踪视频中对象的Meanshif...
    99+
    2023-05-18
    OpenCV Meanshif Camshift 算法 OpenCV Meanshif Camshift
  • 基于深度学习和OpenCV实现目标检测
    目录使用深度学习和OpenCV进行目标检测MobileNets:高效(深度)神经网络使用OpenCV进行基于深度学习的对象检测使用OpenCV检测视频使用深度学习和 OpenCV 进...
    99+
    2022-11-12
  • OpenCV实现车辆识别和运动目标检测
    目录一:车辆识别成果展示二:车辆识别超详细步骤解析步骤一:灰度化处理 步骤二:帧差处理步骤三:二值化处理步骤四:图像降噪步骤五:提取关键点 框选运动目标检测三:车辆识别完整...
    99+
    2022-11-11
  • python利用opencv调用摄像头实现目标检测
    目录使用到的库实现思路实现代码2020/4/26更新:FPS计算FPS记录的原理FPS实现代码使用到的库 好多人都想了解一下如何对摄像头进行调用,然后进行目标检测,于是我做了这个小B...
    99+
    2022-11-11
  • Python OpenCV实现图形检测示例详解
    目录1. 轮廓识别与描绘1.1 cv2.findComtours()方法1.2 cv2.drawContours() 方法1.3 代码示例2. 轮廓拟合2.1 矩形包围框拟合 - c...
    99+
    2022-11-10
  • python目标检测yolo3详解预测及代码复现
    目录学习前言实现思路1、yolo3的预测思路(网络构建思路)2、利用先验框对网络的输出进行解码3、进行得分排序与非极大抑制筛选实现结果学习前言 对yolo2解析完了之后当然要讲讲yo...
    99+
    2022-11-11
  • python目标检测yolo2详解及预测代码复现
    目录前言实现思路1、yolo2的预测思路(网络构建思路)2、先验框的生成3、利用先验框对网络的输出进行解码4、进行得分排序与非极大抑制筛选实现结果前言 …&hellip...
    99+
    2022-11-11
  • YOLO v5 实现目标检测
    本文用于学习记录 文章目录 前言一、YOLO v5 环境配置1.1 安装 anaconda 与 pycharm1.2 创建虚拟环境1.3 进入 pytorch 环境1.4 安装 pyto...
    99+
    2023-08-31
    目标检测 python
  • C++ OpenCV标记点检测怎么实现
    这篇文章主要介绍“C++ OpenCV标记点检测怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++ OpenCV标记点检测怎么实现”文章能帮助大家解决问题。效果如下:导...
    99+
    2023-06-29
  • YOLOv7(目标检测)入门教程详解---检测,推理,训练
    目录 一.前言 二.yolov7源码下载 三.detect(检测) 四.Train(训练) 数据准备: labellmg: 配置训练的相关文件  配置数据集文件 正式训练: 推理: 推理效果: 五.总结 一.前言     上篇文章:Y...
    99+
    2023-08-31
    目标检测 深度学习 人工智能 python
  • C++OpenCV实战之标记点检测的实现
    在实际应用中,能够直接利用霍夫圆检测这些理想方法的应用场景是非常少的,更多的是利用拟合的办法去寻找圆形。 大致思路如下,首先先选择要处理的ROI部分,记录下该图的左上点在原图的坐标,...
    99+
    2022-11-13
  • 利用OpenCV实现YOLO对象检测方法详解
    目录前言什么是YOLO物体检测器?项目结构检测图像检测视频前言 本文将教你如何使用YOLOV3对象检测器、OpenCV和Python实现对图像和视频流的检测。用到的文件有yolov3...
    99+
    2022-11-12
  • 用PaddlePaddle实现目标检测任务
    PaddlePaddle是一个深度学习框架,可以用于实现目标检测任务。下面是一个使用PaddlePaddle实现目标检测任务的示例代...
    99+
    2023-09-20
    任务
  • Python实现视频目标检测与轨迹跟踪流程详解
    目录一、原理二、代码实现1.增加多模板匹配机制2.增加轨迹平滑三、测试对比一、原理 核心思想比较简单。即通过不同旋转角度的模板同时匹配,在多个结果中,找到相似度最大的结果,即认为匹配...
    99+
    2023-01-28
    Python视频目标检测 Python视频轨迹跟踪
  • 目标检测mAP的概念及公式详解
    目录学习前言什么是TP、TN、FP、FN什么是Precision和Recall什么是mAP1、步骤1:2、步骤2:3、步骤3:学习前言 在Github上我们可以看到许多模型,他们都有...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作