OpenCV / C ++ उन दोनों के बीच की दूरी के आधार पर पास के आकृति को जोड़ता है


15

मुझे उनके बीच की दूरी के आधार पर एक छवि में आस-पास के कंट्रोवर्स को कनेक्ट करना है जो निर्दिष्ट करता है कि क्या कंट्रोवर्स कनेक्ट होने हैं।

अब यहाँ एक ही समस्या पर पहले से ही एक सवाल है /programming/8973017/opencv-c-obj-c-connect-nearby-contours लेकिन यहाँ वह सभी कंट्रो को एक सिंगल में मिला देता है। यह मैं नहीं चाहता। मुझे नहीं लगता कि इस के लिए opencv में कुछ कार्य है, लेकिन आप उसके लिए एक एल्गोरिथ्म का सुझाव दे सकते हैं। मेरा आवेदन इस प्रकार है:

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

इसके अलावा मुझे लगता है कि कुछ किनारे का पता लगाने से मैं अपने हाथों की सीमाओं को प्राप्त करूंगा और यह पता लगाऊंगा कि क्या इस सीमा के अंदर के कुछ पैच को त्वचा के रूप में पाया गया है, तो इस सीमा के भीतर के पूरे क्षेत्र को त्वचा के रूप में पता लगाया जाएगा, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है अंश।

किसी भी तरह की सहायता को आभार समझेंगे। अग्रिम में धन्यवाद

नमूना छवि:

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

इस छवि में मैं कनेक्ट पॉइंट्स (8 कनेक्टिविटी) को कहना चाहता हूं, जो 40 पिक्सेल की दूरी से कम है ताकि मैं अपने बाएं हाथ को एक एकल के रूप में पाऊं

मेरा उद्देश्य केवल हाथ का समोच्च प्राप्त करना है (मुझे किसी अन्य क्षेत्र की परवाह नहीं है)


हाथों से आप वास्तव में हथियारों का मतलब है। क्या आप अपनी त्वचा के रंग से मेल खाने के लिए त्वचा का पता लगाने के लिए उपयोग की जाने वाली मात्र को समायोजित नहीं कर सकते थे?
जंपटर

मैंने ऐसा किया है और यह ठीक आउटपुट देता है (जब मेरी त्वचा रोशन होती है)। इसलिए शाम के दौरान यह दिखाया गया है। वैसे भी मैंने सोचा कि पास के ब्लब्स को जोड़ने के लिए कोई तरीका हो सकता है।
रॉनी द्वीप


स्टैक एक्सचेंज में आपका स्वागत है। एसई एक मंच नहीं है! यह सवाल का जवाब नहीं है। यदि आपके पास प्रश्न के बारे में कोई प्रश्न है - तो इसे टिप्पणी के रूप में रखें।
दीपन मेहता

आप त्वचा का पता कैसे लगाते हैं?
nkint

जवाबों:


10

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

विधि इस प्रकार है: आप प्रत्येक समोच्च को लेते हैं और अन्य आकृति के लिए दूरी पाते हैं। यदि दूरी 50 से कम है, तो वे पास हैं और आप उन्हें एक साथ रखते हैं। यदि नहीं, तो उन्हें अलग रखा जाता है।

इसलिए प्रत्येक समोच्च के लिए दूरी की जाँच एक समय लेने वाली प्रक्रिया है। कुछ सेकंड लगते हैं। तो कोई रास्ता नहीं आप इसे वास्तविक समय कर सकते हैं।

इसके अलावा, आकृति में शामिल होने के लिए, मैंने उन्हें एक सेट में रखा और उस सेट के लिए एक उत्तल पतवार खींचा। इसलिए आपको जो परिणाम मिल रहा है, वह वास्तव में हाथ का उत्तल पतवार है, वास्तविक हाथ नहीं।

नीचे OpenCV-Python में मेरा कोड ऑफ़ कोड है। मैं किसी भी अनुकूलन के लिए नहीं गया, बस यह काम करना चाहता था, बस। यदि यह आपकी समस्या को हल करता है, तो अनुकूलन के लिए जाएं।

import cv2
import numpy as np

def find_if_close(cnt1,cnt2):
    row1,row2 = cnt1.shape[0],cnt2.shape[0]
    for i in xrange(row1):
        for j in xrange(row2):
            dist = np.linalg.norm(cnt1[i]-cnt2[j])
            if abs(dist) < 50 :
                return True
            elif i==row1-1 and j==row2-1:
                return False

img = cv2.imread('dspcnt.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,0)
contours,hier = cv2.findContours(thresh,cv2.RETR_EXTERNAL,2)

LENGTH = len(contours)
status = np.zeros((LENGTH,1))

for i,cnt1 in enumerate(contours):
    x = i    
    if i != LENGTH-1:
        for j,cnt2 in enumerate(contours[i+1:]):
            x = x+1
            dist = find_if_close(cnt1,cnt2)
            if dist == True:
                val = min(status[i],status[x])
                status[x] = status[i] = val
            else:
                if status[x]==status[i]:
                    status[x] = i+1

unified = []
maximum = int(status.max())+1
for i in xrange(maximum):
    pos = np.where(status==i)[0]
    if pos.size != 0:
        cont = np.vstack(contours[i] for i in pos)
        hull = cv2.convexHull(cont)
        unified.append(hull)

cv2.drawContours(img,unified,-1,(0,255,0),2)
cv2.drawContours(thresh,unified,-1,255,-1)

नीचे दिए गए परिणाम हैं:

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

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


यह c ++ में कैसे किया जा सकता है? मेरे पास ढूंढने के लिए हिस्सा है, लेकिन उसके बाद मुझे बहुभुज में लपेटने के लिए आकृति नहीं मिल सकती है जैसा कि ऊपर दिखाया गया है (जैसा कि एक बाउंडिंग आयत के विपरीत)।
एलियोनार्डो फेलिसियानो 5

मैं आपके दृष्टिकोण की सराहना करता हूं और मेरे मामले पर लागू होने की कोशिश करता हूं, लेकिन दुर्भाग्य से यह पायथन पर बहुत धीमा है (हालांकि मेरे लैपटॉप में कोर आई 7 क्यूएम और 8 जीबी रैम है)। मैं क्षेत्रों का पता लगाने के लिए MSER का उपयोग करता हूं और अब यह निर्धारित करने की आवश्यकता है कि कौन से क्षेत्रों के जोड़े "आसन्न" हैं, मैंने थ्रेशोल्ड 10 के साथ आपके एल्गोरिथ्म की कोशिश की ... आसन्न क्षेत्रों को वापस करने में वर्षों लगते हैं।
जिम रेन्नोर

4

कनेक्टिविटी समस्या को ठीक करने के लिए, आप एक निकट संचालन का प्रयास कर सकते हैं:

cv::Mat structuringElement = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(40, 40));
cv::morphologyEx( inputImage, outputImage, cv::MORPH_CLOSE, structuringElement );

मुझे संदेह है कि यह उन परिणामों का उत्पादन करेगा जो आप चाहते हैं, लेकिन आप इसे एक कोशिश दे सकते हैं।


2

ऐसा लगता है कि आप अपनी छवि का "निरीक्षण" कर रहे हैं। मॉर्फोलॉजिकल ऑपरेशन, जैसा कि bjnoernz ने सुझाव दिया है, मदद करेगा। विशेष रूप से, एक वाटरशेडिंग दृष्टिकोण को पास की जाँच करने की अपेक्षा से अधिक पास होना चाहिए (जैसा कि ऊपर अजगर उदाहरण में है)। Http://cmm.ensmp.fr/~beucher/wtshed.html देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.