system: [SYSTEM]

user: 3. 项目设计及实现 3.1. 系统整体框图 仰卧起坐动作训练系统整体的功能被划分为五块，分别是登录注册、教程提示、个人管理、检测判断和用户交流模块。其中核心的模块是检测判断，主要是使用摄像头或者直接输入视频信息来对用户的仰卧起坐动作进行检测并为个人管理模块中的动作统计提供数据来源。个人管理模块主要为用户展示检测判断结果和对用户自己的运动情况进行备忘等。登录注册、教程提示与用户交流模块属于为用户提供额外的功能，丰富了该系统中用户可以使用功能。系统的整体框图如图1所示。 图1. 系统整体框图 3.2. 登录注册模块的设计与实现 1) 界面设计说明 本系统的登录界面元素主要为Lineditor_ID输入框，Lineditor_password输入框，注册按钮还有基础的页面容器。当用户没有已经申请的账号可以使用，则必须点击Signup注册按钮进行下一步。点击Signpushbutton后，会显示输入具体信息的Widget容器。这个页面元素主要为Linedit_name输入框、Comox_sex选择框、Linedit_age输入框、Linedit_phone输入框、Linedit_password输入框、Sign_up按钮、Cacel按钮和基础的页面容器。 2) 算法设计 该模块没有使用特殊的算法，登录即读取用户输入，进行正则判断后插入数据库，注册稍有不同，首先是要从注册界面的文本框中得到要插入数据库的个人信息，进行正则判断后无异常后，随机生成六位随机数作为账号，然后将获取的用户个人信息作为参数，传入数据库工具类提供的函数对用户信息进行保存操作，并在函数的最后要将用Random函数生成的6位随机数返回给用户的前台，提醒用户记住自己这个独一无二的账号。有了它，用户才能登录系统，体验更多的功能。 3) 方法类说明 登录时使用的主要有以下的类及方法。View_login类说明，功能是定义登录界面的元素布局与样式，主要方法有InitUI方法，初始化界面的UI (User Interface，用户界面)设计布局；Set_palette方法，设置背景图。注册时使用的主要有以下的类及方法。Signup类说明，功能是定义注册界面的元素布局与样式；其中主要方法有btnFunc方法，启动进度条线程；Signal_accept方法，传入参数插入数据库并反馈消息。MySign_upThread类说明，这个类是自己Qt库线程类，自定义的线程类，为了进行异步显示进度条；主要方法为Run方法，启动后，进度条会随着时间进行变化，将等待插入的过程可视化，增强了用户的交互感。 4) 处理流程图 登录注册模块处理流程如图2所示。 图2. 登录注册模块流程图 3.3. 教程及提示模块的设计与实现 1) 界面设计说明 登录界面如图3教程主界面所示，页面容器，展示图片滚动播放的label，可以进行区域滚动的滑动块，以及可以进行其他功能选项的按钮和输入框，还有可以允许用户播放视频的按钮，可以供用户进行网页访问的超链接标签选项。 2) 算法设计 本模块主要是用的算法是从数据库中读取对应的教程资源，并将其展示在系统UI上供用户阅读。对于网络资源的恶处理，则是预先加载Web引擎，当用户点击超链接标签时，为用户打开网页资源，浏览网上的资源。 3) 方法类说明 点击超链接时使用的主要有以下的类及方法。WebFunc类方法说明，功能是为用户打开超链接，加载Web资源；主要方法有openUrl方法，传入URL，通过实例化的QWebEngineView打开网页资源。展示教程时使用的主要有以下类和方法。Search类方法说明，功能是将文字教程展示在系统UI界面上，主要方法为InitSearch方法，查询数据库中的教程信息，通过循环的方法将对应的信息显示在UI界面上。 图3. 教程主界面 3.4. 个人管理模块的设计与实现 1) 界面设计说明 该模块页面的主要元素有页面容器，选择查询城市的下拉框，展示查询天气结果的文本展示区，展示系统给出的贴士文本展示区，根据不同天气展示不同图片的标签，可以允许用户进行备忘录插入更新的选项按钮，展示备忘录的行展示区域。展示用户个人信息的标签以及可以修改个人信息的按钮。 2) 算法设计 当用户进行备忘录操作时，用户先进行输入，系统打开外部文件，并判断是否可写，若可写则进行行写入操作，如不可写则抛出异常。当用户进行个人信息修改时，先将修改后的对应的个人信息与数据库中的进行对比，若无变动则不修改，若有变动则使用update语句对数据库中的数据进行修改。 3.5. 检测判断模块的设计与实现 1) 界面设计说明 用户想要进行特征检测时使用界面的主要元素有页面容器，供用户进行灰度显示或者彩色显示的单选框，在彩色显示的情况下可以运行用户进行色彩空间的滑动条和调整框选项，进行亮度和对比度调整的滑动条，进行系统提供的运动录像保存路径的行编辑区域，进行保存路径选择的File选项按钮。展示帧率，图像尺寸的LED数字框，展示当前摄像头运行情况的文字框。以及一些进行摄像头操作的选项按钮。检测的界面如图4所示。 2) 算法设计 图4. 检测的界面 目前行为识别方法比较主流的是动作识别。动作识别即通过对动作特征的提取和对提取特征所组成的特征集进行分类来完成无先验经验情景下对一般动作的识别和匹配，这样一个行为识别系统即由行为特征提取和分类器两个子模块组成。 通过对训练数据进行特征提取，采用有监督或无监督条件对卷积神经网络进行训练即可得到一个可对新入数据进行特征提取和分类的AI (Artificial Intelligence，人工智能)。本系统的动作识别系统便是基于这一思想设计开发。 在本系统的使用场景中，对仰卧起坐的识别通常不存在背景动态或视角的变化，几乎没有人与人、人与背景的相互遮挡，姿态范围也相对有限，因此选择采用TensorFlow框架进行人体全局特征的提取并连通人体的关节点，再对由连通的关节点形成的骨架图进行跟踪和识别。 实际技术实现中，本系统将用户上传或摄像头获取的视频流以40帧的帧率保存至video文件夹下，然后调用卷积神经网络 [ 3 ] 逐帧进行处理，将得到的单个输入深度图像分割为部分置信图集和矢量场 [ 4 ]，然后使用偶匹配处理这些被提取的特征，从而确定部位之间的关联，最后进行关键特征点空间位置的计算，得到动作的估计数量。 3) 方法类说明 PoseEstimationFunc类说明。主要的功能是根据摄像头输入的视频流信息提取人体关键点。主要方法为Skele方法，在其上绘出人体关键点，连接起来返回给主函数，调用disp方法显示在本系统的用户界面。TestPoseNet类 [ 5 ] 说明。主要功能是根据直接输入的视频流信息进行处理并把处理的每一帧以40帧的帧率保存到本项目的Video文件夹中。主要方法为process方法，根据传进来的视频保存路径使用OpenCV进行读取视频帧，读取模型进行关键点预测，再根据得到的人体关键点对进行空间上位置的计算，判断动作个数后保存进数据库中。 4) 处理流程图 检测判断模块的检测判断流程如图5所示。 图5. 检测判断流程图 3.6. 用户交流模块的设计与实现 1) 界面设计说明 该模块页面主要的元素有页面容器，展示用户动态的ListView页面容器，用户可以在这个页面容器里面查看本人和他人的动态消息，还有展示所有运动用户运动数据排行榜的tablewidget，系统进行多表查询，将得到的排序后的运动结果返回给前台进行显示，用户还可以点击lable代表的新建选项，用户点击后，可以发布当前想要分享的动态，可以是运动新获取的，也可以是随意的内容，数据库会记录下来发送的内容和发送时间，并在列表视图中显示出来，实现用户交流的效果。 2) 算法设计 用户输入文字信息，并尝试写入数据库，在工具类中的操作数据语句能够正常接收文字参数后使用insert函数插入数据库。当想要展示给用户数据库中储存的动态，即使用select函数选择数据库中的数据并在动态的UI界面进行展示。 3) 方法类说明 SQLTooL类说明。主要的功能是更新或查询用户数据。用户动态展示主要方法为querydisscuss，查询动态表中所有用户索引对应的消息内容，并将查询得到的结果转换为列表返回给前台。用户动态的发布主要方法为insertdisscuss，将用户输入的文字信息作为参数传入工具类方法，并插入数据库，完成发布动态。 3.7. 数据库设计 数据库的ER图(Entity Relationship Diagram，实体–联系图)如图6所示。将该系统中主要使用的user_ifm表、user_affairs表、user_discuss表和user_situpcount表之间的关系表现出来，这几张表主要是通过user_ifm的主键user_code作为索引相互关联，尽量避免了多个表储存相同的运动信息而造成的冗余。比较好的将各个表储存的信息进行分类，有利于后续的多表查询和更新操作。 图6. ER图