2011-12-11 49 views
5

雖然通常爲OpenCV的(CV2)新的Python綁定是一個美女,「面具」似乎並沒有正常工作 - 除非我真的得到一些錯誤:蟒蛇opencv cv2中的面具不工作?

例如「cv2.add」仍然有效正確不帶口罩:

import cv2 
a = ones((2,2,3), dtype=uint8) 
cv2.add(a,a) 

正確給

array([[[2, 2, 2], 
     [2, 2, 2]], 

     [[2, 2, 2], 
     [2, 2, 2]]], dtype=uint8) 

但是當你添加蒙版(和出數組「b」 - 這是由需要某種原因沒有分配)你一個隨機的結果,即結果改變時,你運行該命令多次

myMask = zeros(a.shape[0:2], dtype = uint8) 
mask[1,1] = 255 
b = zeros(a.shape) 
cv2.add(a,a,b,myMask) 
cv2.add(a,a,b,myMask) 

給我的機器上(Win7的,32位,Python 2.7版,OpenCV的2.3.1)

In [34]: cv2.add(a,a,b,myMask) 
Out[34]: 
array([[[ 26, 0, 143], 
     [ 5, 216, 245]], 

     [[156, 5, 104], 
     [ 2, 2, 2]]], dtype=uint8) 

In [35]: cv2.add(a,a,b,myMask) 
Out[35]: 
array([[[35, 0, 0], 
     [ 0, 3, 0]], 

     [[ 0, 0, 3], 
     [ 2, 2, 2]]], dtype=uint8) 

...並在下次試用一些新的東西。現在,無論我遇到嚴重錯誤,還是存在嚴重的cv2綁定問題。

有什麼建議嗎?

+0

看起來像一個CV2問題,寧願直接在他們的網站上報告問題,而不是在stackoverflow上發佈錯誤! :) – tito

+0

完成 - 感謝提示,我沒有意識到你可以在那裏發佈錯誤(即發佈「門票」)。 – thomash

回答

0

爲什麼不使用numpy(inplace)蒙面表達式?

b = array(a, copy=True) 
b[mask] += a 

掩模是一個布爾陣列,模擬在OpenCV中(cv2.add),其中一個值被改變時掩模= 0

PS:然而,您的代碼在我的機器細(Win7的64 Python 2.6(32bit),OpenCV 2.3.0)雖然

5

它是一個有趣的問題。我看到了同樣的問題。我發佈了一個bug並得到了答覆。 http://code.opencv.org/issues/1748

該解決方案很簡單。 dst數組在創建時未定義,並且該操作僅更改掩碼(p)!= 0的那些目標數組像素p。

所以唯一可行的機制是在添加之前預先製作dst。 也就是說

dst = np.zeros(...) 
dst = cv2.add(a, a, dst=dst, mask=mask) 

下一個版本將清除新創建的操作的圖像,如cv2.add,cv2.subtract,cv2.bitwise_and /或/ XOR - 所以它沒有問題的工作。

我的代碼如下所示:

import cv2 
import numpy as np 
import time 

a = np.ones((2,2,3), dtype=np.uint8) 

print "simple add" 
t = time.time() 
for i in range(10000): 
    b = cv2.add(a,a) 
print "%5.4f seconds" % (time.time()-t) 
print b 

print "\nnumpy add" 
t = time.time() 
for i in range(10000): 
    b = a+a 
print "%5.4f seconds" % (time.time()-t) 
print b 

# make mask same dimensions but 1 byte deep(not three) 
mask = np.zeros(a.shape[:-1], dtype=np.uint8) 
mask[1,1] = 255 

print "\nmask", mask.shape 
print mask 

print "\nmasked add - uninitialised" 
t = time.time() 
for i in range(10000): 
    b = cv2.add(a,a,mask=mask) 
print "%5.4f seconds" % (time.time()-t) 
print b 
print "uninitialised entries are unmodified - so random.\n Inconsistent when run more than once." 
print "same calc a second time..." 
b = cv2.add(a,a,mask=mask) 
print b 

print "\nmasked add - using preinitialised dst" 
t = time.time() 
b = a.copy() 
for i in range(10000): 
    b = cv2.add(a,a,b,mask=mask) 
print "%5.4f seconds" % (time.time()-t) 
print b 
print "Consistent when run more than once." 
print "same calc a second time..." 
b = a.copy() 
b = cv2.add(a,a,b,mask=mask) 
print b 

FYI:計時(10K重複):

cv2.add - no mask   0.0120 seconds 
cv2.add - with mask   0.0160 seconds 
np.add      0.0190 seconds 
cv2.add - uninitialised mask 0.0220 seconds 

FYI:提交下列指示錯誤的位置: http://code.opencv.org/projects/OpenCV/wiki/WikiStart

+0

編輯並更新錯誤報告響應。 – Neon22