

パーティクルフィルタを用いて白物体の追跡を行いたいのですが、実行の際にエラーが出てしまい原因がわからず止まっています。原因がわかる方いらっしゃったら教えていただきたいです。

実行環境はJupyter Labになります。

**エラーメッセージ:**

[code]

    IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
    
[/code]

**コード:**

[code]

    import numpy as np
    import cv2
    
    def tracking():
        cap = cv2.VideoCapture("tennisu.mp4")
        #パーティクルフィルタ初期化
        filter = ParticleFilter()
        filter.initialize()
    
        while True:
            ret, frame = cap.read()
            gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
            y, x = filter.filtering(gray)#トラッキング
            frame = cv2.circle(frame, (int(x), int(y)), 10, (0, 0, 255), -1)
            for i in range(filter.SAMPLEMAX):
                frame = cv2.circle(frame, (int(filter.X[i]), int(filter.Y[i])), 2, (0, 0,          255), -1)
            cv2.imshow("frame", frame)
            if cv2.waitKey(20) & 0xFF == 27:
                break
        cap.release()
        cv2.destroyAllWindows()
    
    #パーティクルフィルタクラス
    class ParticleFilter:
        def __init__(self):
            self.SAMPLEMAX = 1000
            self.height, self.width = 1440,2560#フレーム画像のサイズ
    
        #パーティクル初期化
        #画像全体にまく
        def initialize(self):
            self.Y = np.random.random(self.SAMPLEMAX) * self.height
            self.X = np.random.random(self.SAMPLEMAX) * self.width
    
        #パーティクルの状態の更新　物体が適当な速さで適当に動くと仮定
        def modeling(self):
            self.Y += np.random.random(self.SAMPLEMAX) * 20 - 10
            self.X += np.random.random(self.SAMPLEMAX) * 20 - 10
    
        #重み正規化
        def normalize(self, weight):
            return weight / np.sum(weight)
    
        #パーティクルリサンプリング
        #重みに従ってパーティクルを選択
        #残ったパーティクルのインデックスを返す
        def resampling(self, weight):
            index = np.arange(self.SAMPLEMAX)
            sample = []
    
            for i in range(self.SAMPLEMAX):
                idx = np.random.choice(index, p=weight)
                sample.append(idx)
    
            return sample
    
        #尤度計算
        #画像の外に飛んでいったパーティクルは重み0
        #白い物体を仮定
        def calcLikelihood(self, image):
            mean, std = 250.0, 10.0
            intensity = []
    
            for i in range(self.SAMPLEMAX):
                y, x = self.Y[i], self.X[i]
                if y >= 0 and y < self.height and x >= 0 and x < self.width:
                    intensity.append(image[y,x])
                else:
                    intensity.append(-1)
    
            weights = 1.0 / np.sqrt(2 * np.pi * std) * np.exp(-(np.array(intensity) - mean)**2 /(2 * std**2))
            weights[intensity == -1] = 0
            weights = self.normalize(weights)
            return weights
    
        #トラッキング開始
        #期待値を返す
        def filtering(self, image):
            self.modeling()
            weights = self.calcLikelihood(image)
            index = self.resampling(weights)
            self.Y = self.Y[index]
            self.X = self.X[index]
            
            return np.sum(self.Y) / float(len(self.Y)), np.sum(self.X) / float(len(self.X))
    
    tracking()
    
[/code]


CC BY-SA 4.0
2022-07-25T04:44:06.170
90180
2022-07-25T07:19:32.600
2022-07-25T04:55:38.593
3060
53674
question
python python3 opencv
python、パーティクルフィルタについての質問


求めている答えなのかが分かりませんが、  
エラー内容から、calcLikelihoodメソッド内の

[code]

    intensity.append(image[y,x])
    
[/code]

部分で、imageは、only integers（整数型）なので、floatであるy, xはダメなのでエラーが発生しています。

直前の部分を

[code]

    y, x = int(self.Y[i]), int(self.X[i])
    
[/code]

とすれば動作するとは思います。


CC BY-SA 4.0
2022-07-25T07:19:32.600
90185
2022-07-25T07:19:32.600
32891
90180
answer