You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python CV2的OMR开发:矩形检测遭竖线干扰问题求助

OMR答题卡矩形轮廓检测问题解决思路

针对答题卡中贯穿垂直黑线导致轮廓合并的问题,可从以下几个方向处理:

  • 先去除干扰垂直黑线:用形态学开运算,选择水平方向的结构元素,针对性消除细竖线。开运算先腐蚀后膨胀,能保留矩形的水平/垂直边框,同时去掉细长的垂直干扰线。

    # 创建水平结构元素(宽度远大于高度,适配竖线粗细)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 1))
    # 对Canny结果做开运算处理
    processed_img = cv2.morphologyEx(canny_img, cv2.MORPH_OPEN, kernel)
    
  • 优化边缘检测参数:调整高斯模糊和Canny阈值,弱化竖线的边缘响应。加大模糊核可让细竖线变得模糊,调整Canny高低阈值能过滤掉竖线的弱边缘,同时保留矩形的清晰边缘。

    # 加大高斯模糊核尺寸,弱化细竖线细节
    blurred = cv2.GaussianBlur(gray_img, (5, 5), 0)
    # 调整Canny阈值,按需调整数值适配你的答题卡
    canny_img = cv2.Canny(blurred, 30, 150)
    
  • 轮廓后筛选目标矩形:使用层级轮廓检测模式(cv2.RETR_TREE)获取所有轮廓,再通过面积、宽高比筛选出符合选项框特征的轮廓。即使仍有大轮廓,也能从中提取出内部的矩形子轮廓。

    # 检测包含层级信息的所有轮廓
    contours, hierarchy = cv2.findContours(processed_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    target_contours = []
    for cnt in contours:
        area = cv2.contourArea(cnt)
        x, y, w, h = cv2.boundingRect(cnt)
        aspect_ratio = w / h
        # 根据你的选项框实际尺寸调整面积和宽高比范围
        if 200 < area < 1000 and 0.8 < aspect_ratio < 1.2:
            target_contours.append(cnt)
    
  • 固定位置竖线直接消除:如果竖线位置固定,可直接将竖线所在列的像素置为背景色(白色),从根源上消除干扰。

    # 假设竖线位于x=198-203和x=398-403列,根据实际坐标调整
    gray_img[:, 198:203] = 255
    gray_img[:, 398:403] = 255
    

内容的提问来源于stack exchange,提问作者guy blau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 21:29:53