img = cv2.imread('video/frame_109.png')
BGR -> グレースケール
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
エッジ抽出 (Canny)
edges = cv2.Canny(gray, 18, 45, apertureSize=3)
cv2.imwrite('images/aaa/edges.png', edges)
膨張処理
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4))
edges = cv2.dilate(edges, kernel)
cv2.imwrite('images/aaa/edges2.png', edges)
輪郭抽出
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.imwrite('images/aaa/hierarchy.png', hierarchy)
面積でフィルタリング
rects = []
for cnt, hrchy in zip(contours, hierarchy[0]):
if cv2.contourArea(cnt) < 3000:
continue # 面積が小さいものは除く
if cv2.contourArea(cnt) > 15000:
continue
if hrchy[3] == -1:
continue # ルートノードは除く
# 輪郭を囲む長方形を計算する。
rect = cv2.minAreaRect(cnt)
rect_points = cv2.boxPoints(rect).astype(int)
rects.append(rect_points)
x-y 順でソート
rects = sorted(rects, key=lambda x: (x[0][1], x[0][0]))
描画する。
for i, rect in enumerate(rects):
color = np.random.randint(0, 255, 3).tolist()
cv2.drawContours(img, rects, i, color, 2)
cv2.putText(img, str(i), tuple(rect[0]), cv2.FONT_HERSHEY_SIMPLEX, 0.8, color, 3)
print('rect:\n', rect)
cv2.imwrite('images/aaa/frame_109.png', img)
コード
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/30 14:16
2019/12/02 03:19