各模块的基本实现——1. 在Qt界面上显示树莓派摄像头捕获到的图像

本专题导航,Click Me

文章目录

  • 各模块的基本实现——1. 在Qt界面上显示树莓派摄像头捕获到的图像
  • 一些废话
  • 一、思路
  • 二、代码
  • 三、现象
  • 总结

一些废话

我——一个很久之前做过嵌入式程序开发现在逐渐变为MATLAB玩家的小菜鸡。
前一段时间发现竟然连全局变量怎么声明都快忘记了,瞬间陷入焦躁不安忧虑难过中…
遂赶紧开始码代码并刷一波C++语法书安慰一下自己。
一个小功能实现之后,感觉回了一点血,记忆仿佛又回来了ヾ(◍°∇°◍)ノ゙~

这篇文章用一个小demo实现摄像头模块的驱动,即在Qt界面上显示树莓派摄像头捕获到的图像,具备一些基本的人机交互功能。
因为在第一章中我们已经完成了交叉编译环境的配置,后面的程序开发均是在PC端的Ubuntu18.04环境下,并将可执行文件放在树莓派上执行。

一、思路

demo的功能和实现的基本思路见下图。

二、代码

Show You My Code~主要是3个文件mainwindow.h,main.cpp和mainwindow.cpp
mainwindow.ui中的操作比较简单,不再赘述。

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QLabel>
#include <QObject>
#include <QToolBar>
#include <QAction>
#include <QTimer>#include <opencv2/opencv.hpp>
#include <iostream>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTprivate:QToolBar *cameraTool;QAction *actStartCamera;QAction *actStopCamera;QAction *actImageCapture;cv::VideoCapture g_cap;QTimer *timer;cv::Mat frame;QImage frameCap;bool frameCaptureFlag = false;void initTimer();void initCamera();void createToolBars();void createActions();public:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void slot_actStartCamera_triggered();void slot_actStopCamera_triggered();void slot_actCapture_triggered();void slot_timer_timeout();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"using namespace std;
using namespace cv;MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);createActions();    //初始化ActionscreateToolBars();    //初始化工具条initTimer();    //初始化定时器initCamera();    //初始化摄像头
}MainWindow::~MainWindow()
{delete ui;
}/**************************************函数名称:MainWindow::createActions函数功能:初始化Actions入口参数:无出口参数:无
**************************************/
void MainWindow::createActions()
{//actStartCamera = new QAction(QIcon("startcamera.jpg"), tr("开启摄像头"), this);actStartCamera = new QAction(tr("开启摄像头"), this);actStartCamera->setEnabled(true);connect(actStartCamera, SIGNAL(triggered()), this, SLOT(slot_actStartCamera_triggered()));actStopCamera = new QAction(tr("关闭摄像头"), this);actStopCamera->setEnabled(false);connect(actStopCamera, SIGNAL(triggered()), this, SLOT(slot_actStopCamera_triggered()));actImageCapture = new QAction(tr("抓取图片"), this);actImageCapture->setEnabled(false);connect(actImageCapture, SIGNAL(triggered()), this, SLOT(slot_actCapture_triggered()));
}/**************************************函数名称:MainWindow::createToolBars函数功能:初始化工具条入口参数:无出口参数:无
**************************************/
void MainWindow::createToolBars()
{cameraTool = addToolBar("camera");    //新建工具条cameraTool->addAction(actStartCamera);cameraTool->addAction(actStopCamera);cameraTool->addAction(actImageCapture);
}/**************************************函数名称:MainWindow::initCamera函数功能:初始化摄像头设备入口参数:无出口参数:无
**************************************/
void MainWindow::initCamera()
{int deviceID = 0;int apiID = cv::CAP_ANY;g_cap.open(deviceID, apiID);if (!g_cap.isOpened()){cerr << "ERROR! Unable to open camera.\n";}cout << "Camera opened." << endl;
}/**************************************函数名称:MainWindow::initTimer函数功能:初始化定时器入口参数:无出口参数:无
**************************************/
void MainWindow::initTimer()
{timer = new QTimer(this);timer->stop();connect(timer, SIGNAL(timeout()), this, SLOT(slot_timer_timeout()));
}/**************************************函数名称:MainWindow::slot_actStartCamera_triggered函数功能:“开启摄像头”按钮触发的槽函数.入口参数:无出口参数:无
**************************************/
void MainWindow::slot_actStartCamera_triggered()
{if(timer->isActive() == false){timer->start(5);    //开启定时器cout << "Timer opened." << endl;actStartCamera->setEnabled(false);actStopCamera->setEnabled(true);actImageCapture->setEnabled(true);}
}/**************************************函数名称:MainWindow::slot_actStopCamera_triggered函数功能:“关闭摄像头”按钮触发的槽函数.入口参数:无出口参数:无
**************************************/
void MainWindow::slot_actStopCamera_triggered()
{if(timer->isActive() == true){timer->stop();    //关闭定时器actStartCamera->setEnabled(true);actStopCamera->setEnabled(false);actImageCapture->setEnabled(false);}
}/**************************************函数名称:MainWindow::slot_timer_timeout函数功能:定时器溢出触发的槽函数.入口参数:无出口参数:无
**************************************/
void MainWindow::slot_timer_timeout()
{g_cap.read(frame);//cout << "Timer slot executed." << endl;if(frame.empty()){cerr << "ERROR! blank frame grabbed!" << endl;}cvtColor(frame, frame, COLOR_BGR2RGB);QImage qframe = QImage((const unsigned char*)(frame.data), frame.cols, frame.rows, frame.step, QImage::Format_RGB888);ui->viewFinder->setPixmap(QPixmap::fromImage(qframe));ui->viewFinder->resize(qframe.size());ui->viewFinder->show();if(frameCaptureFlag == true){frameCaptureFlag = false;frameCap = qframe;ui->frameCaptured->setPixmap(QPixmap::fromImage(frameCap));ui->frameCaptured->resize(frameCap.size());ui->frameCaptured->show();}
}/**************************************函数名称:MainWindow::on_cameraStateChanged函数功能:“抓取图像”按钮触发的槽函数.入口参数:无出口参数:无
**************************************/
void MainWindow::slot_actCapture_triggered()
{frameCaptureFlag = true;
}

三、现象

现象如下图(不要在意我拍了个什么鬼东西,毕竟是测试,有图就行 ( ̄▽ ̄) )。

总结

✿✿ヽ(°▽°)ノ✿

二、各模块的基本实现——1. 在Qt界面上显示树莓派摄像头捕获到的图像相关推荐

  1. Nodejs学习笔记(二)——模块

    [目录] Nodejs学习笔记(一)--基础之全局对象.包和npm Nodejs学习笔记(三)--同步和与异步之文件系统模块 Nodejs学习笔记(四)--http协议与服务器 Nodejs学习笔记( ...

  2. 纯手工搭建k8s集群-(二)核心模块部署

    1. 部署ETCD(主节点) 1.1 简介 kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等.都需 ...

  3. 关于IMX6平台停产RL-UM02WBS-8723VAU蓝牙WiFi二合一模块升级替换参考指导

    RL-UM02WBS-8723VAU前期在IMX6平台上得到了广泛集成应用,是采用RTL8723AS-VAU开发设计的一款高性能2.4G单频单通道USB接口的蓝牙WiFi二合一模块,有USB+PCM接 ...

  4. JAVA9模块化详解(二)——模块的使用

    JAVA9模块化详解(二)--模块的使用 二.模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中.为了提供可靠的配置和强健的封装性,在分块的模块系统中利用他们,必须确定 ...

  5. 安卓手机与蓝牙模块联合调试(二)—— 单片机蓝牙控制LED灯亮灭(上)

    系列博文: (1)安卓手机与蓝牙模块联合调试(一)--蓝牙模块的串口通讯 (2)安卓手机与蓝牙模块联合调试(二)-- 单片机蓝牙控制LED灯亮灭(上) (3)安卓手机与蓝牙模块联合调试(三)-- 单片 ...

  6. MXT903A 北斗、GPS亚米级导航定位二合一模块的应用

    MXT903A 北斗.GPS亚米级导航定位二合一模块的应用 武汉梦芯科技有限公司设计生产的 MXT903A BDSGPS 双系统亚米级导航定位模块,集成BDS.GPS,导航精度达到亚米级(1米以内). ...

  7. (备注)win10下wifi和蓝牙二合一模块网络冲突问题

    做个备忘录 1.问题来由 这次的问题来自自组笔记本时买的wifi和蓝牙二合一模块. 为了让工作了6.7年的电脑重获新生,萌生自己升级的想法,主板,cpu,内存,固态都更新了一遍,均没有出现问题,表现良 ...

  8. 信驰达推出RTL8720DN系列2.4G和5G双频Wi-Fi+蓝牙二合一模块

    近日,领先的无线物联网通信模块厂商深圳信驰达科技RF-star推出了基于RTL8720DN SoC的2.4 GHz和5 GHz双频Wi-Fi蓝牙二合一模块-RF-WM-20DNB1. 图 1信驰达RF ...

  9. Python数据结构与算法(二)--timeit模块

    Python内置性能分析,timeit模块 timeit模块可以用来测试一小段Python代码的执行速度. class timeit.Timer(stmt='pass', setup='pass', ...

最新文章

  1. ExtAspNet应用技巧(三) - 302与Asp.Net Ajax
  2. Python3之set, frozenset记录
  3. jQuery的效果方法
  4. 自然语言处理美国政客的社交媒体消息分类
  5. 转发:php解决高并发
  6. python schedule运行了一遍说没有任务_python-schedule模块(定时任务)基于官方文档总结...
  7. 华为5G英国首秀,BBC主持人震惊了!到底网速有多快?
  8. 语义Web的一些概念和资源
  9. springboot项目打成可依赖jar包_用IDEA把SpringBoot项目打成jar发布项目
  10. 《Advanced .NET Debugging》 读书笔记 Listing 3-6: 使用sxe在程序载入mscorwks之后停下来载入sos...
  11. 淘宝新手开店可掌握的爆款核心思路
  12. 李飞飞CS231n课程-中文笔记(包括课后作业要求)翻译汇总
  13. Google Indexing API 推送 (避免踩坑)
  14. 2018“人工智能”:是彻底复苏?还是起落轮回?| 抢票
  15. 相较国外代码托管平台 gitlab,咱们中国自己的代码托管平台有哪些优势?
  16. 去年写的代码大全笔记(其实是摘记)
  17. 结绳编程【按钮事件】
  18. Activiti进阶(一)——HelloWorld
  19. 使用 Vanilla JavaScript 构建自定义 SPA 路由器
  20. php为什么不火了,PHP100和PHPchina现在怎么样了?感觉不火了、没落了?

热门文章

  1. 设置iframe标签的大小
  2. @JsonFormat 24小时
  3. 转载 天涯[经济杂谈]一位创业者的商海感悟(语录版,连载中,持续更新)【力荐】
  4. win10系统如何取消管理员密码?
  5. 新建maven项目pom报错
  6. 精度不够,滑动时间来凑「限流算法第二把法器:滑动时间窗口算法」- 第301篇
  7. Nginx项目部署:新域名、二级目录、不同端口
  8. nginx配置二级目录访问tomcat
  9. Surface Laptop安装双系统(原Win10+CentOS 7)
  10. 在linux下离线安装MySQL