多功能聊天室 第二次迭代计划总结
项目进展概要
已实现基础的聊天功能,服务器数据库的搭建,以及人脸识别的检测和比对,正在实现头像设置,并且不断更新和优化界面。
团队分工
成员 | 任务 |
---|---|
王筱琦 | 多人聊天完善,服务器数据库搭建 |
魏镜浩 | 头像设置功能 |
徐德叙 | 界面更新 |
高迪 | 人脸识别 |
基本聊天功能、登陆预注册功能
实现人员:王筱琦
进度:
-
云服务器配置完毕,安装的是基于CentOS
7.3的64位操作系统应用镜像,使用BT面板进行管理。服务器IP:47.101.152.44,域名versatilechat.fun(等待审核中)。 -
基本聊天功能的命令行版本已完成,用户可以指定一个用户发送消息,也可以广播消息。例如下图中Hermione和Ron分别指定了给Ron和Draco发送消息,而Draco进行了广播消息。
-
使用MySQL的账户密码注册功能命令行版本已完成,用户将注册信息发送给服务器,由服务器进行两次输入密码的一致性比对以及数据库中用户名的查重。仅当两次密码一致且用户名未被占用时服务器将新用户信息写入数据库中的UserInfo表,并反馈注册成功的信息。
- 使用MySQL的账户密码登陆功能命令行版本已完成,用户发送登陆信息后,由服务器在数据库中根据收到的用户名进行查找:若查找结果为空则提示用户名不存在;若密码与数据库中存储的不一致则提示密码错误;若当前用户已在线则提示已被登陆。
待解决的问题及计划:
-
负责处理用户请求的server.c放在本机跑的时候功能正常,当放到云服务器上跑的时候,client.c虽然可以连接成功,但是在发送第一个包后或者第二个包后会报错signal
13后终止,查到signal 13是进程间通信时可能遇到的问题,意思是Broken pipe: write to pipe with no readers,可是还没有找到有效的解决办法。服务器上该配的库也都配好了,不知道是哪里和本机不一样。希望尽快解决signal 13问题,使得当server.c在云服务器上跑时程序也能正常运行。 -
虽然用户信息是存在数据库里的,但是登陆时检测是否已经在线的功能目前是通过一个朴素的存放在线用户信息的结构体数组完成的,这就导致可同时在线的用户数量受到限制。看看能不能找到更好的实现方法。
-
试试实现聊天记录的存储及查看功能,包括发送接受消息的时间、用户及内容。
-
第二阶段主要是分工进行,接下来将需要更多的组内协作来完成功能的对接整合,从而完成一个较为完整的多功能聊天室课程项目。
二、界面更新
实现人员:徐德叙
总结
客户端代码:https://github.com/Diego369/chatroom-GUI
- 在qt中简单的实现了登录和注册界面,同时在布局中留出一定的空白,供可能要增加的功能使用。UI设计界面如下
2. 目前的效果图如下,登陆界面:
同时修改了客户端的入口界面,从原来的直接看到聊天窗口改为了新增的登录界面。登录成功后才显示聊天界面。这一部分基本完成,github中已更新。
-
注册界面:
-
聊天消息窗口设计
目前有初步构思和尝试。因为用qt实现,总的容器应为Scroll Area,当消息过多时可滚动显示。为单独的一条消息构造一个widget的派生类,widget一部分显示发送消息的人的信息,如头像、昵称等;一部分显示消息内容。消息内容可能为图片、文字等,所以这一部分的容器可能不同。消息内容确定后,这一条消息的高度应该也能确定,从而便于在Scroll Area中布局。同时这个Scroll Area也应该会被继承后再使用,显示(添加)一条新的消息等功能会在Scroll Area的派生类中实现。这部分的实现还在进行中,暂时未更新到主项目代码中。
欲实现如下图效果:
-
界面美化
目前界面美观方面最大的问题是不同容器或控件间都有间隙,有的间隙会影响美观。尝试修改容器或控件的布局策略为可扩展或者对布局setContentsMargins都没有明显的效果。目前暂时决定调整大部分容器的背景颜色为同一种颜色,部分容器设置不同的背景颜色或背景图案,上面的登陆界面和注册界面便是将大部分容器的背景色统一,小部分设置图片从而不显得过于简陋。目前美化方面主要注重技术上的小困难和不断构思并选择更好的UI设计风格。对图片的选择、背景色调的控制暂时不太过关注,这一部分待以后程序完成度更高时再去优化。
三、头像设置
实现人员:魏镜浩
总结
图片在数据库中可以以BLOB类型存储,即大规模二进制流,但这样很影响查找效率,所以一般图片都存储服务器上的路径。这样只需要存储一个字符串即可,效率很高。
类似的,用户间传送文件,表情,以及聊天记录都可以以这样的形势存储,而且大文件只可以这样存储,因为mysql的BLOB类型最大可以存储16M大小的二进制流文件。
关于如何把图片转换为二进制流写在了我的csdn:
https://blog.csdn.net/weixin_42202763/article/details/103413803
关于如何用c语言操纵mysql数据库:
目前的代码(以二进制流的方式添加图片到BLOB类型,但是我们决定以路径形式存储,所以仅作参考,同时包括了mysql语句功能的实现):
四、人脸识别
实现人员:高迪
1. 实现方案
利用虹软基于C++的离线人脸识别的SDK,通过学习接口的使用,进行初步的人脸注册与登陆功能。
1.1 配置opencv环境,利用opencv的haarcascade_frontalface_alt.xml人脸识别器训练文件,加载脸部识别分类器后,调用摄像头识别到人脸之后获取人脸照片,将人脸照片转换为灰度图以及大小为一定尺寸的图片,存储到指定路径,然后调用虹软sdk接口,获取该灰度图的人脸特征。人脸特征为byte数组,将其存储到服务器的数据库中,字段类型为BLOB。
1.2 在进行人脸动态比对时,通过视频流的截取,获取人脸特征值,最后和数据库中的人脸特征值进行比对,调整阈值。
2. 目前的实现进度:
仍在深入的学习和尝试阶段。
暂时可实现通过摄像头检测到人脸之后进行截取,设定尺寸预定,以指定名字存储到指定文件中。以及,可以进行静态人脸比对,即对比两张图片中的人脸,获取相似度。
正在进行特征值存储到数据库中的类型转换问题。
下一步计划将完成完整的人脸注册功能。