2010-07-16 20 views
21

क्या OpenCV का उपयोग करके एक मुखौटा उलटा करने का कोई आसान तरीका है? उदाहरण के लिए, मैं इस तरह एक मुखौटा मिल गया है, तो:ओपनसीवी: एक मुखौटा उलटा?

010 
111 
010 

मैं इसे उलटने और मिल इस करना चाहते हैं:

101 
000 
101 

नोट: मैं OpenCV के पायथन बाइंडिंग का उपयोग कर रहा है, तो, जबकि यह संभव मुखौटा में प्रत्येक तत्व पर लूप करने के लिए होगा, निष्पादन गति एक मुद्दा बन सकता है।

+3

एक [बिटवाइज़ नहीं] (http का उपयोग करें: // opencv.willowgarage.com/documentation/python/operations_on_arrays.html#not) मैट्रिक्स में सभी बिट्स को फ़्लिप करने के लिए। –

+0

यह संभव है कि मैं कुछ बेवकूफ और गलत कर रहा हूं, लेकिन मुझे थोड़ा सा नहीं लगता- मैं जो चाहता हूं वह नहीं है ... क्योंकि तब मैं '255,254,255, ...' के साथ समाप्त हो जाऊंगा। संभवतः ऐसा इसलिए है क्योंकि मेरा मुखौटा एक 'छवि' है? –

+1

यह आपके मुखौटा की बिट गहराई पर निर्भर करता है। आम तौर पर एक मुखौटा में 1 बिट की गहराई होनी चाहिए, जो एकल बिट को 0 से 1 तक घुमाएगी और इसके विपरीत बनाम। आपको अपना मुखौटा पहले 1 बिट गहरी छवि में बदलने की आवश्यकता हो सकती है। यदि आपके पास अधिक गहराई (पूर्व 4) है, तो हाँ यह '0001' से' 1110' और '0000' से' 1111' तक फ़्लिप होगा –

उत्तर

24

यदि आपके पास 8-बिट मुखौटा है, तो आपको mask = 255 - mask करना चाहिए। सीवी :: मट घटाव ऑपरेटर स्केलर प्रति-तत्व घटाव करने के लिए ओवरलोड किया गया है।

7

"पर" मूल्य के रूप में 255 का उपयोग कर एक 8 बिट मुखौटा के लिए:

mask = cv::Mat::ones(mask.size(), mask.type()) * 255 - mask; 

मैं मैट एम समाधान के बजाय इस एक के रूप में उपयोग कर रहा हूँ मैं अभी भी अपने परियोजनाओं में से एक के लिए OpenCV 2.1.0 का उपयोग कर रहा ।

20

cv2.bitwise_not(mask) यहाँ मदद मिलेगी

0

मुझे लगता है कि कुछ इस तरह इस मामले में जहां इनपुट मुखौटा विभिन्न गैर शून्य मान हो सकता है संभाल सकता है:

cv::Mat1b inputMask = ....; 
cv::Mat1b invertedMask(inputMask.rows, inputMask.cols); 

std::transform(
    inputMask.begin(), inputMask.end(), invertedMask.begin(), 
    std::logical_not<uint8_t>() 
);