Bootstrap

基于OpenCV实现的答题卡自动判卷系统

一、图像预处理 🌄 

二、查找答题卡轮廓 📏

三、透视变换 🔄

四、判卷与评分 🎯

五、主函数

六、完整代码+测试图像集

总结 🌟


        在这篇博客中,我将分享如何使用Python结合OpenCV库开发一个答题卡自动判卷系统。这个系统能够自动从扫描的答题卡中提取信息、进行图像处理、识别答案并给出评分。项目综合运用了图像处理的基本技术,包括图像预处理、轮廓检测、透视变换、二值化处理、轮廓分析等,最终实现了答题卡的自动识别和判卷功能。🚀

整体流程如下: 

                                   

一、图像预处理 🌄 

        首先,我们需要加载图像并对其进行预处理。预处理包括将图像转换为灰度图,应用高斯模糊来去噪,使用Canny算法进行边缘检测

def preprocess_image(image):
    """
    图像预处理:灰度化、高斯模糊、边缘检测。
    :param image: 输入图像。
    :return: 边缘检测结果。
    """
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 将图像转换为灰度图
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)  # 对灰度图进行高斯模糊
    edged = cv2.Canny(blurred, 75, 200)  # 对模糊后的图像进行边缘检测
    return edged  # 返回边缘检测结果

 

二、查找答题卡轮廓 📏

        在边缘图像中进行轮廓检测。通过查找轮廓,定位答题卡的四个角。确保了我们能准确地识别答题卡的位置。

  • 轮廓查找:使用OpenCV的findContours函数查找图像中的轮廓。

  • 轮廓排序:根据轮廓的面积或位置对轮廓进行排序,便于后续处理。

  • 多边形近似:使用approxPolyDP函数对轮廓进行多边形近似,找到答题卡的4个顶点。


def find_document_contour(edged):
    """
    查找答题卡的轮廓。
    :param edged: 边缘检测结果。
    :return: 答题卡的4个顶点坐标。
    """
    cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 查找轮廓
    cnts = imutils.grab_contours(cnts)  # 兼容不同OpenCV版本的轮廓提取
    if len(cnts) == 0:  # 如果没有找到轮廓
        raise ValueError("无法找到轮廓!")  # 抛出异常

    # 按轮廓大小排序
    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:  # 如果近似结果为4个点,则认为是答题卡轮廓
        
;