def __detect_match_chunks(self, max_error=.04):
percent = cv2.imread("assets/pct.png")
corr_series = []
for (time, scene) in spaced_frames(self, interval=self.polling_interval):
cv2.imwrite("scene.png", scene)
scene = cv2.imread("scene.png")
scaled_percent = cv2.resize(
percent, (0, 0), fx=self.scale, fy=self.scale)
scaled_percent = cv2.Canny(scaled_percent, 50, 200)
percent_corrs = []
for port_number, roi in enumerate(self.ports):
if roi is not None:
scene_roi = scene[roi.top:roi.bottom, roi.left:roi.right]
scene_roi = cv2.Canny(scene_roi, 50, 200)
corr_map = cv2.matchTemplate(
scene_roi, scaled_percent, cv2.TM_CCOEFF_NORMED)
_, max_corr, _, max_loc = cv2.minMaxLoc(corr_map)
percent_corrs.append(max_corr)
point = [time, max(percent_corrs)]
corr_series.append(point)
corr_series = np.array(corr_series)
def moving_average(series, n=5):
return np.convolve(series, np.ones((n,)) / n, mode='valid')
medians = rolling_median(corr_series[:, 1], self.min_gap // self.polling_interval, center=True)[2:-2]
clusters = DBSCAN(eps=0.05, min_samples=10).fit(medians.reshape(-1, 1))
centers = kmeans.cluster_centers_
points = zip([time + (self.min_gap / 2)
for time, corr in corr_series], kmeans.labels_)
# Throw out the lowest cluster
groups = [(k, list(v))
for k, v in groupby(points, lambda pt: centers[pt[1]] > max(min(centers), .2))]
games = [[v[0][0], v[-1][0]] for k, v in groups if k]
return games
评论列表
文章目录