14

Python 2.7.9 で OpenCV 3.0.0 を使用しています。背景が静止しているビデオ内のオブジェクトを追跡し、そのプロパティのいくつかを推定しようとしています。画像には複数の移動オブジェクトが存在する可能性があるため、それらを区別して、ビデオの残りのフレーム全体で個別に追跡できるようにしたいと考えています。

私ができると思った 1 つの方法は、画像をバイナリに変換し、ブロブ (この場合は追跡対象のオブジェクト) の輪郭を取得し、オブジェクトの境界の座標を取得することでした。次に、グレースケール画像でこれらの境界座標に移動し、その境界で囲まれたピクセル強度を取得し、他のフレームでこの色のグラデーション/ピクセル強度を追跡できます。このようにして、2 つのオブジェクトを互いに分離しておくことができるので、次のフレームで新しいオブジェクトと見なされなくなります。

輪郭の境界座標がありますが、その境界内のピクセル強度を取得する方法がわかりません。誰かがそれを手伝ってくれませんか?

ありがとう!

4

3 に答える 3

27

私たちのコメントに従って、できることはnumpy配列のリストを作成することです。各要素は、各オブジェクトの輪郭の内部を表す強度です。具体的には、輪郭ごとに、輪郭の内部を塗りつぶすバイナリ マスクを作成し、(x,y)塗りつぶされたオブジェクトの座標を見つけてから、画像にインデックスを付けて強度を取得します。

コードをどのように設定したかは正確にはわかりませんが、 と呼ばれるグレースケールの画像があると仮定しましょうimg。グレースケール画像で機能するため、画像をグレースケールに変換する必要がある場合がありcv2.findContoursます。cv2.findContoursこれで、通常どおり呼び出します。

import cv2
import numpy as np

#... Put your other code here....
#....

# Call if necessary
#img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Call cv2.findContours
contours,_ = cv2.findContours(img, cv2.RETR_LIST, cv2.cv.CV_CHAIN_APPROX_NONE)

contoursは 3Dnumpy配列のリストになり、それぞれのサイズN x 1 x 2N各オブジェクトの輪郭点の総数です。

そのため、次のようにリストを作成できます。

# Initialize empty list
lst_intensities = []

# For each list of contour points...
for i in range(len(contours)):
    # Create a mask image that contains the contour filled in
    cimg = np.zeros_like(img)
    cv2.drawContours(cimg, contours, i, color=255, thickness=-1)

    # Access the image pixels and create a 1D numpy array then add to list
    pts = np.where(cimg == 255)
    lst_intensities.append(img[pts[0], pts[1]])

輪郭ごとに、空白の画像を作成し、この空白の画像に塗りつぶされた輪郭を描画します。thicknessパラメータを -1 に指定することで、等高線が占める領域を埋めることができます。等高線の内部を 255 に設定しました。その後、numpy.where特定の条件に一致する配列内のすべての行と列の位置を見つけるために使用します。この場合、255 に等しい値を見つけたいと考えています。その後、これらのポイントを使用して画像にインデックスを付け、輪郭の内側にあるピクセル強度を取得します。

lst_intensitiesnumpy各要素が各オブジェクトの輪郭の内部に属する強度を提供する1D 配列のリストが含まれています。各配列にアクセスするには、アクセスしたい輪郭がlst_intensities[i]どこにあるかを実行するだけです。i

于 2015-10-21T05:56:53.537 に答える