Python OpenCVを使った複数物体の輪郭検出と処理方法

プログラミング

PythonのOpenCVライブラリを使用して、複数物体の輪郭を検出し、それぞれに処理を施す方法について解説します。質問者様が直面している問題は、複数物体の輪郭が1つしか表示されないということですが、これはコード内でループ処理がうまく働いていないためです。以下では、輪郭検出の改善方法をステップバイステップで紹介します。

問題の概要

提供されたコードでは、複数物体の輪郭が正しく処理されていない問題が発生しています。特に、forループ内で`cv2.drawContours()`を使用していますが、この部分が意図した通りに動作していない可能性があります。

輪郭検出の基本的な流れ

まず、OpenCVで画像を読み込んだ後、グレースケール化し、二値化処理を行い、輪郭を検出します。その後、輪郭ごとに処理を行い、結果を画像に表示します。この流れは問題なく動作するはずですが、質問者様のコードでは処理画像が1つの輪郭にしか表示されませんでした。

必要な修正

コードの修正には、以下の点を確認してください。

  • 輪郭をループ処理する部分: `contours`のリストを適切にループし、各輪郭に対して`cv2.drawContours()`を実行することで、すべての物体の輪郭が処理されます。
  • 画像の再表示: `cv2.imshow()`はループ外で実行して、すべての輪郭が描かれた後に表示されるようにします。これにより、途中で画像が更新されず、最終的な画像が表示されます。

修正後のコード例

以下は修正後のコード例です。これにより、すべての物体の輪郭が正しく処理され、表示されるようになります。

import cv2
import numpy as np

img = cv2.imread('path_to_image')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(binary, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

result_image = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)

for contour in contours:
    area = cv2.contourArea(contour)
    if area > 300:
        color = (0, 0, 255)  # Red for large objects
    elif area > 200:
        color = (0, 255, 0)  # Green for medium objects
    else:
        color = (0, 0, 0)  # Black for small objects
    cv2.drawContours(result_image, [contour], -1, color, 2)

cv2.imshow('Processed Image', result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

まとめ

このように、OpenCVを使った輪郭検出のコードでは、物体ごとの処理が正しくループで行われることが重要です。`cv2.drawContours()`をループ内で適切に実行することで、複数物体の輪郭を処理し、正しく表示することができます。さらに、処理が終わった後に画像を表示するため、`cv2.imshow()`はループ外で呼び出すことを忘れずに実行しましょう。

コメント

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