整张答题卡识别原理(筛选出所有选项)
2023-11-09 本文已影响0人
大龙10
书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
第9章 答题卡识别
9.2 整张答题卡识别原理
9.2.3 筛选出所有选项
1、筛选出所有选项
上述步骤找到了答题卡内所有轮廓,这些轮廓既包含所有选项的轮廓,又包含说明文字等(噪声)信息的轮廓。需要将各选项轮廓筛选出来,具体的筛选原则如下:
- 轮廓要足够大,不能太小,具体量化为长度大于25像素、宽度大于25像素。
- 轮廓要接近于圆形,不能太扁,具体量化为纵横比介于[0.6,1.3]。
将所有轮廓依次按照上述条件进行筛选,满足上述条件的轮廓判定为选项;否则,判定为噪声(说明文字等其他信息的轮廓)。
2、【例9.7】找到答题卡内所有轮廓。
import cv2
thresh = cv2.imread("d:\\OpenCVpic\\thresh.bmp",-1)
cv2.imshow("thresh", thresh)
cnts, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print("共找到各种轮廓",len(cnts), "个")
#===========筛选出选项的轮廓====
options =[]
for ci in cnts:
#获取轮廓的矩形包围框
x,y, w, h = cv2.boundingRect(ci)
#计算纵横比
ar = w / float(h)
# 将满足长度、宽度大于 24 像素且纵横比介于[0.7,1.3]的轮廓加入 options
if w >= 24 and h>= 24 and ar >= 0.7 and ar <= 1.4:
options.append(ci)
# 需要注意的是,此时得到了很多选项的轮廓,但是它们在 options 中是无规则存放的
print("共找到选项",len(options), "个")
# =====将找到的所有选项轮廓绘制出来==
color = (0,0,255) # 红色
# 为了显示彩色图像,将原始图像转换至色彩空间
threshColor=cv2.cvtColor(thresh,cv2.COLOR_GRAY2BGR)
cv2.drawContours(threshColor, options,-1, color, 5)
cv2.imshow("result",threshColor)
cv2.waitKey()
cv2.destroyAllWindows()
![](https://img.haomeiwen.com/i17748967/762ff6aaa3009497.png)
![](https://img.haomeiwen.com/i17748967/02d0361ba2f7111d.png)