python opencv cv2中的掩码不工作?

python opencv cv2中的掩码不工作?,python,opencv,Python,Opencv,一般来说,opencv(cv2)的新python绑定很漂亮,“掩码”似乎不能正常工作,除非我真的出了什么问题: 例如,“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) 但是,当您添加一个

一般来说,opencv(cv2)的新python绑定很漂亮,“掩码”似乎不能正常工作,除非我真的出了什么问题:

例如,“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)
但是,当您添加一个掩码(并且由于某种原因而需要的out数组“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)

。。。在下一次试验中有新的东西。现在要么我有严重的错误,要么cv2绑定有严重的问题

有什么建议吗?

为什么不使用numpy(就地)蒙面表达

b = array(a, copy=True)
b[mask] += a
mask是一个布尔数组,在opencv(cv2.add)中模拟,当mask!=0


PS:然而,您的代码在我的机器(Win7 64、Python 2.6(32位)、OpenCV 2.3.0)中运行良好,尽管这是一个有趣的问题。我也看到了同样的问题。我发布了一个bug并得到了回复

解决办法很简单。dst阵列在创建时未定义,该操作仅更改目标阵列像素p,该掩码(p)=0

因此,唯一有效的机制是在添加之前预先进行dst。 即

下一个版本将在诸如cv2.add、cv2.subtract、cv2.bitwise_和/或/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
供参考:计时(10k重复):

仅供参考:在此处提交以下说明:

看起来像是cv2问题,更愿意直接在其网站上报告问题,而不是在stackoverflow上发布错误!:)完成-谢谢你的提示,我没有意识到你可以在那里发布bug(即发出“罚单”)。
dst = np.zeros(...)
dst = cv2.add(a, a, dst=dst, mask=mask)
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
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