我正在使用Python和OpenCV编写光学表格阅读器。我从光学形式中得到答案,但是我怎么知道填写了哪个选择呢?
这是一个示例图片:
到目前为止,这是我的代码:
image = cv2.imread('cevap1.png')
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(image,(1,1),0)
th2 = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY, 11, 1)][1]][1]
答案 0 :(得分:2)
假设答案的特征是大部分为实心圆,我将逐行求和所有像素值。然后,将结果矢量分成五个部分,每个部分代表一个选项的总和,然后对这些窗口中的强度值求平均。然后,具有最低平均强度的窗口就是选定的答案(深色=低强度值)。
我将给出一个示例代码片段,用于检测单个答案:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Read image
img = cv2.imread('images/p4I1m.png', cv2.IMREAD_GRAYSCALE)
# Sum intensity values row-wise
sum = np.sum(img, axis=0)
plt.plot(sum)
plt.show()
# Set up answers
nAnswers = 5
answers = []
# Calculate mean intensity value for each answer option using a simple windowed, moving average with displacement
step = int(np.floor(sum.size / nAnswers))
for i in range(nAnswers):
answers.append(np.mean(sum[i*step:(i+1)*step-1]))
print(answers)
# Find minimum mean intensity
answer = np.argmin(answers)
print(answer)
# TODO: Mapping from indices (0, 1, ...) to ('A', 'B', ...)
图的输出:
answers
的输出:
[2225.0, 2227.5454545454545, 2252.909090909091, 2246.0, 1449.3636363636363]
answer
的输出:
4
我跳过了从np.argmin
到A,B等之类的映射。
现在,需要进一步改进:
按行求和应在一定程度上具有旋转稳定性。
希望有帮助!