2012-02-27 6 views
7

के लिए ओपनसीवी पायथन बाइंडिंग्स मैं पाइथन बाइंडिंग के माध्यम से हड़पने वाली कट विधि के ओपनसीवी कार्यान्वयन का उपयोग करने की कोशिश कर रहा हूं। मैंने सीवी और सीवी 2 दोनों में संस्करण का उपयोग करने का प्रयास किया है, लेकिन मुझे सही तरीके से चलाने के लिए विधि को प्राप्त करने के लिए उपयोग करने के लिए सही पैरामीटर खोजने में समस्या हो रही है। मैंने पैरामीटर के कई क्रमिक प्रयासों की कोशिश की है और कुछ भी काम नहीं करता है (मूल रूप से मैंने जीथूब पर देखा हर उदाहरण)। यहां कुछ उदाहरण मैं पालन करने के लिए कोशिश की है कर रहे हैं:ग्रैबकूट एल्गोरिदम

Example 1

Example 2

और यहाँ विधि के प्रलेखन और एक ज्ञात बग रिपोर्ट है:

Documentation

Known Grabcut Bug

मैं कोड निष्पादित करने के लिए कोड प्राप्त कर सकता हूं नीचे उदाहरण दर्ज करें, लेकिन यह एक खाली (सभी काला) छवि मुखौटा देता है।

img = Image("pills.png") 
mask = img.getEmpty(1) 
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
for i in range(0, 13*5): 
    cv.SetReal2D(fgModel, 0, i, 0) 
    cv.SetReal2D(bgModel, 0, i, 0) 

rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 
cv.GrabCut(img.getBitmap(),mask,rect,tmp1,tmp2,5,cv.GC_INIT_WITH_RECT) 

मैं छवियों को लोड करने के लिए SimpleCV का उपयोग कर रहा हूं। मुखौटा प्रकार और img.getBitmap (से वापसी प्रकार) कर रहे हैं:

iplimage(nChannels=1 width=730 height=530 widthStep=732) 
iplimage(nChannels=3 width=730 height=530 widthStep=2192) 

कोई इस कोड मैं इसे देखना पसंद करेंगे की एक काम उदाहरण है। इसके लायक होने के लिए मैं ओएसएक्स हिम तेंदुए पर चल रहा हूं, और ओपनसीवी का मेरा संस्करण एसवीएन रिपोजिटरी से स्थापित किया गया था (कुछ हफ्ते पहले)। संदर्भ के लिए मेरी इनपुट छवि यह है: Input Image

मैंने परिणाम मुखौटा enum मानों को और अधिक दृश्यमान में बदलने का प्रयास किया है। यह वापसी मूल्य नहीं है जो समस्या है। यह एक पूरी तरह से काला छवि देता है। मैं कुछ और मूल्यों की कोशिश करूंगा।

img = Image("pills.png") 
mask = img.getEmpty(1) 
bgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
fgModel = cv.CreateMat(1, 13*5, cv.CV_64FC1) 
for i in range(0, 13*5): 
    cv.SetReal2D(fgModel, 0, i, 0) 
    cv.SetReal2D(bgModel, 0, i, 0) 

rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 
cv.GrabCut(img.getBitmap(), mask, rect, tmp1, tmp2, 5, cv.GC_INIT_WITH_MASK) 
mask[mask == cv.GC_BGD] = 0 
mask[mask == cv.GC_PR_BGD] = 0 
mask[mask == cv.GC_FGD] = 255 
mask[mask == cv.GC_PR_FGD] = 255 
result = Image(mask) 
result.show() 
result.save("result.png") 
+0

मुख्य धागे को उदाहरण दिया गया। – kscottz

उत्तर

5

कैट, अपने कोड के इस संस्करण मेरे लिए काम करने लगता है।

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 


filename = "pills.png" 
im = cv2.imread(filename) 

h,w = im.shape[:2] 

mask = np.zeros((h,w),dtype='uint8') 
rect = (150,70,170,220) 
tmp1 = np.zeros((1, 13 * 5)) 
tmp2 = np.zeros((1, 13 * 5)) 

cv2.grabCut(im,mask,rect,tmp1,tmp2,10,mode=cv2.GC_INIT_WITH_RECT) 

plt.figure() 
plt.imshow(mask) 
plt.colorbar() 
plt.show() 

लेबल 0,2 और 3 के साथ इस तरह की एक आकृति का उत्पादन करता है। enter image description here

1

आपका मुखौटा following values से भर जाता है:

  • GC_BGD एक स्पष्ट पृष्ठभूमि पिक्सल परिभाषित करता है।
  • जीसी_एफजीडी एक स्पष्ट अग्रभूमि (वस्तु) पिक्सेल परिभाषित करता है।
  • जीसी_PR_BGD संभावित पृष्ठभूमि पिक्सेल को परिभाषित करता है।
  • जीसी_PR_FGD संभावित अग्रभूमि पिक्सेल को परिभाषित करता है।

कौन सा एक enum का हिस्सा हैं:

enum { GC_BGD = 0, // background 
     GC_FGD = 1, // foreground 
     GC_PR_BGD = 2, // most probably background 
     GC_PR_FGD = 3 // most probably foreground 
    }; 

कौन सा रंग करने के लिए अनुवाद: पूरी तरह से काले, बहुत काले, गहरे काले, और काले। मुझे लगता है कि आप पाएंगे कि यदि आप निम्नलिखित कोड जोड़ने (अपने example 1 से लिया और थोड़ा संशोधित) अपने मुखौटे अच्छे दिखेगा:

mask[mask == cv.GC_BGD] = 0 //certain background is black 
mask[mask == cv.GC_PR_BGD] = 63 //possible background is dark grey 
mask[mask == cv.GC_FGD] = 255 //foreground is white 
mask[mask == cv.GC_PR_FGD] = 192 //possible foreground is light grey 
+1

तो मैंने यह देखा जब मैं इसे काम करने की कोशिश कर रहा था। मैंने बस निम्न स्निपेट चलाया: – kscottz

+0

ऊपर जोड़े गए स्निपेट को देखें, यह भी काम नहीं करता है। सहायता के लिए धन्यवाद। यदि आप इस्तेमाल की गई उदाहरण छवि को बना सकते हैं तो मैं आभारी रहूंगा। – kscottz

+0

क्या होता है यदि आप नीचे जनवरी एरिक की टिप्पणी में कोड आज़माते हैं? –