书名:计算机视觉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个顶点。扫描后的答题卡通常是一个梯形,据此可以判断在众多轮廓中哪个轮廓对应的是答题卡。
-
除此之外,还有一个方法是在找到的众多轮廓中,面积最大的轮廓可能是答题卡。因此,可以将面积最大的轮廓对应的对象判定为答题卡。
网友评论