一般答题卡设计时都在试卷4个角预留4个一样大小的黑块
仅能识别选择题判断题之类的填涂答题的题目,不能识别填空题应用题等其它主观题
使用 opencv 识别试卷图片中所有黑块,再根据黑块大小获取四个角的位置,根据四个黑块位置校正图像
将图像转成灰度图
Cv2.CvtColor(imgOrg, dst, ColorConversionCodes.BGR2GRAY);
对图像黑白增强处理
Cv2.Threshold(dst, dst, 160, 255, ThresholdTypes.Binary);
查找所有黑块包括黑块大小位置等信息
Cv2.FindContours(dst, out contours, out hierarchies, RetrievalModes.List, ContourApproximationModes.ApproxNone);
查找四角黑块的位置,根据黑块位置矫正图像并分析答案
答题卡校正前图像矫正前
答题卡图像矫正后
再根据每道题的位置识别区域内涂写的答案在区域内的位置
根据答案在区域内的位置转换成A B C D选项
输出json
{"n1":"A","n2":"D","n3":"B","n4":"C","n5":"D","n6":"D","n7":"A","n8":"C","n9":"D","n10":"A","n11":"B","n12":"B","n13":"D","n14":"C","n15":"A","n16":"C","n17":"D","n18":"A","n19":"D","n20":"C","n21":"D","n22":"A","n23":"B","n24":"D","n25":"C"}
最后再与标准答案比对计算得分。
答题卡识别示例演示
https://d.iyanhong.com/demos/answersheetscan.html
目前只是简单的处理识别,头一次用opencv,识别方法可能也不是太好,给可能用到的用户提供个思路,要进一步提升识别率也可以用opencv提供的其它方法处理优化图像