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()`はループ外で呼び出すことを忘れずに実行しましょう。


コメント