Python下使用opencv等库进行国内答题卡选择题图像识别

来源:互联网 发布:科普知识网络竞赛答案 编辑:程序博客网 时间:2024/04/28 21:39

背景:由于女票是一名人民教师,祖国园丁,无奈学校甚微简陋,连答题卡机器都没有,选择题只能老师人手一题一题的改。于是就有了这篇文章,我希望通过Python+opencv+imutils等库对答题卷的选择题部分进行图像识别,然后程序改题,最后得出统计数据,起码在客观选择题部分提高结题效率。
由于Python、opencv均为新手,所以以此为学习日记…

  1. 从试卷中挑选出选择题部分

    # -*- coding: UTF-8 -*-# 引入必要的库from imutils.perspective import four_point_transformfrom imutils import contoursimport numpy as npimport argparseimport imutilsimport cv2  # 构建命令行参数解析并分析参数# 对应使用方式 python test_grader.py --image images/test_01.pngap = argparse.ArgumentParser()ap.add_argument("-i", "--image", required=True,                help="path to the input image")args = vars(ap.parse_args())    # 构建答案字典,键为题目号,值为正确答案ANSWER_KEY = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1} # 加载图片,将它转换为灰阶,轻度模糊,然后边缘检测。image = cv2.imread(args["image"])gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)blurred = cv2.GaussianBlur(gray, (5, 5), 0)edged = cv2.Canny(blurred, 75, 200) # 从边缘图中寻找轮廓,然后初始化答题卡对应的轮廓cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,                        cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if imutils.is_cv2() else cnts[1]docCnt = None   # 确保至少有一个轮廓被找到if len(cnts) > 0:    # 将轮廓按大小降序排序    cnts = sorted(cnts, key=cv2.contourArea, reverse=True)      # 对排序后的轮廓循环处理    for c in cnts:        # 获取近似的轮廓        peri = cv2.arcLength(c, True)        approx = cv2.approxPolyDP(c, 0.02 * peri, True)         # 如果我们的近似轮廓有四个顶点,那么就认为找到了答题卡        if len(approx) == 4:            docCnt = approx            break# 对原始图像和灰度图都进行四点透视变换paper = four_point_transform(image, docCnt.reshape(4, 2))warped = four_point_transform(gray, docCnt.reshape(4, 2))   # cv2.imshow("Original", image)cv2.imshow("exam", warped)cv2.waitKey(0)

    原图:
    原图

    效果图:
    原图


  2. 将选择题每题挑选出来

参考文章:

  • python CV 趣味项目 答题卡识别
  • opencv识别答题卡
0 0