2011-12-11 23 views
5

जबकि सामान्य रूप में opencv (CV2) के लिए नए अजगर बाइंडिंग एक सौंदर्य कर रहे हैं, "मुखौटे" ठीक से काम कर नहीं लग रहे ठीक से एक मुखौटा के बिना:पाइथन opencv cv2 में मास्क काम नहीं कर रहे हैं?</p> <p>उदाहरण "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) 

देता है लेकिन जब आप एक मुखौटा जोड़ने (और एक बाहर सरणी "बी" - जो किसी कारण से के लिए आवश्यक है या तो निर्दिष्ट नहीं की गई) आप प्राप्त एक रैंडम परिणाम, यानी परिणाम जब आप बदलते हैं आदेश कई बार

(Win7, 32 बिट, पायथन 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) 

... और अगले परीक्षण पर कुछ नया

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) 

मेरी मशीन पर देता है चलाते हैं। अब या तो मुझे कुछ गंभीरता से गलत लगता है, या सीवी 2 बाइंडिंग के साथ एक गंभीर समस्या है।

कोई सुझाव?

+0

एक CV2 मुद्दे की तरह लग रहे, स्टैक ओवरफ्लो पर त्रुटि पोस्ट करने के बजाय सीधे अपनी वेबसाइट पर इस मुद्दे की रिपोर्ट करना पसंद करते हैं! :) – tito

+0

हो गया - संकेत के लिए धन्यवाद, मुझे एहसास नहीं हुआ कि आप बग पोस्ट कर सकते हैं (यानी "टिकट" जारी करें)। – thomash

उत्तर

0

क्यों numpy (inplace) मुखौटा अभिव्यक्ति का उपयोग नहीं करते?

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

मुखौटा जहां एक मूल्य बदल गया है पुनश्च एक बूलियन सरणी, अनुरूप opencv में (cv2.add) है जब मुखौटा = 0

: हालांकि, अपने कोड Win7 64 मेरी मशीन में ठीक (काम करता है, पायथन 2.6 (32 बिट), ओपनसीवी 2.3.0) हालांकि

5

यह एक दिलचस्प सवाल है। मुझे एक ही समस्या दिखाई दे रही है। मैंने एक बग पोस्ट किया और एक जवाब मिला। http://code.opencv.org/issues/1748

समाधान सरल है। डीएसटी सरणी निर्माण पर अपरिभाषित है और ऑपरेशन केवल उन गंतव्य सरणी पिक्सेल पी को बदलता है, जिसके लिए मुखौटा (पी)! = 0।

तो एकमात्र तंत्र जो काम करता है वह पहले से पहले डीएसटी को प्रीकैक करना है। आईई।

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

संबंधित मुद्दे