この記事では、PythonとOpenCVを使用して画像内の物体をカウントする方法について説明します。
必要なライブラリ
今回使用するのはOpenCVのみです。
画像内物体の個数を数える方法
基本的な考え方は以下の通りです。
- 画像をモノクロ画像として読み込み、ある閾値で二値化(白と黒だけの画像に)する
- ①で作成した画像の輪郭を抽出する
- ②で抽出した輪郭の数を数える
サンプルコード
以下にサンプルコードを示します。
# ライブラリインポート
import cv2
import numpy as np
# 物体の個数を数える
img = cv2.imread('base_file.jpg', cv2.IMREAD_GRAYSCALE)
h, w = img.shape[:2]
# 二値化する際の輝度閾値
thresh_value = 50
# 二値化
thresh, img_thresh = cv2.threshold(img, thresh_value, 255, cv2.THRESH_BINARY)
# 輪郭抽出
contours, hierarchy = cv2.findContours(img_thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 輪郭の個数を表示
print(len(contours))
# 検出できた物体確認用の画像作成
black_img = np.zeros((h, w), np.uint8)
for i in range(len(contours)):
cv2.drawContours(black_img, contours, i, 255, -1)
cv2.imwrite('contours.jpg', black_img)
このコードは、指定した画像(’base_file.jpg’)を読み込み、物体の個数をカウントします。
注意点
閾値が小さすぎると輪郭をきれいに検出できず、それが物体個数の算出に悪影響を与える可能性があります。また、閾値が大きすぎると輪郭そのものを検出できず、正しく物体個数を算出することができません。このため、閾値を変えながら何度か繰り返して輪郭がきれいにとれていそうな設定を見つける必要があります。
以上、PythonとOpenCVを使用して画像内の物体をカウントする方法について説明しました。画像処理の際などにぜひご活用ください。