2010-08-22 54 views
5

我最近採取了一些代碼,基於OpenCV c + +顏色跟蹤對​​象,並重寫它在python綁定。OpenCV Python綁定通過圖像數據令人難以置信的緩慢迭代

整體結果和方法顯然是相同的負語法。但是,當我在視頻的每個幀上執行下面的代碼時,需要將近2-3秒才能完成,因爲C++變體(也在下面)是即時比較的,我可以在幀之間迭代的速度與我的手指可以按下鍵。

任何想法或意見?

cv.PyrDown(img, dsimg) 
    for i in range(0, dsimg.height): 
     for j in range(0, dsimg.width): 

      if dsimg[i,j][1] > (_RED_DIFF + dsimg[i,j][2]) and dsimg[i,j][1] > (_BLU_DIFF + dsimg[i,j][0]): 
       res[i,j] = 255 
      else: 
       res[i,j] = 0 

for(int i =0; i < (height); i++) 
    { 
     for(int j = 0; j < (width); j++) 
     { 
      if(((data[i * step + j * channels + 1]) > (RED_DIFF + data[i * step + j * channels + 2])) && 
       ((data[i * step + j * channels + 1]) > (BLU_DIFF + data[i * step + j * channels]))) 
       data_r[i *step_r + j * channels_r] = 255; 
      else 
       data_r[i * step_r + j * channels_r] = 0; 
     } 
    } 

感謝

回答

6

嘗試使用numpy的做你的計算,而不是嵌套循環。從numpy這樣簡單的計算就可以得到像C一樣的性能。

例如,你嵌套的for循環可與一對夫婦numpy的表情所代替......

我並不十分熟悉OpenCV的,但我認爲Python綁定現在有一個numpy的陣列接口,所以你上面的例子應該是簡單:

cv.PyrDown(img, dsimg) 

data = np.asarray(dsimg) 
blue, green, red = data.T 

res = (green > (_RED_DIFF + red)) & (green > (_BLU_DIFF + blue)) 
res = res.astype(np.uint8) * 255 

res = cv.fromarray(res) 

(沒有經過充分測試,當然...)再次,我真的不是非常有OpenCV的familar,但對循環嵌套蟒是不會去的路上不管...

希望能幫助一下,反正!

+0

這肯定會加快速度,但我似乎無法弄清楚爲什麼結果與我的圖像的閾值更密切相關,並且它看起來應該沒有找到圖像上的綠色區域? – bluth 2010-08-22 21:50:41

+0

我可能誤解了圖像的紅色,綠色和藍色通道的順序(從上面的代碼看來,藍色是第一個通道,紅色是最後一個通道)也許嘗試拆包「數據」數組爲「紅色,綠色,藍色= data.T」?只是一個瘋狂的猜測......我可能是完全錯誤的,那裏... – 2010-08-22 22:08:06

+0

是的,這是我最初的想法,但改變順序不會產生不同的結果。 _RED_DIFF和_BLU的值很高,爲155,因此圖像內部不應該有很多白色像素,但仍然存在;當我把_DIFF放在255時,它幾乎全是白色的?我似乎無法理解res =(green>(_RED_DIFF + red))&(green>(_BLU_DIFF + blue))的結果。 – bluth 2010-08-22 22:19:14

相關問題