2014-04-04 5 views
6

मैं एक छवि में एक साधारण बास्केटबाल कैसे ढूंढ सकता हूं, इस पर थोड़ा सा पालतू परियोजना पर श्रम कर रहा हूं। मैंने पिछले कुछ हफ्तों के लिए hough.circles और transform, आदि का उपयोग करने के क्रमिक क्रम का प्रयास किया है, लेकिन मुझे कोड उदाहरणों और मेरे स्वयं के टिंकरिंग के साथ बास्केटबाल को अलग करने के करीब कहीं भी नहीं आ रहा है। यहाँ boy with a basketball और मैं को संवारता किया गया है खोजने के लिए एक सरल चक्र के संस्करण कोड के बाद परिणाम है::मैं किसी छवि में बास्केटबाल खोजने के लिए pythonically us opencv कैसे कर सकता हूं?

यहाँ एक उदाहरण तस्वीर है houghcircle transform circle finding

किसी को भी किसी भी विचार मैं कहाँ चले गए हैं है गलत और कैसे मैं इसे सही कर सकता हूँ?

import cv2 
import cv2.cv as cv # here 
import numpy as np 

def draw_circles(storage, output): 
    circles = np.asarray(storage) 
    for circle in circles: 
     Radius, x, y = int(circle[0][3]), int(circle[0][0]), int(circle[0][4]) 
     cv.Circle(output, (x, y), 1, cv.CV_RGB(0, 255, 0), -1, 8, 0) 
     cv.Circle(output, (x, y), Radius, cv.CV_RGB(255, 0, 0), 3, 8, 0) 

orig = cv.LoadImage('basket.jpg') 
processed = cv.LoadImage('basket.jpg',cv.CV_LOAD_IMAGE_GRAYSCALE) 
storage = cv.CreateMat(orig.width, 1, cv.CV_32FC3) 
#use canny, as HoughCircles seems to prefer ring like circles to filled ones. 
cv.Canny(processed, processed, 5, 70, 3) 
#smooth to reduce noise a bit more 
cv.Smooth(processed, processed, cv.CV_GAUSSIAN, 7, 7) 

cv.HoughCircles(processed, storage, cv.CV_HOUGH_GRADIENT, 2, 32.0, 30, 550) 
draw_circles(storage, orig) 

cv.imwrite('found_basketball.jpg',orig) 
+1

फ़ाइल को ग्रेस्केल छवि के रूप में लोड करने के बजाय, इसे रंगीन छवि के रूप में लोड करने के बारे में, और छवि को फ़्लैट करने से पहले और कैनी फ़िल्टर में पास करने से पहले गेंद के संतरे रंग पर जोर देने के लिए कुछ प्रीप्रोकैसिंग कर रहा है? –

उत्तर

3

मैं अन्य पोस्टर से सहमत हूं कि बास्केटबॉल के रंग का उपयोग करना एक अच्छा तरीका है।

import cv2 
import numpy as np 

im = cv2.imread('../media/basketball.jpg') 

# convert to HSV space 
im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 
# take only the orange, highly saturated, and bright parts 
im_hsv = cv2.inRange(im_hsv, (7,180,180), (11,255,255)) 

# To show the detected orange parts: 
im_orange = im.copy() 
im_orange[im_hsv==0] = 0 
# cv2.imshow('im_orange',im_orange) 

# Perform opening to remove smaller elements 
element = np.ones((5,5)).astype(np.uint8) 
im_hsv = cv2.erode(im_hsv, element) 
im_hsv = cv2.dilate(im_hsv, element) 

points = np.dstack(np.where(im_hsv>0)).astype(np.float32) 
# fit a bounding circle to the orange points 
center, radius = cv2.minEnclosingCircle(points) 
# draw this circle 
cv2.circle(im, (int(center[1]), int(center[0])), int(radius), (255,0,0), thickness=3) 

out = np.vstack([im_orange,im]) 
cv2.imwrite('out.png',out) 

परिणाम:

enter image description here

मुझे लगता है कि यह मान: यहाँ कुछ सरल कोड है कि है कि है

  1. हमेशा एक और केवल एक बास्केटबॉल मौजूद है
  2. बास्केटबॉल दृश्य में प्रमुख नारंगी आइटम

इन धारणाओं के साथ, अगर हमें सही रंग मिलता है, तो हम इसे गेंद मान सकते हैं और इसके लिए एक सर्कल फिट कर सकते हैं। इस तरह हम किसी भी सर्कल का पता लगाने नहीं करते हैं।

जैसा कि आप ऊपरी छवि में देख सकते हैं, कुछ छोटे संतरे तत्व (शॉर्ट्स से) हैं जो हमारे बॉल त्रिज्या अनुमान को गड़बड़ कर देंगे। कोड इन्हें हटाने के लिए opening ऑपरेशन (erosion के बाद dilation) का उपयोग करता है। यह आपकी उदाहरण छवि के लिए अच्छी तरह से काम करता है। लेकिन अन्य छवियों के लिए एक अलग विधि बेहतर हो सकती है: सर्कल का पता लगाने, या समोच्च आकार, आकार, या यदि हम किसी वीडियो से निपट रहे हैं, तो हम गेंद की स्थिति को ट्रैक कर सकते हैं।

मैंने यादृच्छिक शॉर्ट बास्केटबाल वीडियो पर यह कोड चलाया (केवल वीडियो के लिए संशोधित), और यह आश्चर्यजनक रूप से ठीक काम किया (अच्छा नहीं .. लेकिन ठीक है)।

+0

इस के साथ खेलने के लिए समय निकालने के लिए धन्यवाद और कोडिंग से पहले समस्या का सामना करने के लिए एक अच्छा आधार तरीका है, यह प्रयोग करने के लिए तर्क के साथ प्रयोग करने के लिए कुछ कोड साझा करें। –

1

कुछ विचार::

  1. फ़िल्टर रंग से पहली छवि को आसान बनाने के

    यहाँ कोड मैं के साथ नगण्य रहा हूँ। यदि आप विशेष रूप से एक नारंगी बास्केटबॉल के लिए देख रहे हैं, तो आप कई अन्य रंगों को खत्म कर सकते हैं। मैं आरजीबी के बजाय एचएसआई कलर स्पेस का उपयोग करने की सलाह दूंगा, लेकिन किसी भी मामले में आपको उन रंगों को बाहर करने में सक्षम होना चाहिए जो आपके प्रशिक्षित बास्केटबॉल रंग से रंग 3-स्पेस में कुछ दूरी हैं।

  2. सोबेल या कुछ अन्य कर्नेल-आधारित किनारे डिटेक्टर को प्रतिस्थापित करने का प्रयास करें जो मैन्युअल पैरामीटर पर भरोसा नहीं करता है। किनारे की छवि को यह देखने के लिए प्रदर्शित करें कि यह आपके लिए "सही" दिखता है या नहीं।
  3. कमजोर किनारों के लिए अनुमति दें। ग्रेस्केल छवि में, बास्केटबॉल और खिलाड़ी की अंधेरे जर्सी के बीच का अंतर सफेद अंडरशर्ट और ब्लैक जर्सी के बीच का अंतर जितना बड़ा नहीं है।
  4. यदि ऑब्जेक्ट केवल पार अनुभाग में नाममात्र रूप से परिपत्र है, तो असफल अप्रत्याशित परिणाम प्राप्त कर सकता है, लेकिन वास्तव में विस्तारित है या वास्तविक छवि में शोर किनारों पर है। मैं आमतौर पर अपना खुद का हौग एल्गोरिदम लिखता हूं और ओपनसीवी कार्यान्वयन को छुआ नहीं है, इसलिए मुझे यकीन नहीं है कि कौन सा पैरामीटर बदलना है, लेकिन देखें कि क्या आप फ़ज़ीयर किनारों की अनुमति दे सकते हैं।
  5. शायद सुचारू संचालन को खत्म कर दें। किसी भी मामले में, चारों ओर के बजाय किनारों को खोजने से पहले चिकनी कोशिश करें।
  6. अपना खुद का मोटा हफ़ एल्गोरिदम लिखने का प्रयास करें। यद्यपि एक त्वरित कार्यान्वयन ओपनसीवी कार्यान्वयन के रूप में लचीला नहीं हो सकता है, अपने हाथों को गंदे करके आप समस्या के स्रोत पर ठोकर खा सकते हैं।
संबंधित मुद्दे

 संबंधित मुद्दे