整张答题卡识别原理( 答题卡处理1:轮廓)

整张答题卡识别原理( 答题卡处理1:轮廓)

书名:计算机视觉40例从入门到深度学习:OpenCV-Python

作者:李立宗

出版社:电子工业出版社

出版时间:2022-07-01

ISBN:9787121436857

答题卡处理1

找到答题卡的轮廓

第9章 答题卡识别

9.2 整张答题卡识别原理

9.2.2 答题卡处理

将答题卡铺满整个页面(倾斜校正、删除无效边缘),将选项处理为白色,背景处理为黑色。

答题卡的处理,需要解决如下几个核心问题。

● 问题1:如何从众多轮廓中找到答题卡的轮廓?

● 问题2:如何对答题卡进行倾斜校正、裁剪掉扫描的边缘?

● 问题3:如何实现前景、背景的有效处理?

● 问题4:如何找到答题卡内所有选项?

1、问题1:如何从众多轮廓中找到答题卡的轮廓

在将答题卡铺满整个页面前,最重要的步骤是判定哪个轮廓是答题卡的轮廓。也就是说,需要先找到答题卡,再对其处理。

通常情况下,将函数findContours的method参数值设定为cv2.CHAIN_APPROX_SIMPLE,

当它识别到矩形时,就会使用4个顶点来保存其轮廓信息。

因此,可以通过判定轮廓是否用4个顶点表示,来判定轮廓是不是矩形。

这个方法简单易行,但是在扫描答题卡时,可能会发生失真,使得原本是矩形的答题卡变成梯形。

此时,简单地通过轮廓的顶点个数判断对象是否是答题卡就无效了。

不过,在采用逼近多边形拟合轮廓时,可以使用4个顶点拟合梯形。

因此,通过逼近多边形的顶点个数可以判定一个轮廓是否是梯形:

若一个轮廓的逼近多边形是4个顶点,则该轮廓是梯形;

否则,该轮廓不是梯形。

2、程序

本例中,分别展示了矩形、梯形的轮廓、逼近多边形的顶点个数。

# -*- coding: utf-8 -*-

"""

Created on Thu Oct 19 10:17:50 2023

@author: dalong10

"""

import cv2

def cstNum(x):

gray = cv2.cvtColor(x,cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

cts, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

print("轮廓具有的顶点个数:",len(cts[0]))

peri = 0.01*cv2.arcLength(cts[0],True)

#获取多边形的所有顶点,如果是 4 个顶点,就代表轮廓是矩形

approx=cv2.approxPolyDP(cts[0],peri,True)

#打印顶点个数

print("逼近多边形的顶点个数:",len(approx))

# ====读取原始图像====

o1 = cv2.imread('d:\\OpenCVpic\\XTest1.jpg')

cv2.imshow('o1', o1)

o2 = cv2.imread('d:\\OpenCVpic\\XTest2.jpg')

cv2.imshow('o2', o2)

print("首先,观察一下梯形:")

cstNum(o1)

print("接下来,观察一下矩形:")

cstNum(o2)

cv2.waitKey()

cv2.destroyAllWindows()

运行结果

输出数据

3、分析

从上述程序输出结果可以看出,梯形的轮廓具有非常多个顶点,但是其逼近多边形只有4个顶点。扫描后的答题卡通常是一个梯形,据此可以判断在众多轮廓中哪个轮廓对应的是答题卡。

除此之外,还有一个方法是在找到的众多轮廓中,面积最大的轮廓可能是答题卡。因此,可以将面积最大的轮廓对应的对象判定为答题卡。

相关推荐