質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

9307閲覧

Python2.7.10のIndexError: only integers, sliceの対処方

pythonBeginner

総合スコア13

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/04/08 13:33

編集2017/04/08 13:59

###前提・実現したいこと

Python2.7.10を使用してparticlefilterを実装したいです.

python + numpyで緑色の物体を追跡する (パーティクルフィルタ)
を参考にしてコードを書いたのですが、以下のエラーメッセージが表示されて困っています.

###発生している問題・エラーメッセージ

Traceback (most recent call last): File "C:\Users\tanaka_2\Documents\pythontests\ParticleTest.py", line 89, in <module> tracking() File "C:\Users\tanaka_2\Documents\pythontests\ParticleTest.py", line 15, in tracking y, x = filter.filtering(gray)#トラッキング File "C:\Users\tanaka_2\Documents\pythontests\ParticleTest.py", line 82, in filtering weights = self.calcLikelihood(image) File "C:\Users\tanaka_2\Documents\pythontests\ParticleTest.py", line 69, in calcLikelihood intensity.append(image[y,x]) IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

###該当のソースコード

Python

1#encoding:utf-8 2import numpy as np 3import cv2 4#エラー文は calcLikelihood():関数内 5 6def tracking(): 7 #カメラ 8 cap = cv2.VideoCapture(0) 9 #パーティクルフィルタ初期化 10 filter = ParticleFilter() 11 filter.initialize() 12 13 while True: 14 ret, frame = cap.read() 15 gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) 16 y, x = filter.filtering(gray)#トラッキング 17 frame = cv2.circle(frame, (int(x), int(y)), 10, (0, 0, 255), -1) 18 for i in range(filter.SAMPLEMAX): 19 frame = cv2.circle(frame, (int(filter.X[i]), int(filter.Y[i])), 2, (0, 0, 255), -1) 20 cv2.imshow("frame", frame) 21 if cv2.waitKey(20) & 0xFF == 27: 22 break 23 cap.release() 24 cv2.destroyAllWindows() 25 26#パーティクルフィルタクラス 27class ParticleFilter: 28 def __init__(self): 29 self.SAMPLEMAX = 1000 30 self.height, self.width = 480, 640#フレーム画像のサイズ 31 32 #パーティクル初期化 33 #画像全体にまく 34 def initialize(self): 35 self.Y = np.random.random(self.SAMPLEMAX) * self.height 36 self.X = np.random.random(self.SAMPLEMAX) * self.width 37 38 #パーティクルの状態の更新 物体が適当な速さで適当に動くと仮定 39 def modeling(self): 40 self.Y += np.random.random(self.SAMPLEMAX) * 20 - 10 41 self.X += np.random.random(self.SAMPLEMAX) * 20 - 10 42 43 #重み正規化 44 def normalize(self, weight): 45 return weight / np.sum(weight) 46 47 #パーティクルリサンプリング 48 #重みに従ってパーティクルを選択 49 #残ったパーティクルのインデックスを返す 50 def resampling(self, weight): 51 index = np.arange(self.SAMPLEMAX) 52 sample = [] 53 54 for i in range(self.SAMPLEMAX): 55 idx = np.random.choice(index, p=weight) 56 sample.append(idx) 57 58 return sample 59 60 #尤度計算 61 #画像の外に飛んでいったパーティクルは重み0 62 #白い物体を仮定 63#この関数内でエラー 64 def calcLikelihood(self, image): 65 mean, std = 250.0, 10.0 66 intensity = [] 67 68 for i in range(self.SAMPLEMAX): 69 y, x = self.Y[i], self.X[i] 70 #この下のintensity.append(image[y,x])でエラー 71 if y >= 0 and y < self.height and x >= 0 and x < self.width: 72 intensity.append(image[y,x]) 73 else: 74 intensity.append(-1) 75 76 weights = 1.0 / np.sqrt(2 * np.pi * std) * np.exp(-(np.array(intensity) - mean)**2 /(2 * std**2)) 77 weights[intensity == -1] = 0 78 weights = self.normalize(weights) 79 return weights 80 81 #トラッキング開始 82 #期待値を返す 83 def filtering(self, image): 84 self.modeling() 85 weights = self.calcLikelihood(image) 86 index = self.resampling(weights) 87 self.Y = self.Y[index] 88 self.X = self.X[index] 89 90 return np.sum(self.Y) / float(len(self.Y)), np.sum(self.X) / float(len(self.X)) 91 92tracking()

###試したこと
stackoverflowで似たような質問があったのですが、castをしてくれ的なことが書かれてるくらいしかわかりませんでした.

###補足情報(言語/FW/ツール等のバージョンなど)
使用OS:Windows8.1
Python2.7.10
OpenCV2.4.10
numpy (1.12.1)
pip(9.0.1)
setuptools(16.0)
wheel(0.29)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問に提示されたstackoverflowの回答のとおり、以下のようにcastしてはいかがでしょうか?

Python

1# y, x = self.Y[i], self.X[i] 2 y, x = int(self.Y[i]), int(self.X[i]) # int でcast 3 #この下のintensity.append(image[y,x])でエラー

ちなみにwebカメラのない&パッケージのバージョンの異なる環境でしたが、上記の修正は行わずに以下のように修正して動作させましたところエラーなく動作しました。

環境:Win10x64, python=2.7.13, opencv3=3.1.0, numpy=1.11.3

Python

1def tracking(): 2 # 略 3 filter.initialize() 4 5 frame = np.zeros((480,640,3), np.uint8) # 追加 6 7 while True: 8 #ret, frame = cap.read() # コメント 9 gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) 10 # 略

イメージ説明

投稿2017/04/08 14:05

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pythonBeginner

2017/04/08 14:06

迅速な回答かりがとうございます.さっそく試してみます
pythonBeginner

2017/04/08 15:23

キャストの方では問題を解決できませんでしたが, Pythonとライブラリの環境をcan110様と同じにしたところ frame = np.zeros((480,640,3), np.uint8) # 追加 を追加することで無事に動作しました.多大なご助力誠にありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問