python - OpenCV 找到彩色圆圈和位置值 Python

标签 python algorithm opencv image-processing numpy

我想做的是处理下面的出勤表,告诉我谁在,谁不在 Attendance Sheet

我目前正在使用 matchTemplate,它使用一个奇异的黑点来找到所有填充的点(图像首先转换为灰度)。下图

Dots Matched

然后我操作 matchPattern 数组并获得每个数组在 y 方向上的大致中心,我可以看到与缺失学生相对应的间隙。

我遇到的问题是,确定这种排序适用于完美的输入,但我的目标是能够拍摄一张纸的照片并对其进行处理? 注意:考勤表是我制作的,因此可以根据需要进行更改/修改。

我附上了一个示例图像来匹配下面看到的。 test match 使用我当前的方法只是一场灾难(见下文)。现在我不确定从这里去哪里我尝试修改阈值但超过 .65 它无法找到任何图像。 fail

import cv2
import numpy as np
from matplotlib import pyplot as plt

values = []
img_rgb = cv2.imread('/home/user/Downloads/input.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('/home/user/Downloads/input_2.png',0)
w, h = template.shape[::-1]

res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.6
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
  cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
  values.append(pt[1]+h/2)

cv2.imwrite('output.png',img_rgb)
values.sort()
pivot = values[0]
count = 1
total = values[0]
cleaned = []

for x in range(1,len(values)):
  if(values[x] < pivot+20):
    pivot = values[x]
    count = count + 1
    total = total + values[x]
  else:
    print values[x]
    cleaned.append(int(total/count))
    pivot = values[x]
    count = 1
    total = values[x]

  if x == len(values)-1:
    cleaned.append(int(total/count))
print values
print cleaned

这是另一个测试图像: enter image description here

最佳答案

通常,在分析纸质表格时,页边距和表格角上的特殊标记用于识别有意义部分的比例和方向。例如,您可以在表格的边框上打印几个黑色小方 block ,用相同的 cv2.matchTemplate 找到它们,从而定义感兴趣区域。

很可能您的表单不会被完美捕获(例如,它们可能会被缩放、旋转或以透视方式查看),因此您还需要规范化输入。您可以使用 perspective or affine transformations为了这。

您可能还想通过使用直方图均衡化去噪 和其他技术来增强图像。

此时您应该拥有完全标准化的图像,它更接近于“完美输入”。您可以在此输入上尝试您的算法,但也有更简单的方法(AFAIK,类似的东西在实际应用程序中用于自动表单分析)。

你的表单有固定的布局,你已经知道它的角落。那么为什么不计算表格中每个有趣部分的位置呢?例如。在下图中,我在表格的角落放置了 4 个黑色地标。在规范化图像中,虚线区域的位置将始终相对于这些地标相同

enter image description here

查明学生是否在听课非常简单,只需将虚线区域分成固定的正方形区域(每个学生一个),对该区域的像素值求和并将该值与预定义的阈值进行比较。具有较低值的区域往往是黑人多于白人(学生参加了讲座),而具有高值的区域很可能是白人(学生缺席)。

总结一下:

  1. 使用地标来定义纸张的角。
  2. 根据这些地标规范化图像。
  3. 根据需要增强图像。
  4. 计算感兴趣区域的位置。
  5. 确定区域是否更可能是黑色或白色。

关于python - OpenCV 找到彩色圆圈和位置值 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720633/

相关文章:

python - 使用不同的参数创建一个类的多个对象

arrays - 排序数组中的最低成本累积路径

javascript - Node.js,OpenCV 尝试使用 toBuffer() 函数将矩阵转换为缓冲区

c++ - 将多行附加到 openCV 矩阵

python ,matplotlib : specgram data array values does not match specgram plot

python - 从嵌套列表转换为分隔字符串

python - CrossRef API 追踪 DOI 引文

algorithm - 水库取样

algorithm - 小数据量压缩算法

c++ - 打开后如何聚焦opencv窗口?