私がやろうとしているのは、下の出席シートを処理して、誰がそこにいて誰がいないかを教えることです
私は現在、すべての塗りつぶされたドットを見つける単一の黒いドットを使用して matchTemplate を使用しています(画像は最初にグレースケールに変換されます)。下の画像
次に、matchPattern 配列を操作して、それぞれの y 方向のほぼ中心を取得します。欠落している生徒に対応するギャップがある場所を確認できます。
私が抱えている問題は、このようなものが完璧な入力のために機能することを確認していますが、私の目標は、物理的な紙の写真を撮ってこれを処理できるようにすることですか? 注: 出席シートは私が作成したものなので、必要に応じて変更/修正できます。
以下に示す一致するサンプル画像を添付しました。 私の現在の方法を使用することは、単なる災害です(以下を参照)。ここからどこに行けばよいかわかりません。しきい値を変更しようとしましたが、.65 を超えると画像が見つかりません。
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
別のテスト画像を次に示します。