2016-04-30 20 views
6

मैं अपने स्कूल प्रोजेक्ट के लिए छात्र पहचान कर रहा हूं। पाइथन संस्करण 3.4.2 और ओपनसीवी 3.1.0 का उपयोग करके यह पहली बार ओपनसीवी और पायथन के साथ काम कर रहा है।ओपनसीवी और पायथन में छात्र पहचान

मैं रास्पबेरी पीआई नोयर कैमरा का उपयोग कर रहा हूं, और मुझे अच्छी छवियां मिल रही हैं। ।

लेकिन मैं अच्छी तरह से एक छात्र का पता नहीं लगा सकते हैं (क्योंकि चमक, बरौनी और छाया की मैं वेब पर कुछ कोड देखें और निम्नलिखित है कि कोड का हिस्सा है

... 

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) 

# capture frames from the camera 
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): 

    image = frame.array 
    cv2.imshow("image", image) 


    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
    retval, thresholded = cv2.threshold(gray, 80, 255, 0) 
    cv2.imshow("threshold", thresholded) 

    closed = cv2.erode(cv2.dilate(thresholded, kernel, iterations=1), kernel, iterations=1) 
    #closed = cv2.morphologyEx(close, cv2.MORPH_CLOSE, kernel) 

    cv2.imshow("closed", closed) 

    thresholded, contours, hierarchy = cv2.findContours(closed, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) 

    drawing = np.copy(image) 
    cv2.drawContours(drawing, contours, -1, (255, 0, 0), 2) 

    for contour in contours: 

     area = cv2.contourArea(contour) 
     bounding_box = cv2.boundingRect(contour) 

     extend = area/(bounding_box[2] * bounding_box[3]) 

     # reject the contours with big extend 
     if extend > 0.8: 
      continue 

     # calculate countour center and draw a dot there 
     m = cv2.moments(contour) 
     if m['m00'] != 0: 
      center = (int(m['m10']/m['m00']), int(m['m01']/m['m00'])) 
      cv2.circle(drawing, center, 3, (0, 255, 0), -1) 

     # fit an ellipse around the contour and draw it into the image 
     try: 
      ellipse = cv2.fitEllipse(contour) 
      cv2.ellipse(drawing, box=ellipse, color=(0, 255, 0)) 
     except: 
      pass 

    # show the frame 
    cv2.imshow("Drawing", drawing) 

    ... 

इनपुट छवि।:

enter image description here

आउटपुट छवि:

enter image description here

ऊपर दिखाए गए अनुसार, उस छवि के उन हिस्सों को कैसे हटाया जा सकता है जो छात्र से संबंधित नहीं हैं?

उत्तरों के अलावा, किसी भी संकेत का भी स्वागत है।

+0

संबंधित: [numpy में vectorized आँख ट्रैकिंग एल्गोरिथ्म बढ़ाता है] (https://stackoverflow.com/questions/35996257/speeding-up-vectorized-eye-tracking-algorithm-in-numpy) । आप परिपत्र की जांच भी कर सकते हैं ([उदाहरण कोड] (https://github.com/Itseez/opencv/blob/3.1.0/modules/features2d/src/blobdetector.cpp#L222))। – Catree

+0

अन्य विकल्प: [HoughCircles] (http://docs.opencv.org/3.1.0/dd/d1a/group__imgproc__feature.html#ga47849c3be0d0406ad3ca45db65a25d2d) के साथ सीधे सर्कल का पता लगाएं और/या यदि अंदर का क्षेत्र गहरा है तो केवल समोच्च रखें बाहर। यदि आंख हमेशा केंद्रित होती है और उसी दूरी पर, आप रुचि के क्षेत्र (आरओआई) को भी परिभाषित कर सकते हैं + क्षेत्र का उपयोग करें। – Catree

+0

मैं बाइनरी छवि पर [erode] (http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=erode#erode) का उपयोग करूंगा और फिर बस [HoughCircles] (http: //docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html) छवि में सबसे महत्वपूर्ण सर्कल का पता लगाने के लिए। – 0x90

उत्तर

4

ऐसी कई चीजें हैं जो आप कर सकते हैं। वे कितनी अच्छी तरह से काम करते हैं इस पर निर्भर करता है कि उन छवियों में कितनी भिन्नता है, जिन्हें आप एल्गोरिदम लागू करना चाहते हैं। आप कई धारणाएं कर सकते हैं और फिर उन सभी उम्मीदवारों को त्याग सकते हैं जो उनसे नहीं मिलते हैं।

निकालें छोटे detections

सबसे पहले मैं अपने पाश की शुरुआत में इस लाइन को जोड़ने के द्वारा उम्मीदवारों कि बहुत छोटे हैं को हटाने पर विचार होगा:

if area < 100: 
    continue 

सीमा बेतरतीब ढंग से चुना गया था और इस के लिए अच्छी तरह से काम विशेष छवि यह लगभग सभी झूठी पहचान हटा दिया। केवल सबसे बड़ा एक रहता है। लेकिन आपको इसे अपनी अन्य छवियों के खिलाफ जांचना होगा और इसे अपनी आवश्यकताओं के अनुरूप बनाना होगा।

enter image description here

detections उस दौर

एक और धारणा आप कर सकते है कि विद्यार्थियों आमतौर पर गोल नहीं हैं को हटाने और आप हर पता लगाने कि पर्याप्त 'दौर' नहीं है निकाल सकते हैं। परिधि का एक साधारण उपाय क्षेत्र के परिधि के अनुपात को देखना है।

circumference = cv2.arcLength(contour,True) 
circularity = circumference ** 2/(4*math.pi*area) 

गोलाकारता दाहिने तरफ छाया के लिए 2.72 और छात्र के लिए 1.31 है।

गोलाई

आप देखते हैं कि सुधार, कि अपने छात्र की समोच्च बिल्कुल गोल क्योंकि प्रतिबिंब के नहीं है। आप समोच्चों के उत्तल भाग की गणना करके इसे बेहतर बना सकते हैं।

contour = cv2.convexHull(contour) 

यदि आप क्षेत्र और परिधि की गणना करने से पहले ऐसा करते हैं तो आपको 1.01 और 1.37 के परिपत्र मूल्य प्राप्त होते हैं। (एक परिपूर्ण सर्कल में 1 का गोलाकार होता है) इसका मतलब है कि प्रतिबिंब से दोष लगभग पूरी तरह से मरम्मत की गई थी। यह इस मामले में आवश्यक नहीं हो सकता है लेकिन अधिक प्रतिबिंब के मामलों में उपयोगी हो सकता है।

enter image description here

+0

धन्यवाद! मैं एक सीमा परिपत्र 1.1 सेट, और अच्छी तरह से काम करते हैं। मैं इस परियोजना को 'वास्तविक समय' बनाना चाहता हूं। मॉर्फोलॉजी (मेरे विचार में) के कारण, एफपीएस ड्रॉप हो जाता है क्योंकि कर्नेल आकार बड़ा हो जाता है। क्या मैं morphology प्रदर्शन में सुधार कर सकते हैं? –

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