2015-09-05 6 views
5

में ओपनसीवी समोच्च न्यूनतम आयाम स्थान मैं बाहरी दृश्य की चलती वस्तुओं का विश्लेषण करने के लिए पृष्ठभूमि घटाव का उपयोग कर रहा हूं। जब सूर्य निकलता है तो मुझे छाया के साथ समस्या होती है। मैं वस्तुओं को अलग करने के लिए contours का उपयोग कर रहा हूँ। फिलहाल मैं समोच्च के शीर्ष आधे हिस्से का विश्लेषण करता हूं क्योंकि छाया आमतौर पर नीचे आधे हिस्से में होती है।पायथन

एक रबड़ बतख के एक समोच्च की कल्पना करो, मैं क्या करना चाहता हूं कि बतख की गर्दन की वाई स्थिति को ढूंढना, जहां समोच्च अपने न्यूनतम क्षैतिज आयाम पर है। क्या कोई मुझे "बतख की गर्दन" को खोजने के लिए सही दिशा में इंगित कर सकता है?

enter image description here

कोड में, binary गतिशील वस्तुओं, HIGHT और WIDTH ऊंचाई और छवि की चौड़ाई की एक सीमा छवि है, lab प्रयोगशाला रंग अंतरिक्ष में एक ही छवि है।

मैं half = int(h/2) लाइन को "बतख गर्दन" को काटने के लिए क्षैतिज रेखा की वाई स्थिति खोजने के लिए एक फ़ंक्शन के साथ प्रतिस्थापित करना चाहता हूं।

_,contours,_ = cv2.findContours(binary.copy(), cv2.RETR_EXTERNAL, 
          cv2.CHAIN_APPROX_SIMPLE) 

# loop over the contours 
for i, cnt in enumerate(contours): 

    # compute the bounding box for the contour 
    (x, y, w, h) = cv2.boundingRect(cnt) 

    # reject contours outside size range 
    if w > 250 or w < 30 or h > 250 or h < 30 : 
      continue 

    # make sure the box is inside the frame 
    if x <= 0 or y <= 0 or x+w >= (WIDTH -1) or y+h >= (HIGHT -1): 
      continue 

    # isolate feature 
    half = int(h/2) 
    roi = lab[y:y+half, x:x+w] 
    mask = binary[y:y+half, x:x+w] 

    # calculate the mean of the colour 
    mean = cv2.mean(roi, mask = mask) 
    # note: mean is L a b 
    L = int(mean[0]) 
    a = int(mean[1]) 
    b = int(mean[2]) 
    print L,a,b 

मैं opencv 3 और अजगर 2,7

पी.एस. उपयोग कर रहा हूँ मैंने बैकग्राउंड सबट्रैक्टर एमओजी 2 की कोशिश की है जिसे छाया की पहचान करने के लिए कहा जाता है लेकिन यह मेरे उपयोग के लिए शोर का तरीका है और व्यवहार्य नहीं है।

+3

अपने प्रश्न में वास्तविक और अपेक्षित परिणामों के साथ कुछ छवियां जोड़ें। टैग के नीचे संपादन लिंक पर क्लिक करें। आपके पास छवि जोड़ने के लिए पर्याप्त प्रतिष्ठा नहीं है, लेकिन आप imgur या इसी तरह के – Miki

+0

हाय मिकी से एक सार्वजनिक लिंक पोस्ट कर सकते हैं, मैंने एक स्केच जोड़ा है जिसे स्पष्टीकरण में मदद करनी चाहिए, कृपया कुछ और पूछने के लिए स्वतंत्र महसूस करें। मैंने 3 संभावित समाधानों के बारे में सोचा है, 1) किसी भी तरह क्षणों का उपयोग करें, 2) मोड़ बिंदु खोजने के लिए समोच्च सूची के माध्यम से घुमाएं, 3) प्रोफाइल प्राप्त करने के लिए क्षैतिज पंक्तियों को पंक्तिबद्ध करें और फिर प्रोफ़ाइल के मोड़ बिंदु खोजें। पहले दो मुझे इस बारे में कोई जानकारी नहीं है कि क्षणों का उपयोग कैसे करें या समोच्च सूची का उपयोग कैसे करें और व्याख्या कैसे करें, इस बारे में कुछ मदद मिलेगी। या किसी भी अन्य सुझाव की बहुत सराहना की जाएगी। – Johno

+0

जब आप पूछे जाने की कोशिश कर रहे हैं तो दर्द होने के लिए खेद है, लेकिन अगर संभव हो तो ड्रॉपबॉक्स/अन्य क्षणिक लिंक से बचें - हम चाहते हैं कि ये प्रश्न वर्षों से लोगों की मदद करें और यदि आप भविष्य में अपनी ड्रॉपबॉक्स फ़ाइल हटा देंगे, तो यह होगा यह सवाल कम मूल्यवान है। इसलिए यह सुनिश्चित करने के लिए imgur के साथ एक व्यवस्था है कि सभी छवियां अवधि के लिए आसपास होंगी। मैंने इस उदाहरण में आपके लिए यह किया है। आशा है कि आपको अपना जवाब मिल जाएगा! – Basic

उत्तर

0

आप छवि को मिटाने के लिए एक मुखौटा परिभाषित कर सकते हैं, ताकि आप घाटी से ऊपर और नीचे ब्लब्स तोड़ सकें। आप इसे अपने कोड पर निम्नलिखित के रूप में लागू कर सकते हैं:

# loop over the contours 
for i, cnt in enumerate(contours): 

    # compute the bounding box for the contour 
    (x, y, w, h) = cv2.boundingRect(cnt) 

    # reject contours outside size range 
    if w > 250 or w < 30 or h > 250 or h < 30 : 
      continue 

    # make sure the box is inside the frame 
    if x <= 0 or y <= 0 or x+w >= (WIDTH -1) or y+h >= (HIGHT -1): 
      continue 

    # --------------- 
    # create a mask for erosion, you can play with the mask size/shape 
    mask = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) 
    # erode the original image 
    eroded_img = cv2.erode(binary,mask,iterations = 1) 
    cv2.imshow("Eroded image",eroded_img) 
    # find the middle of the two new contours 
    _,new_contours,_ = cv2.findContours(eroded_img, cv2.RETR_EXTERNAL, 
         cv2.CHAIN_APPROX_SIMPLE) 
    (_, y_t, _, h_t) = cv2.boundingRect(new_contours[0]) 
    (_, y_b, _, h_b) = cv2.boundingRect(new_contours[1]) 
    bottom_top_y = max(y_t, y_b) # highest y of bottom part 
    top_bottom_y = min(y_t+h_t, y_b+h_b) # lowest y of top part 
    half = top_bottom_y + (bottom_top_y - top_bottom_y)/2 
    # ------------ 

    # isolate feature 
    roi = lab[y:y+half, x:x+w] 
    mask = binary[y:y+half, x:x+w] 

    # calculate the mean of the colour 
    mean = cv2.mean(roi, mask = mask) 
    # note: mean is L a b 
    L = int(mean[0]) 
    a = int(mean[1]) 
    b = int(mean[2]) 
    print L,a,b 

आशा है कि इससे मदद मिलती है! द्विआधारी छवियों पर मोर्फोलॉजिकल ऑपरेशंस पर अधिक उदाहरणों के लिए, आप here देख सकते हैं।

+0

आईके, आपके इनपुट के लिए बहुत बहुत धन्यवाद। यह निश्चित रूप से ऐसा करने का एक तरीका है।मैं पहले से ही मास्क आकार को कम करने के लिए ईरोड का उपयोग करता हूं ताकि ऑब्जेक्ट के बहुत किनारों को मेरी पहचान गणना में शामिल नहीं किया जा सके। हो सकता है कि मैं एक लूप में मिटा दूंगा जब तक कि 2 रूपरेखा न हो और फिर शीर्ष समोच्च को मूल आकार के करीब वापस बढ़ाएं। चीयर्स :-) – Johno