2011-12-11 59 views
5

Trong khi nói chung các ràng buộc python mới cho opencv (cv2) là một vẻ đẹp, "mặt nạ" dường như không hoạt động đúng - trừ khi tôi thực sự hiểu sai:Mặt nạ trong python opencv cv2 không hoạt động?

Ví dụ "cv2.add" vẫn hoạt động đúng không có mặt nạ:

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

cho đúng

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

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

Nhưng khi bạn thêm một mặt nạ (và một mảng out "b" - đó là yêu cầu của đối với một số lý do không được phân định một trong hai) bạn nhận được một kết quả RANDOM, tức là kết quả thay đổi khi bạn chạy lệnh nhiều lần

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) 

cho trên máy tính của tôi (Win7, 32bit, 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) 

... và những điều mới mẻ về cuộc thử nghiệm tiếp theo. Bây giờ hoặc là tôi nhận được một cái gì đó nghiêm trọng sai, hoặc có một vấn đề nghiêm trọng với các ràng buộc cv2.

Mọi đề xuất?

+0

Nhìn giống như một vấn đề CV2, muốn báo cáo vấn đề trực tiếp trên trang web của họ thay vì đăng lỗi trên stackoverflow! :) – tito

+0

Xong - cảm ơn vì gợi ý, tôi không nhận ra rằng bạn có thể đăng lỗi (tức là "phát hành" vé ") tại đó. – thomash

Trả lời

0

lý do tại sao không sử dụng biểu thức mặt nạ kín đáo (tại chỗ)?

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

mặt nạ là một mảng boolean, analog trong opencv (cv2.add), nơi một giá trị được thay đổi khi mặt nạ = 0

PS: Tuy nhiên, mã của bạn hoạt động tốt trong máy của tôi (Win7 64, Python 2.6 (32bit), OpenCV 2.3.0) mặc dù

5

Đây là một câu hỏi thú vị. Tôi thấy cùng một vấn đề. Tôi đã đăng một lỗi và nhận được trả lời. http://code.opencv.org/issues/1748

Giải pháp rất đơn giản. Mảng dst không được xác định khi tạo và thao tác chỉ thay đổi các pixel mảng đích p, cho mặt nạ nào (p)! = 0.

Vì vậy, cơ chế duy nhất hoạt động là khởi động trước khi bổ sung. I.e.

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

Các phiên bản tiếp theo sẽ xóa mới được hình ảnh trong các hoạt động như cv2.add, cv2.subtract, cv2.bitwise_and/hoặc/xor tạo - vì vậy nó sẽ làm việc mà không có vấn đề.

mã của tôi trông giống như:

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: timings (10k lặp đi lặp lại):

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: Gửi lỗi sau đây hướng dẫn tại đây: http://code.opencv.org/projects/OpenCV/wiki/WikiStart

+0

được chỉnh sửa và cập nhật với phản hồi báo cáo lỗi. – Neon22

Các vấn đề liên quan