2013-05-14 22 views
11

में कॉन्टूर और बाउंडिंग आयत से निपटना मैं ओपनसीवी और पायथन के साथ काम कर रहा हूं और मैं संरचनात्मक विश्लेषण और आकार वर्णनकर्ताओं से निपट रहा हूं। मुझे यह ब्लॉग मिला है: http://opencvpython.blogspot.it/2012/06/contours-2-brotherhood.html यह बहुत उपयोगी है और मैंने एक बाध्य आयत खींचने के लिए एक काले और सफेद छवि के साथ प्रयास किया है और यह काम करता है। लेकिन अब एक छवि से निकालने के लिए, उदाहरण के लिए, पीला रंग और उस पर मैं एक बाध्य आयत खींचना चाहता हूं। समस्या यह है कि काले और सफेद छवि वर्दी नहीं है, इसमें कुछ शोर है और जैसे कि कोड पूरे आकार को नहीं पहचानता है।OpenCV 2.4 - पायथन 2.7

origianl image

black and white image

final image

और इस कोड है:

import numpy as np 
import cv2 

im = cv2.imread('shot.bmp') 
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 
COLOR_MIN = np.array([20, 80, 80],np.uint8) 
COLOR_MAX = np.array([40, 255, 255],np.uint8) 
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX) 
imgray = frame_threshed 
ret,thresh = cv2.threshold(frame_threshed,127,255,0) 
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 
cnt=contours[0] 
x,y,w,h = cv2.boundingRect(cnt) 
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) 
cv2.imshow("Show",im) 
cv2.waitKey() 
cv2.destroyAllWindows() 
+0

इरोड और फिर फ़ैल जाती। http://docs.opencv.org/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html – William

+0

आपका मूल, रंग, छवि बहुत स्पष्ट नहीं लगती है, हो सकता है इस शोर उत्पन्न कर रहा है – GPPK

+0

हाँ यह स्पष्ट नहीं है, मैं ले लिया यह एक वेबकैम से है क्योंकि मेरा आखिरी गोल वास्तविक समय में उस पीले रंग की वस्तु में एक आयत खींचना है। मैं एरोडिंग और Dilating के साथ कोशिश करेंगे! 'बहुत अधिक मान unpack' करने के लिए आप opencv उपयोग कर रहे हैं: – Gianfra

उत्तर

30

के बाद से अपनी मूल छवि काफी शोर है, उन्हें आसानी से ठीक शोर से कुछ दूर करने के लिए है cv2.medianBlur() का उपयोग करके यह आपकी मूल छवि में छोटे शोर क्षेत्रों को हटा देगा, ए डी आपको केवल एक समोच्च के साथ छोड़ देता है। अपने कोड की पहली कुछ पंक्तियों इस प्रकार दिखाई देगा:

im = cv2.imread('shot.bmp') 
im = cv2.medianBlur(im,5) # 5 is a fairly small kernel size 
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 

हालांकि, इस विधि क्योंकि आप मैन्युअल रूप से गिरी आकार का उल्लेख करना होगा सबसे मजबूत नहीं है, और अपने कोड में लाइन cnt=contours[0] मानता है कि ब्याज की समोच्च contours की सूची में firs है, जो केवल एक ही contour अगर केवल सच है। एक और मजबूत तरीका यह मानना ​​है कि आप सबसे बड़े समोच्च में रूचि रखते हैं, जो आपको मध्यम शोर के लिए क्षतिपूर्ति करने की अनुमति देगा। पंक्ति के बाद

# Find the index of the largest contour 
areas = [cv2.contourArea(c) for c in contours] 
max_index = np.argmax(areas) 
cnt=contours[max_index] 

:

contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

इस कोड में परिणामी:

ऐसा करने के लिए पंक्तियाँ जोड़ें

import numpy as np 
import cv2 

im = cv2.imread('shot.bmp') 
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 
COLOR_MIN = np.array([20, 80, 80],np.uint8) 
COLOR_MAX = np.array([40, 255, 255],np.uint8) 
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX) 
imgray = frame_threshed 
ret,thresh = cv2.threshold(frame_threshed,127,255,0) 
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

# Find the index of the largest contour 
areas = [cv2.contourArea(c) for c in contours] 
max_index = np.argmax(areas) 
cnt=contours[max_index] 

x,y,w,h = cv2.boundingRect(cnt) 
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2) 
cv2.imshow("Show",im) 
cv2.waitKey() 
cv2.destroyAllWindows() 
इन तरीकों में से

दोनों के साथ एक परिणाम दे एक सही बाउंडिंग बॉक्स:

Bounding Box Result

एनबी।
OpenCV के रूप में 3.x findContours() विधि रिटर्न 3 परिणाम (के रूप में here देखा जा सकता है), इसलिए अतिरिक्त वापसी मान की तरह पकड़ा जाना चाहिए:

_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPL‌​E) 
+1

' _, आकृति, पदानुक्रम = cv2.findContours (ताड़ना, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) 'नई वाक्य रचना सिर्फ मामले में किसी को भी रिपोर्ट की गई त्रुटि के साथ भर में आया था होना चाहिए 3 और अजगर 3. देखें रेफरी: https: // stackoverflow।कॉम/प्रश्न/25504964/ओपनसीवी-पायथन-वैलर-बहुत-मूल्य-से-अनपैक – Puriney

+1

मुझे लगता है कि @ पुरीनी की टिप्पणी वास्तव में महत्वपूर्ण है, क्योंकि इस समस्या से उत्पन्न होने वाले SO में कई अन्य प्रश्न हैं। प्रश्न को शामिल करने के लिए संपादित किया जाना चाहिए – DarkCygnus