2010-10-11 18 views
6

पर लागू करें I opencv के Threshold फ़ंक्शन को एक numpy सरणी में लागू करने का प्रयास कर रहा हूं। मैं ओपनसीवी 2.1 के लिए पायथन बाइंडिंग का उपयोग कर रहा हूं। यह इस प्रकार है:ओपनसीवी थ्रेसहोल्ड को एक numpy array

import cv 
import numpy as np 
a = np.random.rand(1024,768) 
cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY) 

और यह एक त्रुटि फेंकता है:

OpenCV Error: Unsupported format or combination of formats() in threshold 

तो, मुझे विश्वास है कि मैं जानता हूँ कि मैं क्या कर रहा नहीं कर रहा हूँ, लेकिन मुझे उम्मीद थी Threshold तरह काम करेंगे के लिए, उदाहरण के लिए, Smooth, जिसमें मैं

cv.Smooth(a,a) 
कोई समस्या नहीं के साथ

चला सकते हैं, और एक चिकनी (ईआर) छवि के साथ खत्म। मुझे यकीन नहीं है कि ओपनसीवी के रूप में "प्रारूप" के बारे में कैसे सोचना है, ओपनसीवी उन्हें देखता है, लेकिन अगर मुझे ऐसा करने की ज़रूरत नहीं है तो मैं numpy सरणी को ओपनसीवी छवि प्रारूप में बदलने के लिए नाराज हूं (और मेरे सभी प्रयास विफल हो गए हैं वैसे भी)।

मुझे पता है क्यों Threshold स्पष्ट रूप से अनुभवहीन तरह से मैं यह काम करने के लिए कोशिश कर रहा हूँ में काम नहीं कर रहा चाहते हैं, और यह पता है कि मैं बजाय करना चाहिए बहुत अच्छा होगा।

पीएस मुझे पता है कि मैं खुद को numpy सरणी पर एक थ्रेसहोल्डिंग ऑपरेशन कर सकता हूं, लेकिन मैं opencv को समझने की कोशिश कर रहा हूं।

उत्तर

10

स्पष्ट रूप से Threshold विधि चिकनाई से अधिक उग्र है - यह केवल 8 बिट पूर्णांक/32 बिट फ्लोटिंग पॉइंट सरणी पर काम करता है (here देखें) ताकि ऊपर आपका कोड स्निपेट काम न करे क्योंकि numpy arrays float64 पर डिफ़ॉल्ट है।

>>> a = np.array(np.random.rand(1024,768),dtype=‘float32’) 

तो यह सीमा करने के लिए खुश है तो अगर आप लाइन जहां 32 बिट फ्लोट करने के लिए मजबूर करने के लिए सटीक सारिणी निर्मित बदलने के लिए:

>>> ((a>0) & (a<1)).sum() 
786432 
>>> cv.Threshold(a,a,0.5,1,cv.CV_THRESH_BINARY) 
>>> ((a>0) & (a<1)).sum() 
0