2017-07-20 13 views
0

学習するpython 3.Xを趣味として。私はそれが画面上の特定の色を検出するために、リアルタイムで実行したいPythonはforループからnumpyに入れ子になっています

 im = Image.open("photo.jpg").convert('RGB').Load 
     for x1, y1 in product(range(300, 1100, 1), range(200, 500, 1)): 
      r,g,b =im[x1,y1] 
      rx,gx,bx = 200, 20, 20 
      if abs(rx - r)<=5 and abs(gx - g)<=5 and abs(bx - b)<=5: 
       do stuff 
       break 

:私はシンプルpixelsearchを書きました。しかし、それは少し遅いです。 iteretools.productをnumpyに置き換えようとしました。

 for y in np.arange(200,500,1): 
      for x in np.arange(300,1100,1): 
       r,g,b =im[x1,y1] 

ただし、「タイプエラー:整数が必要です」というエラーが表示されます。 私は何が間違っていますか?パフォーマンスを向上させるためにnumpyに変換する正しい方法です

+0

最初に、 'x1'と' y1'はループ変数の名前を 'x'と' y'に変更したので、2番目の部分では定義されていません。 2番目にはまだループがあります。パフォーマンスを向上させるには、これらを取り除き、ベクトル化された操作に置き換える必要があります。そうしないと、パフォーマンスが向上しません。しかし、あなたを助けるためには、「何をするか」が何であるかを知る必要があります。 – jotasi

答えて

0

あなたがそうのように、pre-processingステップとしてベクトル化の方法でマッチのマスクを得ることができる -

mask = (np.abs(im[300:1100, 200:500] - [200,20,20]) <= 5).all(-1) 

を次に、ループ時に、このマスクを使用する -

for yi,y in enumerate(np.arange(200,500,1)): 
    for xi,x in enumerate(np.arange(300,1100,1)): 
     if mask[xi,yi]: 
      #do something 

をので、アイデアがありますネストされたループの内部で作業を最小限に抑えます。また、「何か」の詳細については、これらの操作をベクトル化し、さらにパフォーマンスを向上させることも可能です。

+0

'do stuff'はマウスをrx、gx、bxの色と一致するピクセルに移動するだけです。 また、ありがとうございます。それを試してみる:) – blr69

+0

@ blr69任意の更新プログラムは? – Divakar

+0

と入力してエラーが発生しました。 'mask =(np.abs(im [300:1100,200:500] - [200,20,20])<= 5).all(-1) TypeError:整数'が必要です' – blr69

関連する問題