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
Python I';我试图分析Scantron表单并为OMR项目创建密钥_Python_Opencv_Python Imaging Library - Fatal编程技术网

Python I';我试图分析Scantron表单并为OMR项目创建密钥

Python I';我试图分析Scantron表单并为OMR项目创建密钥,python,opencv,python-imaging-library,Python,Opencv,Python Imaging Library,因此,我试图使用OpenCV扫描此表单,并从本质上为标记的问题制定一个键。现在我试着去做一些我在网上找到的例子,我把它转换成一个二值图像,但是我在检测问题的标记时遇到了问题。我在网上找到了一个教程,但他们使用了不同格式的表单,这个表单上的内容比示例中显示的要多得多,我可以使用更熟悉OpenCV的人提供的一些输入。帮助不一定是对我的代码甚至工作代码的改进,它可以是指向更有用的文档、材料或教程的链接和参考。 def分析键(自身): keypix=self.doc.getPagePixmap(0,a

因此,我试图使用OpenCV扫描此表单,并从本质上为标记的问题制定一个键。现在我试着去做一些我在网上找到的例子,我把它转换成一个二值图像,但是我在检测问题的标记时遇到了问题。我在网上找到了一个教程,但他们使用了不同格式的表单,这个表单上的内容比示例中显示的要多得多,我可以使用更熟悉OpenCV的人提供的一些输入。帮助不一定是对我的代码甚至工作代码的改进,它可以是指向更有用的文档、材料或教程的链接和参考。

def分析键(自身):
keypix=self.doc.getPagePixmap(0,alpha=False)
keyim=self.pixel2np(keypix)
imwrite(“keyimage.jpg”,keyim)
key=cv2.imread(“keyimage.jpg”)
灰度=cv2.CVT颜色(键,cv2.COLOR\u BGR2GRAY)
模糊=cv2.高斯模糊(灰度,(5,5,0)
边缘=cv2.Canny(模糊,75200)
cv2.imshow(“键”,边缘)
cnts=cv2.findContentours(edge.copy(),cv2.RETR_EXTERNAL,
cv2.链条(近似简单)
cnts=cnts[0]如果imutils.is_cv2()其他cnts[1]
docCnt=无
#确保至少找到一个轮廓
如果len(cnts)>0:
#根据轮廓的大小对轮廓进行排序
#降序
cnts=已排序(cnts,key=cv2.contourArea,reverse=True)
#在已排序的等高线上循环
对于碳纳米管中的碳:
#近似轮廓
peri=cv2.弧长(c,真)
近似值=cv2.近似聚合度(c,0.02*peri,真)
#如果我们的近似轮廓有四个点,
如果len(近似值)=4:
docCnt=近似值
打破
#originalkey=四点变换(关键点,文档重塑(4,2))
#newkey=four_point_transform(灰度,文档重塑(4,2))
keyim[:,:,2]=0
cv2.imshow(“分割”,keyim)
阈值=cv2。阈值(灰度,0255,
cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
cv2.imshow(“大津”,脱粒)
cnts=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,
cv2.链条(近似简单)
cnts=cnts[0]如果imutils.is_cv2()其他cnts[1]
问题=[]
对于碳纳米管中的碳纳米管:
(x,y,w,h)=cv2.boundingRect(c)
ar=w/浮子(h)

如果w>=20和h>=20,ar>=0.9和ar用于获得铅笔标记的轮廓,而不是阈值,则可以使用
cv2.inRange
区分灰色/黑色铅笔标记和橙色文本。您可以为允许的颜色选择下限和上限。在这里,我只选择黑色作为下限,灰色(180180)作为上限,并应用于您给出的彩色图像。这些值之间的任何像素都在下面显示的输出掩码中指示

img = cv2.imread('keyimage.jpg')
lower_bound = (0,0,0)
upper_bound = (180,180,180)
mask = cv2.inRange(img, lower_bound, upper_bound)
plt.imshow(mask, cmap='gray')
plt.show()

为了获得铅笔标记的轮廓,而不是阈值,您可以使用
cv2.inRange
区分灰色/黑色铅笔标记和橙色文本。您可以为允许的颜色选择下限和上限。在这里,我只选择黑色作为下限,灰色(180180)作为上限,并应用于您给出的彩色图像。这些值之间的任何像素都在下面显示的输出掩码中指示

img = cv2.imread('keyimage.jpg')
lower_bound = (0,0,0)
upper_bound = (180,180,180)
mask = cv2.inRange(img, lower_bound, upper_bound)
plt.imshow(mask, cmap='gray')
plt.show()

哇,这让分析变得非常容易,我有几个问题:一旦我达到了这一步,有没有办法抓住与标记相关的问题?再加上我的第二个问题是,我如何区分问题和出现在右边的ID号、表单号部分哇,这让分析变得非常容易,我有几个问题:一旦我达到了这一步,有没有办法抓住哪个问题与标记相关?另外,我的第二个问题是,我如何区分这些问题和出现在右边的ID号、表单号部分