使⽤python3+opencv3实现的识别答题卡的例⼦(01)answer_sheet_scan
使⽤python3+opencv3实现的⼀些识别答题卡的例⼦
由于⼯作需要,最近在研究关于如何通过程序识别答题卡的客观题的答案,之前虽然接触过python,但对于计算机视觉这⼀块却完全是⼀个陌⽣的领域,经过各种调研,发现⽹上⼤多数的例⼦都是采⽤的OpenCV这个开源库来做的,OpenCV是计算机视觉领域的处理的⼀个⾮常优秀的开源库,原⽣由C++编写,也提供了各个主流编程语⾔的接⼝⽀持,这⾥选择python完全是因为python在计算机科学领域有着压倒性的优势和⽣态系统,所以使⽤它毫⽆疑问,最快上⼿的⽅式莫过于直接阅读⽹上已有的例⼦或者轮⼦了,通过阅读源码以问题驱动的⽅式来学习和研究某⼀项技术是⽐较⾼效的⼀种⽅式。
识别例⼦01
例⼦01是参考:⽹站上⼀个识别例⼦,参考作者的源码,先在本地运⾏成功之后,然后加上⾃⼰的理解,给⼤多数核⼼代码加上了详细的中⽂注释,并在每⼀个关键阶段都会弹出具体的窗体展⽰识别流程,这样便于⼤家更能详细的看到核⼼部分的细节,感兴趣的同学,可以⾃⼰在再尝试加⼀些更细部分的debug弹窗。
例⼦01的在我本地PyCharm运⾏后⼀些截图:
(1)原图
(2)灰度+⾼斯模糊后的图
(3)使⽤边缘检测后的图
(4)透视变换后提取指定答题区域的灰度图
(5)使⽤ostu的⼆值化后的图
(6)识别答案成功后的图
(7)标记出做对和做错的图并计算得分
代码如下:
# -*- coding:utf-8 -*-
from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import imutils
import cv2 as cv
ANSWER_KEY_SCORE = {0: 1, 1: 4, 2: 0, 3: 3, 4: 1}
ANSWER_KEY = {0: "A", 1: "B", 2: "C", 3: "D", 4: "E"}
# 加载⼀个图⽚到opencv中
rectangle函数opencvimg = cv.imread('E:\\tmp\\t1.png')
cv.imshow("orgin",img)
#转化成灰度图⽚
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow("gray",gray)
gaussian_bulr = cv.GaussianBlur(gray, (5, 5), 0) # ⾼斯模糊
cv.imshow("gaussian",gaussian_bulr)
edged=cv.Canny(gaussian_bulr,75,200) # 边缘检测,灰度值⼩于2参这个值的会被丢弃,⼤于3参这个值会被当成边缘,在中间的部分,⾃动检测cv.imshow("edged",edged)
# 寻轮廓
image, cts, hierarchy = cv.findContours( py(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 给轮廓加标记,便于我们在原图⾥⾯观察,注意必须是原图才能画出红⾊,灰度图是没有颜⾊的
# cv.drawContours(img, cts, -1, (0,0,255), 3)
# 按⾯积⼤⼩对所有的轮廓排序
list=sorted(cts,urArea,reverse=True)
print("寻轮廓的个数:",len(cts))
cv.imshow("draw_contours",img)
# 正确题的个数
correct_count=0
for c in list:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论