def find_pentagons(contours): pentagons = [] for ctr in contours: area = cv2.contourArea(ctr) # area test if area < 400: continue simp_ctr = cv2.approxPolyDP(ctr, 3, True) simp_area = cv2.contourArea(simp_ctr) if simp_area < 400: continue if len(simp_ctr) != 5: continue edges = [ LA.norm(a - b) for a, b in zip(simp_ctr, np.roll(simp_ctr, 2)) ] ratios = [(1 - e / edges[0])**2 for e in edges] passr = [r for r in ratios if r > 0.2] if len(passr) > 0: continue pentagons.append(simp_ctr) return pentagons if __name__ == "__main__": cam = OpenCV_Cam() cam.cam_loop(contour_proc)
return frame def find_milkbox(contours): pentagons = [] for ctr in contours: vecs = zip(ctr, np.roll(ctr, 1)) normalized_vecs = [] for vec in vecs: length = LA.norm(vec[0] - vec[1]) norm_vec = (vec[0] - vec[1]) / length normalized_vecs.append(norm_vec) paired_vecs = zip(normalized_vecs, np.roll(normalized_vecs, 2)) count = 0 for pair in paired_vecs: angle = np.inner(pair[0], pair[1]) if angle < 0.05: count = count + 1 if count != 2: continue pentagons.append(ctr) return pentagons if __name__ == "__main__": cam = OpenCV_Cam() cam.cam_loop(contour_proc)