2017-11-04 10 views
1

ビデオのオブジェクトを色で追跡しようとしています。私はこのコードを単純化することができますので、同じようforループのイメージマスキングを、Pythonの論理インデックスに置き換えるにはどうすればよいですか?

while True: 
    ret, frame = cap.read() 
    if not ret: 
     break 
    height, width, channel = frame.shape 
    hue = cv2.cvtColor(frame, cv2.COLOR_RGB2HSV) 
    for i in range(width): 
     for j in range(height): 
      if (hue[j, i, 0] < 110 or hue[j, i, 0] > 140): 
       hue[j, i, 0] = 0 
       hue[j, i, 1] = 0 
       hue[j, i, 2] = 0 
+1

[numpy docs on logical indexing](https://docs.scipy.org/doc/numpy-1.13.0/user/basics.indexing.html)があなたに答えてくれないのは何ですか?そこにある例を試してみてください。それらの例と混同している点がある場合は、それらを明示的に投稿してください。 –

+0

とにかく '色相[(色相<110)| (色相> 140)] = 0'はあなたが探しているものです。編集:実際には、以下の解決策は、あなたが最初のチャンネルに基づいてのみマスキングしていたという事実に注目しています。 –

+0

@AlexanderReynolds OPは、「色相」の最初のチャンネルに沿ってのみインデックスを作成しています。だから、そこには色相[...、0]が必要です。 – Divakar

答えて

0

は、forループmaskingとネストされた2取り除く - (hue[...,0] < 110) | (hue[...,0] >140)で作成したマスクは同じ形状のものになるので

hue[(hue[...,0] < 110) | (hue[...,0] >140)] = 0 

これは動作しますhueの最初の2つのぼかしとそれはhueにマスキングするために使用され、最初の2つのぼかしに沿ってインデックスされ、最後の軸に沿ったすべての要素に適用されます。これは、3つのステップの割り当ての仕事を行います:hue[j, i, 0] = 0; hue[j, i, 1] = 0; hue[j, i, 2] = 0;一度に。

+0

ありがとう、私はドキュメンテーションを使いましたが、私がPythonを初めて使ったときには、それはあまりにも圧倒的でした。 –

関連する問題