बुनियादी एचएसबी त्वचा का पता लगाने, नियॉन रोशनी


14

मुझे आशा है कि यह पूछने के लिए सही जगह है। अन्य गलतियों के लिए क्षमा चाहते हैं और मुझे एक बेहतर साइट की सलाह देते हैं।

मैं hsb छवि की कुछ रेंज का उपयोग करके एक सुपर सरल त्वचा डिटेक्टर को लागू करने की कोशिश कर रहा हूं। मैं यहाँ और यहाँ वर्णित दृष्टिकोण का उपयोग कर रहा हूँ ।

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

क्यों?

मैं दूसरे स्रोत में वर्णित एल्गोरिथ्म का उपयोग कर रहा हूं :

  1. परिवर्तित छवि हो HSV रंग अंतरिक्ष
  2. सफेद को 0 <एच <38 श्रेणी पर रखें
  3. पतला फिल्टर
  4. एरोड फिल्टर
  5. धब्बा फ़िल्टर

यहाँ छवि विवरण दर्ज करें

जवाबों:


10

यह वास्तव में एचएसवी के बजाय आरजीबी में एक साधारण जेनरेटर मॉडल का उपयोग करके बेहतर काम कर सकता है।

  1. कुछ त्वचा के साथ एक प्रशिक्षण छवि या कई प्रशिक्षण चित्र प्राप्त करें।
  2. मैन्युअल रूप से त्वचा के पिक्सल का चयन करें (जैसे बाइनरी मास्क बनाकर)
  3. RGB में स्किन टोन के माध्य और सहसंयोजक की गणना करें (प्रत्येक 3-तत्व वैक्टर होना चाहिए)
  4. अज्ञात पिक्सेल के लिए, अपने महालानोबिस दूरी को गणना से, सहसंयोजक का उपयोग करके।
  5. यदि दूरी एक सीमा से कम है, तो इसे त्वचा के रूप में वर्गीकृत करें।
  6. सर्वश्रेष्ठ प्रदर्शन के लिए दहलीज को ट्यून करें।

nnPmmmPQQC=QQसी 3 x 3 है।

Edit2: आपके द्वारा प्राप्त किए जा रहे मूल्य बहुत बड़े प्रतीत होते हैं। अधिकतम सहसंयोजक प्राप्त करने के लिए निम्नलिखित मैट्रिक्स बनाएं:

255 255 255
 0   0   0

और उस की गणना covariance। आपको एक मैट्रिक्स प्राप्त करना चाहिए जहां हर मूल्य लगभग 32513 है। इसलिए सुनिश्चित करें कि आपके पिक्सेल मान 0 से 255 तक हैं, और सुनिश्चित करें कि आप उन्हें फ़्लोट या डबल्स में सही तरीके से कॉपी करते हैं। महालनोबिस दूरी विचरण की इकाइयों में है, इसलिए इसके लिए संख्या छोटी होनी चाहिए। त्वचा के वर्गीकरण के लिए आपकी सीमा संभवतः 4 से कम होनी चाहिए।


मुझे यह समझने में समस्या है कि एक छवि से opencv के साथ 3x3 सहसंयोजक मैट्रिक्स कैसे प्राप्त करें .. क्या आप मुझे कुछ संदर्भ दे सकते हैं?
nkint

@nkint, कृपया संपादित उत्तर देखें।
दिमा

ठीक है अच्छा है। 5 लाइनों में आपने मुझे समझा कि कोवरियन क्या है। धन्यवाद। यह काम करता हैं। लेकिन मुझे परिणाम संग्रहीत करने में समस्या है। यदि मेरे पास 0-255 से पिक्सेल हैं, तो मुझे महालनोबिस दूरी की उम्मीद करने के लिए किस तरह की संख्या होनी चाहिए? अगर मैं उन्हें 8-यूंट में संग्रहीत करता हूं तो यह त्वचा का केवल एक छोटा सा हिस्सा लेता है, अगर मैं उन्हें 32-फ्लोट में संग्रहीत करता हूं तो मुझे
अजनबी

हाँ, मुझे लगता है कि मैं कुछ गलत कर रहा हूँ क्योंकि मेरा सहसंयोजक मैट्रिक्स है: [10913058.00000000, 7046611.50000000, 3290781.50000000; 7046611.50000000, 4811646.00000000, 2225078.00000000; 3290781.50000000, 2225078.00000000, 1387631.87500000]
nkint

1
आप कोवरियन को 3 डी में एक दीर्घवृत्त को परिभाषित करने के रूप में सोच सकते हैं। आप मतलाब में इसकी कल्पना कर सकते हैं, लेकिन यह बहुत काम की संभावना है। वैकल्पिक रूप से, आप दीर्घवृत्त के 2 डी अनुमानों को देखने की कोशिश कर सकते हैं, लेकिन यह भी कुछ काम करेगा।
दीमा

4

नियॉन प्रकाश लागू होने पर एचएसवी रंग में प्राप्त विभिन्न मूल्यों को ध्यान में रखें: इसका विचलन का एक उदाहरण यहां है । अपने एल्गोरिथ्म को अपनाने की कोशिश करें ताकि यह इन मूल्यों के अनुकूल हो।

यहां त्वचा का पता लगाने के लिए एक और एल्गोरिथ्म है, और प्रकाश स्थितियों का पता लगाने के लिए आप इस का उपयोग कर सकते हैं ।

एक अन्य एल्गोरिदम, त्वचा का पता लगाने से संबंधित है, लेकिन बहुत अधिक नीयन प्रकाश प्रभावों से संबंधित नहीं है, यह एक है


2

आपके द्वारा अब तक प्राप्त किए गए उत्तर अच्छे वैकल्पिक तरीकों की ओर इशारा करते हैं, लेकिन यदि आप अपने शुरुआती एल्गोरिथम जैसी किसी चीज़ का उपयोग करने में रुचि रखते हैं, तो इसे ठीक करना मुश्किल नहीं है। आपको बस OpenCV के HSV ख़ासियत के लिए समायोजित करने की आवश्यकता है। निराला परिणामों को देखते हुए, मुझे लगता है कि आपने संभवतः अपने थ्रेसहोल्ड और / या परिवर्तित पिक्सेल चुनने में एचएसवी के एक से अधिक सामान्य संख्यात्मक अभ्यावेदन का उपयोग किया है?

OpenCV HSV को उन अन्य स्रोतों की तुलना में भिन्न रूप से प्रस्तुत करता है जिन्हें आपने पाया हो सकता है:

  • आपके लिए सबसे बड़ा अंतर w / r / t hue होगा: OpenCV 0 से 179 तक के रूप में रंग का प्रतिनिधित्व करता है, जब लगभग सब कुछ और अधिक जानकारी, w / 0-255 को संरक्षित करने के लिए फांसी बिट का लाभ उठाता है।
  • अन्य अंतर: मानक की तुलना में संतृप्ति का माप उलटा है। तो 255 संतृप्ति का अर्थ है सफेद (नोटिस, हम 255 तक वापस आ गए हैं - केवल '0-1' प्रतिनिधित्व की वजह से उज्जवल है, शायद 'पहिया' प्रतिनिधित्व के कारण?)

शायद आपकी मदद करने के लिए बहुत देर हो गई, लेकिन यह एक दिलचस्प सवाल था, और कोई और उसी मुद्दे में भाग सकता है।


-1
import sys
import numpy
import cv2

cap = cv2.VideoCapture(0)
while(1):
    _, im = cap.read()

    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.imshow("Second Image", 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.imshow("Final Image", im)         # Final image
    cv2.waitKey(1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.