OpenCVを使用してPythonで画像内のオブジェクト(物体)の数をカウントする

OpenCVを使用してPythonで画像内のオブジェクト(物体)の数をカウントしてみます。

画像内のオブジェクト(物体)を見つけるために、外形が必要となります。外形を見つけるためには、外部輪郭が必要となり、これは画像の最も外側のエッジです。外部輪郭を見つけることで、画像内のオブジェクト(物体)が区別されます。

OpenCVモジュールは、Pythonの標準ライブラリではありませんので、事前にインストールする必要があります。

■Python

Pythonバージョン

今回のPythonのバージョンは、「3.8.2」を使用しています。(Windows10)

■画像を用意する

OpenCVモジュールを使用してPythonで画像内のオブジェクト(物体)の数をカウントする前に、オブジェクト(物体)が表示されている画像を用意します。

今回は「square_sample.png」という4つのオブジェクト(物体)が表示されている画像を用意しました。保存されている場所は「C:\Users\user\test(フォルダパス)」です。

■OpenCVモジュールを使用し画像内のオブジェクト(物体)の数をカウントする

画像の用意ができましたので、OpenCVモジュールを使用し画像内のオブジェクト(物体)の数をカウントするスクリプトを書いていきます。

■コード

import cv2

image = cv2.imread(r"C:\Users\user\test\square_sample.png")

gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray,50,200)

contours, hierarchy= cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

count_objects_image = len(contours)

print("画像内のオブジェクト数:",str(count_objects_image))

インポートで、cv2(OpenCV)モジュールを呼び出して、imageという変数を作成し、imread()関数で今回用意した画像を読み込みます。

次に読み込んだ画像をgrayという変数に収納し、cvtColor()関数でグレースケール形式の画像に変換します。変換後、edgesという変数を作成し、Canny()関数で、Canny法によるエッジ検出をします。エッジ検出により、画像を単純化します。

エッジ検出を行った後は、cv2.findContours ()関数で、画像内のすべての外部輪郭を検出し、画像内の一意のオブジェクト(物体)を検索、検出します。()内の「cv2.RETR_EXTERNAL」は輪郭の中で、最も外側の輪郭のみを抽出します。「cv2.CHAIN_APPROX_NONE」は、輪郭の出力に、全ての検出点を含めることができます。

画像のすべての外部輪郭を検索、検出した後は、contours変数で情報を保持します。

contours変数で情報を保持した後は、number_of_objects_in_image変数で、オブジェクト(物体)の要素数を取得するために、len() 関数を使います。

最後に、print関数で取得したオブジェクト(物体)の要素数を出力します。

■実行

今回書いたスクリプトを「count_objects.py」という名前で保存し、コマンドプロンプトから実行してみます。

実行してみると、「画像内のオブジェクト数:4」という結果が出力されました。今回用意した画像には4つのオブジェクト(物体)が表示されていましたので、全てのオブジェクト(物体)が取得できたということになります。

コメント

タイトルとURLをコピーしました