文章目录
- 写在前面
- 项目目标
- 项目讲解
- ⭐️一、数据预处理
- ⭐️二、透视变换
- ⭐️三、阈值处理
- ⭐️四、过滤干扰项
- ⭐️五、展示操作
- ⭐️后续问题
光学标记识别(简称OMR)是自动分析人工标记文档并解释其结果的过程。
我们之前在20年差不多都是人工去识别判卷,那个时候一个班级的试卷需要老师花费差不多1个小时才可以判完。效率就比较低,随着这个计算机硬件和信息大爆炸时代的到来,人工智能也开始飞跃的发展。对于这个试卷的问题,我们再用人工智能去做的时候,1个小时可以判几十万或者更多的试卷。所以人工智能对人类的发展是有一个质的飞跃的。那么我们就来了解一下他是一个怎么样的过程。
我们对于一个答题卡拿来差不多是这个样子。
如果我们做一个和四六级差不多的卷子,那么我们同这个项目的原理是一致的。我们就以上图为例子来看。
项目目标:首先我们要在图片中,把试卷的区域利用透视变换给拿出来。也就是提取自己的ROI区域。然后答题卡填充的答案类似于实心的,没有填充的答案类似于是一个空心的。识别出来之后,我们要和输入的答案进行一个比较,如果对就记录下来,如果不对,那么就不记录,最后利用这个来判分。完成一个批分的功能。
项目讲解⭐️一、数据预处理1:检测图像中的检查。
2:应用透视转换以提取考试的自上而下的鸟瞰图。
3:从转换的考试的角度中提取气泡集(即可能的答案选择)。
4:将问题/气泡排序为行。
5:确定每行的标记(即“气泡”)答案。
6:在我们的答案键中查找正确答案,以确定用户的选择是否正确。
7:对考试中的所有问题重复上述步骤。
导入参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to the input image")
args = vars(ap.parse_args())
1234
def cv_show(name,img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
image = cv2.imread(args["image"])
contours_img = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
cv_show('blurred',blurred)
edged = cv2.Canny(blurred, 75, 200)
cv_show('edged',edged)
1234567891011
这里是一些基础的形态学操作,首先我们将图像由RGB转为gray图像,灰度图像。然后我们对灰度图像进行一个高斯滤波操作,目的就是消除掉图片中的一些噪音点,方便后期处理。
高斯滤波之后,我们又做了一次边缘检测,以75和200像素值作为阈值。对滤波后的操作进行一个边缘检测。
然后我们对边缘检测后的图像进行轮廓检测,并且画出轮廓。文档的边缘是如何清晰定义的,检查的所有四个顶点都存在于图像中。获取文档的这个轮廓非常重要,因为我们将使用它作为标记,将透视转换应用于考试,从而获得文档的自上而下的鸟瞰图。
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(contours_img,cnts,-1,(0,0,255),3)
cv_show('contours_img',contours_img)
1234
这里要注意就是老版本的CV轮廓检测返回的是三个结果,而新的版本返回的是两个结果。所以我们只需要第一个结果,所以索引就是定位0,老版本就定为1.然后我们定义参数,只检测外轮廓,并且使用四个点检测轮廓的方法。完成之后我们生成的图像就是: