项目实战:Qt+OpenCV激光射击游戏(识别激光、识别圆)

简介: 项目实战:Qt+OpenCV激光射击游戏(识别激光、识别圆)

Qt开发专栏:项目实战(点击传送门)

OpenCV开发专栏(点击传送门)


需求

  激光射击游戏,外设激光射击目标圆圈,计分游戏。


原理

  使用OpenCV打开摄像头,识别圆圈,识别激光,判断激光点是否在圆圈内。


注意

  需要摄像头,摄像头对准白色矩形区域,游戏钱需要先对摄像头进行手动校准,提供调整校准标定的功能,调整到圆圈和激光都可识别。


涉及技术博文

  项目实战:Qt+OpenCV操作摄像头拍照、调节参数和视频录制
  《OpenCV开发笔记(一):OpenCV介绍、编译
  《OpenCV开发笔记(五):OpenCV读取与操作摄像头
  《OpenCV开发笔记(七):OpenCV基础图形绘制
  《OpenCV开发笔记(十):OpenCV图像颜色通道分离和图像颜色多通道混合
  《OpenCV开发笔记(二十一):算法基础之形态学滤波-膨胀
  《OpenCV开发笔记(二十二):算法基础之形态学滤波-腐蚀
  《OpenCV开发笔记(二十八):带你学习图像识别之阈值化
  《OpenCV开发笔记(三十六):红胖子8分钟带你深入了解缩放与图像金字塔(图文并茂+浅显易懂+程序源码)
  《OpenCV开发笔记(五十三):红胖子8分钟带你深入了解模板匹配识别(图文并茂+浅显易懂+程序源码)


Demo:激光射击游戏 v1.0.0

  

  

  

  

  

  


下载地址

  CSDNhttps://download.csdn.net/download/qq21497936/12507420

  QQ群:1047134658(点击“文件”搜索“shootGame”,群内与博文同步更新所有可开源的源码模板)


核心代码

#ifndef SHOOTGAMEWIDGET_H
#define SHOOTGAMEWIDGET_H
#include <QWidget>
#include "OpenCVManager.h"
#include <QTimer>
#include <QThread>
namespace Ui {
class ShootGameWidget;
}
class ShootGameWidget : public QWidget
{
    Q_OBJECT
public:
    explicit ShootGameWidget(QWidget *parent = 0);
    ~ShootGameWidget();
protected slots:
    void slot_captureOneFrame(cv::Mat mat);
    bool slot_recognize(cv::Mat mat, bool show = false);
    void slot_timeOut();
private slots:
    void on_pushButton_start_clicked();
    void on_pushButton_out_clicked();
    void on_pushButton_startCameraTest_clicked();
    void on_pushButton_stopCameraTest_clicked();
    void on_pushButton_add1_clicked();
    void on_pushButton_dec1_clicked();
    void on_pushButton_add2_clicked();
    void on_pushButton_dec2_clicked();
    void on_pushButton_add3_clicked();
    void on_pushButton_dec3_clicked();
private:
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent *event);
private:
    Ui::ShootGameWidget *ui;
    OpenCVManager *_pOpenCVManager;
    QThread *_pOpenCVManagerThread;
    cv::Mat _srcMat;
    QImage _srcImage;
    int _r;
    int _penWidth;
    cv::Mat _circleMat;
    cv::Mat _dotMat;
    cv::Mat _dot2Mat;
    cv::Mat _dot3Mat;
    cv::Mat _dot4Mat;
    cv::Mat _dot5Mat;
    cv::Mat _dot6Mat;
    cv::Mat _dot7Mat;
    int _timerId;
    double _f;
    int _margin;
    int _count;
    int _totalTime;         // 总时间,默认60s
    int _currentTime;       // 当前时间
    bool _running;          // 是否游戏开始
    QPoint _centerPoint;    // 刷新圆圈的位置
    bool _hitFlag;          // 是否击中标志,每次刷新位置,设置false,判断是否第一次击中用于计分
    int _score;             // 得分
    QTimer *_pTimer;        // 定时器,定时减少秒数
    bool _result;           // 标记是否打完出结果
};
#endif // SHOOTGAMEWIDGET_H
void ShootGameWidget::on_pushButton_start_clicked()
{
    if(!_pOpenCVManager->startCapture(0, 800, 600))
    {
        QMessageBox::information(0, "错误", "检测摄像头失败");
        return;
    }
    ui->label_title->setVisible(false);
    ui->pushButton_start->setVisible(false);
    ui->pushButton_out->setVisible(false);
    ui->groupBox->setVisible(false);
    _hitFlag = false;
    _score = 0;
    _currentTime = _totalTime;
    _running = true;
    _result = false;
    _pTimer->start();
}
void ShootGameWidget::paintEvent(QPaintEvent *event)
{
    if(ui->pushButton_stopCameraTest->isEnabled() || _running)
    {
        QPainter painter(this);
        painter.fillRect(rect(), Qt::black);
        painter.setPen(QPen(Qt::white, 1));
        painter.drawRect(_margin,
                         _margin,
                         rect().width() - _margin * 2,
                         rect().height() - _margin * 2);
        QPen pen = painter.pen();
        pen.setWidth(10);
        pen.setColor(Qt::green);
        painter.setPen(pen);
        painter.drawEllipse(_centerPoint, _r/2, _r/2);
//        painter.setPen(QPen(Qt::red, 10));
//        painter.drawPoint(_centerPoint);
        if(_running)
        {
            painter.setPen(QPen(Qt::white, 1));
            painter.drawText(300, 50, QString("得分: %1").arg(_score));
            painter.drawText(500, 50, QString("倒计时: %1").arg(_currentTime));
            if(_hitFlag)
            {
                painter.drawText(700, 50, QString("已击中"));
            }else{
                painter.drawText(700, 50, QString("未击中"));
            }
        }
    }
    if(_result)
    {
        QPainter painter(this);
        painter.setPen(QPen(Qt::black, 4));
        QFont font = painter.font();
        font.setPixelSize(64);
        painter.setFont(font);
        painter.drawText(rect(), Qt::AlignCenter, QString("游戏结束,您的得分为 %1 !!!").arg(_score));
    }
}
void ShootGameWidget::slot_timeOut()
{
    if(_running)
    {
        _currentTime--;
        if(_currentTime == 0)
        {
            if(!_pOpenCVManager->stopCapture())
            {
            }
            ui->label_title->setVisible(true);
            ui->pushButton_start->setVisible(true);
            ui->pushButton_out->setVisible(true);
            ui->groupBox->setVisible(true);
            _hitFlag = false;
            _currentTime = _totalTime;
            _running = false;
            _pTimer->stop();
            _result = true;
        }
        update();
    }
}



相关文章
|
3月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
126 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
3月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
161 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
5月前
|
计算机视觉 Python
opencv识别颜色
opencv识别颜色
|
3月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
48 10
|
3月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
4月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
636 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
4月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
92 1
|
5月前
|
机器学习/深度学习 数据采集 算法
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
382 19
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
202 1
|
6月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
83 1