用Python+OpenCV+PyQt开发的答题卡识别软件
这是一个可以识别定制答题卡的软件,它可以根据用户自定的答案来进行识别,校对正误并统计分数。该软件可以识别80道选择题,支持单选和多选。用户在识别前可以进行图像调整,去除噪点,以减少自然光带来的识别误差。
注:源码需付费下载,如不需要,可以就看下软件的设计思路,希望能够帮到你。
源码下载地址:
https://download.csdn.net/download/La_vie_est_belle/18371132
软件使用视频
用Python+OpenCV+PyQt开发答题卡识别软件
软件使用说明
1. 下载源码后,首先安装依赖库。项目所用到的依赖库已经放在了requirements.txt文件中,大家可以使用以下命令进行安装(注意要先进入项目路径):
pip3 install -r requirements.txt
2. 安装完毕后,运行main.py即可打开软件:
3. 接着点击"请选择答案文件"按钮选择试卷的标准答案:
4. 然后点击"图像调整"按钮,调整图像识别参数,去除图像噪点:
- 点击定位按钮,定位试卷:
- 调整高斯模糊值以及Thresh阈值,去除噪点。可以看到学生填涂区域(准考证号和选择题)的很多噪点已经被清除了。接着点击确定参数按钮即可,之后在答题卡识别时都将以该参数调整图像:
5. 最后点击开始识别按钮进行识别,识别出来的准考证号和选择题填涂区域将显示在屏幕上:
注:每张答题卡都将会验证6次,验证次数可以在settings/config.json文件中修改。
在下方的表格中会显示学生的准考证号以及填涂答案。如果文本为红色,则说明学生的答案跟标准答案不匹配。如果单元格是空的话,说明学生未填涂或者光线导致的识别误差(可以再调整识别参数)。
6. 全部识别完毕后,点击"停止识别"按钮,再点击"导出成绩"按钮即可获得识别结果的Excel表格:
软件设计思路
1. 首先设计好答题卡模板,在四个边角加上定位标志。
2. 将答题卡模板各个区域涂黑,然后使用OpenCV获取到准考证区域和选择题区域所有的长方形轮廓,将所有目标填涂区域的轮廓坐标进行保存。因为图片质量很高,所以我们可以用OpenCV很容易地获取到描黑的填涂区域轮廓。此时程序所需的答题卡识别坐标文件就制作好了。
3. 之后我们识别学生填涂的答题卡时,可以从文件中直接读取坐标,然后让程序判断相应区域的非零值(None Zero Value),符合条件的话说明学生有填涂该区域。准考证区域的判断稍有不同,我们应该判断非零值最符合条件的一项,因为同一列只能填涂一个数字,描得最黑的那个区域上的数字即为目标数字。
4. 开始识别时打开了一个识别线程,该线程接收摄像头传过来的图像。在定位、优化、识别图片之后,通过PyQt信号将准考证号和选项返回给主窗口。
5. 识别出来后,将学生的准考证号和选项显示到PyQt的QTableWidge控件上,如果学生选项跟答案的字符串不一致,则标红并且扣除相应分数。
6. 最后利用openpyxl模块生成excel。
如何设置答案
请将标准答案放在txt文件中:
每一行填写一个答案,左侧为题号,中间为标准答案,右侧为该题分值。题号、标准答案和分值用-进行分隔。
如果某一题是多选的话,那只用把当中的选项修改下就行了:1-AB-1
界面风格
该软件还提供了三种不同的界面风格:
flatwhite.css:
lightblue.css:
psblack.css:
可以在main.py中修改以下代码来设置不同的风格:
-
qss = read_qss(
'./res/qss/flatwhite.css')
-
app.setStyleSheet(qss)
备注
1. 答题卡模板已经随源码放在项目文件夹中,可以自行打印出来填涂。
2. 答题卡四个边角处有长方形黑块,用于定位。所以在识别时一定要让摄像头看到这四个角。
3. 请在识别前调整图像,否则图像的噪点会很多,不利于识别。
4. 由于是在自然光下进行的识别(不是在机盒的暗室中),所以自然光有一定小概率导致识别误差。
5. 当因为光照无法识别到试卷时,用户可以用手轻轻移动碰触下试卷。
6. settings/config.json中的verify_num为验证次数,改大可以提高验证准确率,但会影响识别速度。stu_number_length为准考证号长度,该值可以依据学生考试时所用的准考证号长度来定,最大值为6。
7. 笔者采用的摄像头是720p的,即分辨率1280x720,请不要低于该分辨率。
8. 如果其他疑问或建议请私信我。
转载:https://blog.csdn.net/La_vie_est_belle/article/details/116396031