大眼萌安防监控系统

目录

项目描述

项目内容

整体软件功能模块图

主线程描述及流程框图

子线程描述及流程框图


项目描述

   利用QT实现安防监控的效果;

项目内容

   利用mjpg-streamer作服务端,通过超级终端MobaXterm实现ARM开发板移植Linux系统,链接摄像头获取视频数据,并进行远程拍照,通过QT客户端上不同的按钮去调用不同的槽函数实现监控、截图拍照、显示视频帧率、录制及暂停\继续录制监控视频、结束录制将其保存在本地、缩放等效果。

整体软件功能模块图

大眼萌安防监控系统_第1张图片

 

   Qt是用 C++开发的,能在多个操作系统下进行应用开发,这是一个面向对象的开发框架。Qt的最特殊之处是它的“sign-and-slot”,它为对象之间的通信提供了一种新的通信方式,它可以取代诸如回调、消息映射等传统的通信方式。编程者先创建一个槽函数,再通过 connect功能,将该插槽功能与一个信号相联结,这样就完成了事件与它相应的编码之间的连通。signal和slot函数并不需要对两个类都有更详细的了解,相同目标的信号可能与多个不同的插槽功能相关联,同样的插槽功能还可以连接多个信号,这使得开发具有高代码复用性的类变得相对容易。本设计采用多线程技术进行设计,首先用图形设计[23]来创建一个接口的主视窗,将主窗口作为一条用来显示视频图象的主线程来设计;视而频率数据的接收,就是能够按照网络协议接收图像数据的次线程,在每次接收图像时,将数据传送到主程序,即可绘制出画面。

   该项目基于 Qt 框架的摄像头客户端应用程序,包括了两个类:subWindow 类和 MainWindow 类。其中 subWindow 类是登录窗口,用户必须将端口号码和 IP地址输入此窗口进行连接;MainWindow 类是主窗口,用于显示摄像头捕获的视频流,并提供了一些功能按钮,如开始、暂停、恢复、停止录制视频、截图等。

   在 main.cpp 中,创建了 QApplication 类的对象 a 和 subWindow 类的对象 sub,并显示 subWindow 窗口,然后进入 Qt 事件循环。在 subWindow 类中,创建了一个 QTcpSocket 类的对象 tcPClient 和一个 QTimer 类的对象 timer,在用户点击登录按钮时,使用 tcPClient 连接指定的 IP 地址和端口号,并启动一个定时器 timer,每 100 毫秒调用一次 timerFinish 函数,检查 tcPClient 的状态是否为已连接状态,如果是,则停止定时器,关闭当前窗口,并打开一个 MainWindow 类的对象 Main;否则,会更新按钮的文本以表示等待状态,并在等待时间超过 5 秒后停止定时器,并弹出一个警告消息框。在 MainWindow 类中,创建了一个 QNetworkAccessManager 类的对象 manager、一个 QNetworkReply 类的指针对象 reply、一个 QNetworkRequest 类的指针对象 request一个 QTimer 类的指针对象 frameRateTimer 和一个 cv::VideoWriter 类的对象 videoWriter。在 init 函数中,初始化了 manager、request、label 和窗口标题,并将 isRecording、isPaused、frameRate 和 frameCount 初始化为 false、false、0.0 和 0。在 startclicked 函数中,创建了一个 QUrl 对象 url,并使用 manager 发送了一个 GET 请求,然后启动了一个定时器 frameRateTimer 每秒更新一次视频帧率。在 mjpeg_streamer_reply 函数中,从 reply 中读取数据,并将其转换为 QPixmap 对象 pixmap,然后在标签 label 上显示该图像,并更新视频帧率。如果正在录制视频且未暂停,则将 QPixmap 对象转换为 cv::Mat 对象 frame,然后将帧写入视频文件。在 snapshotclicked 函数中,使用当前日期和时间生成一个文件名,并将标签 label 上的图像保存为 JPEG 格式的文件。在 recordclicked 函数中,打开一个 AVI 格式的视频文件并开始录制视频。在 pause_resume_record 函数中,可以暂停和恢复录制视频。在 stoprecordclicked 函数中,关闭视频文件并停止录制视频。在 exitclicked 函数中,关闭当前窗口。客户端采用了基于Qt框架和OpenCV库的方案,具有较高的可扩展性和灵活性。同时,应用程序的功能完善,包括实时视频流显示、录制视频、保存快照等多种功能,提高了用户体验。此外,该应用程序还使用了多线程技术,主线程负责UI界面和视频流的显示,子线程负责与IP摄像头建立连接并获取视频流数据,有效避免了UI界面卡顿和视频流卡顿等问题,提高了应用程序的稳定性和响应速度。在错误处理方面,该应用程序对用户输入的IP地址和端口号进行了检查,如出现错误会弹出警告框提示用户重新输入。在录制视频过程中,也会对录制状态进行检查,防止出现异常情况。此外,该应用程序代码结构清晰,函数命名规范,注释详细,易于理解和维护。同时,该应用程序还采用了面向对象的设计思想,将不同的功能模块分开实现,提高了代码的可重用性和可扩展性。

主线程描述及流程框图

大眼萌安防监控系统_第2张图片

   主线程主要写如何使用Qt和OpenCV收听IP摄像机的视频流,并捕获快照和录制视频。主窗口包含一个标签来显示视频流,一组按钮来控制快照和录制功能以及显示视频帧率的标签。在主窗口的构造函数中初始化UI和连接QPushButton接口和槽。在init()函数中初始化QNetworkRequest和QNetworkAccessManager对象。在startclicked()函数中,发送HTTP请求从IP摄像机收听直播流,定期更新视频帧率和更新QLabel上的 pixmap。在snapshotclicked()函数中,保存QLabel上的pixmap作为JPG文件。在recordclicked()函数中,打开一个avi视频文件并开始录制视频。在pause_resume_record()函数中,当用户单击此按钮时,暂停录制或继续录制视频。在stoprecordclicked()函数中,停止视频录制并关闭文件。最后,exitclicked()函数处理退出请求。此代码需要OpenCV和Qt的支持。

   OpenCV是一种跨平台的电脑视觉库,它为电脑视觉系统的开发,图像处理等提供了大量的工具与功能。具体来说,在此代码中,使用OpenCV库实现了录制视频的功能,具体用到了VideoWriter类和相关函数:

   VideoWriter用于打开、写入并保存视频。在此代码中使用了该类创建VideoWriter对象,同时使用其open()方法打开视频文件,write()方法写入每一帧视频,并使用release()方法释放对象所占用的资源;fourcc()是一种在视频编码器中使用的四字符编码。将字符串'TMP4'(Mp4v)转换为对应的四字符编码用于编码视频。在此代码中,使用该函数创建了视频编码器;CAP_PROP_POS_FRAMES函数用于获取或设置视频文件中的帧的位置。使用该函数将视频录制暂停后的位置设置为当前帧的位置。总之,通过使用OpenCV库,代码实现了视频录制等计算机视觉功能,为界面增加了更多的交互性和用户体验。

子线程描述及流程框图

大眼萌安防监控系统_第3张图片

 

   子线程实现了一个登录窗口的功能。在窗口中,用户可以输入IP地址和端口号,并通过点击“登录”按钮尝试连接到指定的服务端。如果连接成功,窗口将会关闭,一个主窗口会被创建并显示。主窗口将会使用用户提供的IP地址和端口号来连接服务端,并开始通信。如果连接失败,登录窗口会显示一个警告框,提示用户检查参数并重试。在等待连接的过程中,登录按钮的标签会显示一个定时器计数器,以指示连接的尝试次数。此外,本代码文件还声明了一个名为subWindow的类,并使用了 Qt框架提供的一些GUI组件,例如QLineEdit和QButton。子线程可以避免UI界面卡顿和视频流卡顿等问题,提高了应用程序的稳定性和响应速度。因为子线程负责与IP摄像头建立连接并获取视频流数据,主线程则负责UI界面和视频流的显示。这种分离的设计模式可以使得不同的任务在各自的线程中独立运行,从而避免了互相阻塞的情况。其次,子线程的设计可以降低应用程序的复杂度和耦合度。通过将不同的任务分配给不同的线程,在保证任务完成的前提下,可以减少不同任务之间的依赖关系,从而减少应用程序的耦合度,提高代码的可维护性。此外,子线程的设计还可以提高应用程序的可扩展性。因为子线程的功能模块相对独立,可以方便地添加或删除不同的功能模块,从而满足不同用户的需求。

你可能感兴趣的:(一些课设和毕设,课程设计,arm开发,c++,开发语言,qt,linux,服务器)