2013-02-07 12 views
8

मैं अपने वीडियो को लाइव वीडियो स्ट्रीम से ढूंढना चाहता हूं और अपने हाथ का मुखौटा बनाना चाहता हूं। हालांकि मैं काफी खराब परिणाम तक पहुंच रहा हूं, जैसा कि आप तस्वीर से देख सकते हैं।कंप्यूटर विजन: एक मानव हाथ मास्किंग

मेरा लक्ष्य हाथ आंदोलन को ट्रैक करना है, इसलिए मैंने जो किया वह वीडियो स्ट्रीम को बीजीआर से एचएसवी कलर स्पेस में परिवर्तित कर दिया गया था, फिर मैंने अपने हाथ के रंग को अलग करने के लिए छवि को थ्रेसहोल्ड किया, फिर मैंने समोच्चों को खोजने की कोशिश की मेरे हाथ का हालांकि अंतिम परिणाम वह नहीं है जिसे मैं हासिल करना चाहता था।

मैं अंतिम परिणाम कैसे सुधार सकता हूं?

import cv2 
import numpy as np 

cam = cv2.VideoCapture(1) 
cam.set(3,640) 
cam.set(4,480) 
ret, image = cam.read() 

skin_min = np.array([0, 40, 150],np.uint8) 
skin_max = np.array([20, 150, 255],np.uint8)  
while True: 
    ret, image = cam.read() 

    gaussian_blur = cv2.GaussianBlur(image,(5,5),0) 
    blur_hsv = cv2.cvtColor(gaussian_blur, cv2.COLOR_BGR2HSV) 

#threshould using min and max values 
    tre_green = cv2.inRange(blur_hsv, skin_min, skin_max) 
#getting object green contour 
    contours, hierarchy = cv2.findContours(tre_green,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) 

#draw contours 
    cv2.drawContours(image,contours,-1,(0,255,0),3) 

    cv2.imshow('real', image) 
    cv2.imshow('tre_green', tre_green) 

    key = cv2.waitKey(10) 
    if key == 27: 
     break 

यहां चित्रों के साथ लिंक: https://picasaweb.google.com/103610822612915300423/February7201303। छवि प्लस समोच्च, मुखौटा, और मूल के साथ नया लिंक। https://picasaweb.google.com/103610822612915300423/February7201304

और यहाँ ऊपर से एक नमूना चित्र है:

Sample picture of a torso with arms ... and a hand

+0

उस नमूना वीडियो को शामिल करें जिसमें आपको परेशानी हो रही है, अन्यथा यह अनुमान लगाने की कोशिश करना व्यर्थ है कि आप वास्तव में किसके साथ काम कर रहे हैं। – mmgp

+1

मैं चित्र अपलोड नहीं कर सकता, क्योंकि मेरे पास पर्याप्त प्रतिष्ठा अंक नहीं हैं :( – wind85

+1

बस एक लिंक शामिल करें। और/वीडियो/के लिंक को शामिल करें, व्यक्तिगत फ्रेम नहीं। – mmgp

उत्तर

10

वहाँ पिक्सेल के लिहाज से सीमा "त्वचा पिक्सल" "गैर त्वचा पिक्सल" से अलग करने के लिए प्रदर्शन करने के लिए कई तरीके हैं, और देखते हैं कागजात लगभग किसी भी रंगस्थान (आरजीबी के साथ भी) के आधार पर। तो, मेरा जवाब केवल चाई और नगन द्वारा वीडियोपोन अनुप्रयोगों में त्वचा-रंग मानचित्र का उपयोग कर पेपर फेस सेगमेंटेशन पर आधारित है। वे YCbCr colorspace के साथ काम किया है और काफी अच्छा परिणाम मिला है, कागज भी एक सीमा है कि उनके लिए अच्छी तरह से काम का उल्लेख है:

(Cb in [77, 127]) and (Cr in [133, 173]) 

Y चैनल के लिए थ्रेसहोल्ड निर्दिष्ट नहीं हैं, लेकिन वहाँ कागजात कि Y > 80 उल्लेख कर रहे हैं। आपकी एकल छवि के लिए, पूरी श्रृंखला में Y ठीक है, यानी यह वास्तव में त्वचा को अलग करने के लिए कोई फर्क नहीं पड़ता।

इनपुट, बाइनरी छवि का उल्लेख किया गया थ्रेसहोल्ड के अनुसार, और परिणामी छवि छोटे घटकों को छोड़ने के बाद है।

enter image description hereenter image description hereenter image description here

import sys 
import numpy 
import cv2 

im = cv2.imread(sys.argv[1]) 
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB) 

skin_ycrcb_mint = numpy.array((0, 133, 77)) 
skin_ycrcb_maxt = numpy.array((255, 173, 127)) 
skin_ycrcb = cv2.inRange(im_ycrcb, skin_ycrcb_mint, skin_ycrcb_maxt) 
cv2.imwrite(sys.argv[2], skin_ycrcb) # Second image 

contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, 
     cv2.CHAIN_APPROX_SIMPLE) 
for i, c in enumerate(contours): 
    area = cv2.contourArea(c) 
    if area > 1000: 
     cv2.drawContours(im, contours, i, (255, 0, 0), 3) 
cv2.imwrite(sys.argv[3], im)   # Final image 

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

+0

@mmpg बहुत बहुत धन्यवाद! आश्चर्यजनक !! – wind85

+0

@ एमएमपीजी वाह यह वास्तव में आश्चर्यजनक रूप से अच्छी तरह से काम करता है! धन्यवाद। मुझे cv2.inRange का उपयोग करते समय कुछ परेशानी थी () 'लेकिन यह 'min_YCrCb = numpy.array ([0,133,77], numpy.uint8)' और' max_YCrCb = numpy.array ([255,173,127], numpy.uint8) ' – samkhan13

3

एक सरल और शक्तिशाली विकल्प हिस्टोग्राम बैकप्रोजेक्शन है। उदाहरण के लिए, एच और एस (एचएसवी कलर स्पेस से) या * और बी * (ला * बी * कलर स्पेस से) का उपयोग करके 2 डी हिस्टोग्राम बनाएं, विभिन्न प्रशिक्षण अपने हाथों की छवियों से पिक्सेल का उपयोग करके। फिर अपनी स्ट्रीम में पिक्सेल वर्गीकृत करने के लिए [cv2.calcBackProject] [1] का उपयोग करें। यह बहुत तेज़ है और आपको लगता है कि आपको आसानी से 25 से 30 एफपीएस मिलना चाहिए। ध्यान दें कि यह आपकी रुचि के ऑब्जेक्ट के रंग वितरण सीखने का एक तरीका है। अन्य स्थितियों में एक ही विधि का उपयोग किया जा सकता है।

+0

@ TH.thanks का उपयोग करके हल हो गया है जवाब, मैं इस मामले पर कुछ संसाधन खोजने की कोशिश करूंगा ... – wind85

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