OpenCVを使用してPythonで画像内のオブジェクト(物体)の数をカウントしてみます。
画像内のオブジェクト(物体)を見つけるために、外形が必要となります。外形を見つけるためには、外部輪郭が必要となり、これは画像の最も外側のエッジです。外部輪郭を見つけることで、画像内のオブジェクト(物体)が区別されます。
OpenCVモジュールは、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つのオブジェクト(物体)が表示されていましたので、全てのオブジェクト(物体)が取得できたということになります。
コメント