Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv OMR:评估填充圆_Opencv_Computer Vision_Emgucv_Optical Mark Recognition - Fatal编程技术网

Opencv OMR:评估填充圆

Opencv OMR:评估填充圆,opencv,computer-vision,emgucv,optical-mark-recognition,Opencv,Computer Vision,Emgucv,Optical Mark Recognition,我正在为试卷实施OMR系统。但在确定填充圆时面临问题。我成功地获得了这些感兴趣的灰度区域 问题是: -二进制阈值(自适应和固定)和非零像素计数会产生很多错误,因为圆圈中的字母和移动相机拍摄的照片亮度不同。 -也尝试了本文中描述的技术,即使用圆圈的平均灰度值来标记圆圈是否填充,但图像的亮度并不均匀,因为人们在使用相机拍照时使用不同的光源,我得到了很多错误的结果。 -人们也不会遵循规则,比如我们填充整个循环,在这种情况下,算法也需要健壮。 我已经有大约10 GB的样本,因此可能是机器学习或其他统计

我正在为试卷实施OMR系统。但在确定填充圆时面临问题。我成功地获得了这些感兴趣的灰度区域

问题是:
-二进制阈值(自适应和固定)和非零像素计数会产生很多错误,因为圆圈中的字母和移动相机拍摄的照片亮度不同。
-也尝试了本文中描述的技术,即使用圆圈的平均灰度值来标记圆圈是否填充,但图像的亮度并不均匀,因为人们在使用相机拍照时使用不同的光源,我得到了很多错误的结果。
-人们也不会遵循规则,比如我们填充整个循环,在这种情况下,算法也需要健壮。

我已经有大约10 GB的样本,因此可能是机器学习或其他统计方法将非常有用。

有人知道将圆划分为填充圆的其他方法吗?

因为这不是一个直接的问题,所以需要进行大量的调整才能使其健壮。但我想建议你一个好的起点。你可以玩它,试着让它工作

import numpy as np
import cv2

image_ori = cv2.imread("circle_opt.png")

lower_bound = np.array([0, 0, 0])
upper_bound = np.array([255, 255, 195])
image = image_ori

mask = cv2.inRange(image_ori, lower_bound, upper_bound)
masked_red = cv2.bitwise_and(image, image, mask=mask)

kernel = np.ones((3,3),np.uint8)
closing = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)

contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)[0]
contours.sort(key=lambda x:cv2.boundingRect(x)[0])

print len(contours)
for c in contours:
    (x,y),r = cv2.minEnclosingCircle(c)
    center = (int(x),int(y))
    r = int(r)
    if 10 <= r <= 15:
        cv2.circle(image,center,r,(0,255,0),2)

# cv2.imwrite('omr_processed.png', image_ori)
cv2.imshow("original",image_ori)
cv2.waitKey(0)
将numpy导入为np
进口cv2
image_ori=cv2.imread(“circle_opt.png”)
下限=np.array([0,0,0])
上界=np.array([255,255,195])
图像=图像
掩码=cv2.inRange(图像上、下、上界)
蒙版_red=cv2.按位_和(图像,图像,蒙版=蒙版)
内核=np.ones((3,3),np.uint8)
关闭=cv2.morphologyEx(掩码,cv2.MORPH_打开,内核)
轮廓=cv2.findContours(mask.copy(),cv2.RETR_外部,
cv2.链约简单[0]
sort(key=lambda x:cv2.boundingRect(x)[0])
印刷透镜(轮廓)
对于等高线中的c:
(x,y),r=cv2。闭合圆(c)
中心=(整数(x),整数(y))
r=int(r)

恐怕你的问题太宽泛了。有很多方法和很多可能的解决方案,但是给出一个好的推荐需要更多的图片和一些限制。到目前为止,我的答案是:是的,有人知道将圆分类为填充圆的其他方法。@vzhadeyev使用的属性检查“查找轮廓”area@JeruLuke,这将给我一个有一个区域的等高线数组,从中我可以得到最大的一个或检查里面填充的像素的数量,但我仍然需要对像素数设置一些固定的阈值,以确定它是否已填充。这就是你的观点吗?@vzhadeyev是的,没错。这是一种反复试验的方法,用于确定要高亮显示的轮廓区域Getting TypeError:“key”是此函数的无效关键字参数。这是在python 2.7上测试的,请尝试。或者修改代码以在您使用的版本中工作。是的,使用相同的环境。不确定在传递到sort函数时为什么会出现错误,因此也不确定要更正什么在此之前没有使用“键”。您可以将该行注释掉。如果只想检查功能,则无需排序:)