若该文为原创文章,转载请注明出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106647346

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

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

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

需求

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

原理

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

注意

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

涉及技术博文

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

Demo:激光射击游戏 v1.0.0

  
  
  
  
  
  

下载地址

  CSDN:https://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_OBJECTpublic: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;         // 总时间,默认60sint _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();}
}

若该文为原创文章,转载请注明出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/106647346

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

  1. OpenCV计算机视觉实战(Python)| 10、项目实战:文档扫描OCR识别

    文章目录 简介 总结 1. 介绍 2. 流程 3. 程序 4. 知识点总结 简介 本节为<OpenCV计算机视觉实战(Python)>版第10讲,项目实战:文档扫描OCR识别,的总结. 总 ...

  2. 深度学习项目实战(一):猫狗识别

    深度学习项目实战(一):猫狗识别 文章目录 深度学习项目实战(一):猫狗识别 项目背景: 数据读取: 网络架构 卷积神经网络训练 项目背景: 猫狗识别是卷积神经网络的入门实战案例,目的在于计算机可以识 ...

  3. 【北京大学】13 TensorFlow1.x的项目实战之手写英文体识别OCR技术

    目录 1 项目介绍 1.1 项目功能 1.2 评估指标 2 数据集介绍 2.1 数据特征 3 数据的预处理 3.1 数据增强 3.2 倾斜矫正 3.3 去横线 3.4 文本区域定位 4 网络结构 5 ...

  4. Qt + Opencv 实现的一个简单文字识别的demo

    Qt + Opencv 实现的一个简单文字识别的demo 很久没用Qt了,这两天结合Opencv整了一个简单文字识别的demo,太久没用了,很多东西都忘记了,中间碰到了几个不大不小的坑,最后都解决了, ...

  5. C语言项目实战:《打字母游戏》零基础项目丨183 行源代码示例

    这篇文章主要为大家详细介绍了C语言实现--<打字练习系统>,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下! 游戏介绍: <字母游戏>是一款敏捷打 ...

  6. QT项目实战之翻金币小游戏

    目录 一.实现效果 二.实现过程 1.创建项目.添加项目资源 2.创建主场景(mainscene.cpp/.h) 3.自定义开始按钮(mypushbutton.cpp/.h) 4.创建选择关卡场景(c ...

  7. OpenCV项目实战日志——检测文字并对比识别

    第一次写长博,记录一个项目.这几天一直在接小活,有一个是客户的要求是将目标图片上的文字(目测是好多器材上边的编号)检测出来,并对比,要求长字符串和长字符串相同,短字符串和短字符串相同,不一样的需要标识 ...

  8. opencv实战项目:基于opencv的车牌号码识别

    首先,呈上我自己根据代码写的步骤流程,方便记忆,字有点丑,哈哈哈!!! 好吧,图片看不清,那就上代码 import cv2 import imutils import numpy as np impo ...

  9. opencv图像处理—项目实战:文档扫描OCR识别

    目录 1.边缘检测 2.获取轮廓 3.变换 4.tesseract-OCR安装配置 5.使用pycharm运行检测 出现错误 1 出现错误2 出现错误3 出现问题4 完整代码 # 导入工具包 impo ...

  10. 【Python • 项目实战】pytesseract+pyqt实现图片识别软件小项目——(一)创建项目和画界面

    本文默认你已经学习了上一篇文章,如果你还没有学习,就赶快去学习吧.关注博主,学习更多内容. 文章目录 前言 一.创建项目 1. 从模板创建项目 2. 使用pycharm打开项目 3. 安装Pyqt5库 ...

最新文章

  1. php转java知乎_php程序员来谈谈php和java
  2. 帮你排雷Jmeter分布式性能测试那些坑
  3. 人在职场,干得好真的不如汇报得好?
  4. Java中date和calendar的用法
  5. centos出现磁盘坏掉,怎么修复和检测。
  6. java mysql 文本导入数据语句_Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL...
  7. 优化DOTTEXT之一:缓存配置项
  8. 太骚了!Python模型完美切换SAS,还能这么玩。。
  9. “出道” 5 年采用率达 78%,Kubernetes 的成功秘诀是什么?
  10. 导入开源的文件云存储平台-Seafile
  11. 箱线图怎么判断异常值_异常数值识别(检测)
  12. 72. Edit Distance
  13. VisualSVN Server 服务器资源目录
  14. IOS Apple Pay
  15. 题目1012:畅通工程(并查集)
  16. 快逸报表研究-冻结表头
  17. 粤语翻译软件开发_粤语翻译器 带发音-粤语翻译器 带发音免费软件app安卓v2.3下载-SLY软件园...
  18. Flutter Key的原理和使用(五) 需要key的实例:可拖动改变顺序的Listview
  19. MacOS Ventura 13.0 (22A380) 正式版带 OC 0.8.5 and winPE 双分区原版黑苹果镜像
  20. jQuery根据ID、CLASS、等获取对象

热门文章

  1. 码出高效,码出质量:阿里Java开发手册正式发布!
  2. Fast R-CNN算法
  3. iris数据集——决策树
  4. AD9361射频捷变收发器系列对比
  5. su灯光插件_su各种插件合集
  6. cad对计算机专业的用处,CAD软件的特点和用途
  7. Tomcat8安装即配置教程
  8. linux c编译 utf-8,在Linux C编程中使用Unicode和UTF-8
  9. spring boot+Quartz+数据库存储
  10. 实验九 哈希表的查找操作