问题描述
我正在尝试构建一个程序,该程序可以识别答卷上问题的分数,最后将分数相加得出学生获得的总分。我主要使用 OpenCV 进行图像识别。总结到目前为止我为尝试获得输出所做的工作:
- 首先,我过滤图像以从中提取红色实体。这样做的前提是假设教师会使用红笔为这些试卷评分。
- 接下来,我使用霍夫圆变换来查找图像中的圆。理想情况下,分配的标记应包含在一个圆圈内。这将有助于区分学生所写的数字,使我们能够确定页面上的哪些数字实际上是分数,而不是学生答案的一部分。
- 我使用 MNIST 数据集来训练手写数字识别模型。我还有一个使用 (https://www.kaggle.com/jcprogjava/handwritten-digits-dataset-not-in-mnist) 数据集训练的辅助模型。我的想法是让多个模型预测这个数字,然后取出现次数最多的数字,以帮助提高准确性。
- 在将图像传递给模型之前,我将其调整为 28x28 图像,并应用 cv2.equalizeHist() 来增加对比度。我这样做是为了解决调整图像大小时分辨率的损失。
我目前面临的问题是:
- 不同的图片具有不同的红色圆圈和数字值,具体取决于照明、使用的笔等。无论如何,我如何确保我设法获得红色文本?
- 霍夫圆变换似乎不一致。有时,当我运行代码时,我会得到上次不存在的随机圆圈。我也很难决定要使用哪些 param1 和 param2 值。
- 最后,模型预测通常很好。我觉得这可能是由于圆圈本身存在于我输入到模型中的图像中。当圆圈可能有不同的大小时,我该如何摆脱它?我试图裁剪圆,以便只得到圆周内的内容,但由于不规则的圆形形状而得到了不同的结果。
任何帮助将不胜感激,我是机器学习和 stackoverflow 的新手,所以请原谅我犯的任何错误。我也乐于接受新的方法来尝试获得分数(如果有的话)。
代码:
#Red Extraction
t = 40 #threshold acceptance
red_thresh = cv2.inRange(img,np.array([123 - t,57 - t,57 - t]),np.array([123 + t,57 + t,57 + t]))
#Applying Hough Circle Transform
#Tried Canny Edge Detection,Couldn't get it to work.
#img = cv2.Canny(img,150,200);
#plt.imshow(img,cmap="gray")
img = cv2.medianBlur(img,5)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,200,param1=100,param2=30,minRadius=100,maxRadius=300)
#grey is the cropped circle from the hough transform
ret,thresh = cv2.threshold(grey.copy(),220,255,cv2.THRESH_BINARY)
#contours,_ = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
preprocessed_digits = []
x,y,w,h = cv2.boundingRect(grey)
# Creating a rectangle around the digit in the original image (for displaying the digits fetched via contours)
cv2.rectangle(image,(x,y),(x+w,y+h),color=(0,0),thickness=2)
# Cropping out the digit from the image corresponding to the current contours in the for loop
digit = thresh[y:y+h-10,x:x+w-10]
plt.imshow(grey,cmap="gray")
plt.show()
# Resizing that digit to (18,18)
resized_digit = imutils.resize(grey,width=28,height=28)
# Adding the preprocessed digit to the list of preprocessed digits
preprocessed_digits.append(resized_digit)
The number after cropping and resizing
The number after cv2.equalizeHist()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)