我需要使用 Python 為我的高中假期專案制作一個 OMR 檢測系統(如果它足夠可靠,可能會在某種程度上被學校使用),我已經做了很多研究,并且已經嘗試過了從輪廓到模板匹配的一切,我覺得模板匹配作業正常,但它只能檢測 OMR 表中許多圓中的一個,有人可以幫助我弄清楚如何檢測多個(所有)圓(無論它們是否是冒泡與否),在 omr 表及其各自的坐標中,這對我來說就足夠了。 
我嘗試過的:
import numpy as np
import cv2
img = cv2.resize(cv2.imread('assets/omr_match1.jpg', 0), (0, 0), fx=0.2, fy=0.5)
template = cv2.resize(cv2.imread('assets/circle.jpg', 0), (0, 0), fx=0.2, fy=0.5)
h, w = template.shape
methods = [cv2.TM_CCOEFF, cv2.TM_CCOEFF_NORMED, cv2.TM_CCORR,
cv2.TM_CCORR_NORMED, cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]
methods=methods[0]
# This is one among the above which works perfectly
for method in methods:
img2 = img.copy()
result = cv2.matchTemplate(img2, template, method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
location = min_loc
else:
location = max_loc
bottom_right = (location[0] w, location[1] h)
cv2.rectangle(img2, location,bottom_right, 0, 1)
cv2.imshow('Match', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
#圓.jpg

見上圖,只標記了一個隨機圓圈,而不是所有圓圈。
uj5u.com熱心網友回復:
開始了:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('/path/tabela_circle.jpg', 0)
template = cv2.imread('/path/circle.jpg', 0)
h, w = template.shape
res = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where( res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] w, pt[1] h), (0,0,255), 2)
cv2.imwrite('res.png',img)

也適用于僅檢測答案:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/313201.html
標籤:Python opencv 计算机视觉 物体检测 奥姆
下一篇:在一個視窗中顯示多個攝像頭
