使用python opencv扫描OMR工作表气泡

时间:2019-06-19 10:25:45

标签: python-3.x opencv3.0 hough-transform omr

我正在使用OMR气泡表扫描仪,使用python openCV检测正确的气泡答案。在执行以下代码时,我无法正确获得答案。有人可以看一下代码,让我知道我在哪里做错了吗?

我尝试了以下网址图片

https://www.pyimagesearch.com/wp-content/uploads/2016/10/omr_test_01.png

import cv2 as cv
import numpy as np

image = cv.imread("H:/omr_test_01.png",0)
image1 = cv.imread("H:/omr_test_01.png")
correct_answers = ['B','E','A','C','B']

crop_img = image[157:975, 42:330]
#print(crop_img)
answers = []

itr = 0

for itr in range(2):
    if itr ==0:
        img1 = crop_img[0:818, 0:120]
    else:
        img1 = crop_img[0:818, 167:288]


    img1 = cv.GaussianBlur(img1,(5,5),0)

    img1 = cv.Canny(img1,100,200)

    img1 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
    img1 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
    img1 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
    img1 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)
    img1 = cv.adaptiveThreshold(img1,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,11,2)


    img1 = cv.GaussianBlur(img1,(5,5),0)

    img = img1
    img = cv.equalizeHist(img)

    cimg = cv.cvtColor(img,cv.COLOR_GRAY2BGR)
    print(cimg)
    img1 = cv.Canny(img1,100,200)
    img1 = cv.Canny(img1,100,200)
    img1 = cv.Canny(img1,0,255,cv.THRESH_BINARY_INV | cv.THRESH_OTSU)[1]
    img1 = cv.GaussianBlur(img1,(5,5),1)
    img1 = cv.GaussianBlur(img1,(5,5),1)

    circles = cv.HoughCircles(img,cv.HOUGH_GRADIENT,1,10,param1=50,param2=50,minRadius=0,maxRadius=0)
    circles = np.uint16(np.around(circles))
    k=0
    for i in circles[0,:]:
        cv.circle(cimg,(i[0],i[1]),2,(0,255,0),3)
        k = k+1

        cv.waitKey(0)
        cv.destroyAllWindows()


       for i in range(k):
            answers.append(circles[0][i][0]+circles[0][i][1]+circles[0][i][2])


sheet = len(answers)

final_answers = []
for i in range(0,5):
    j = i
    ind = 0
    index = ind
    index = 0
    max = answers[j]
    for j in range(i+1):
        if max<=answers[j]:
            max = answers[j]
            ind = ind+1
            index = ind
    if index == 0:
        final_answers.append('A')
    if index == 1:
        final_answers.append('B')
    if index == 2:
        final_answers.append('C')
    if index == 3:
        final_answers.append('D')
    if index == 4:
        final_answers.append('E')


mark = 0
itrr = len(final_answers)
for i in range(itrr):
    if final_answers[i]==correct_answers[i]:
        mark = mark+1
print(final_answers)
print(mark)


font = cv.FONT_HERSHEY_SIMPLEX

cv.putText(image1,'Marks:2/5', (20,450), font, 2,(0,0,255),3,cv.LINE_AA)
cv.imshow('marks',image1)
cv.waitKey(0)
cv.destroyAllWindows()

实际输出:

['B','E','A','C','B']

5

获取输出:

['B','B','C','C','D']

4

0 个答案:

没有答案