ওপেনসিভি / সি ++ তাদের মধ্যকার দূরত্বের ভিত্তিতে কাছের কনট্যুরগুলি সংযুক্ত করে


15

আমি তাদের মধ্যে দূরত্বের ভিত্তিতে একটি চিত্রের নিকটবর্তী কনট্যুরগুলি সংযুক্ত করতে হবে যা নির্দিষ্ট করে যে সংশ্লেষগুলি সংযুক্ত হতে হবে কিনা।

এখানে ইতিমধ্যে এখানে একই সমস্যাটির একটি প্রশ্ন রয়েছে /programming/8973017/opencv-c-obj-c-connect-nearby-contours তবে এখানে তিনি সমস্ত রূপকে একটিতে একীভূত করলেন। এই আমি চাই না। আমি মনে করি না যে এর জন্য ওপেনসিভিতে কিছু ফাংশন রয়েছে তবে আপনি এটির জন্য একটি অ্যালগরিদম প্রস্তাব করতে পারেন। আমার অ্যাপ্লিকেশনটি এরকম হয়:

আমি হাতগুলি সনাক্ত করছি, সুতরাং আমি তাদের নির্ধারণের জন্য একটি ত্বক সনাক্তকরণের অ্যালগরিদম ব্যবহার করেছি তবে যেহেতু আমার ত্বক সাদা নয় এবং সম্ভবত হালকা হওয়ার কারণে কিছু সময় কনুইয়ের কনট্যুর বিরতি ঘটে। সুতরাং আমি চাই যে কাছাকাছি রূপগুলি সংযুক্ত হোক তবে সেগুলি সবই নয় (কারণ আমার উভয় হাতই সেখানে সংশ্লেষে থাকবে)) (হাত দিয়ে আমি কাঁধ থেকে তালু পর্যন্ত বোঝাচ্ছি))

তবুও আমি মনে করি যে কিছু প্রান্ত সনাক্তকরণ ব্যবহার করে আমি আমার হাতের সীমানা পেয়ে যাব এবং এই সীমানার অভ্যন্তরে থাকা এই প্যাচগুলির কোনওটি ত্বক হিসাবে সনাক্ত করা হয়েছে তবে এই সীমানার পুরো অঞ্চলটি ত্বক হিসাবে সনাক্ত করা হবে তবে আমি কীভাবে এটি করব তা নিশ্চিত নই অংশ।

যে কোন ধরণের সাহায্য গ্রহন করা হবে. আগাম ধন্যবাদ

নমুনা চিত্র:

এখানে চিত্র বর্ণনা লিখুন

এই চিত্রটিতে আমি পয়েন্টগুলি (8 সংযোগ) সংযোগ করতে চাই যা 40 পিক্সেলের দূরত্বের চেয়ে কম বলে যাতে আমি আমার বাম হাতটি একক কনট্যুর হিসাবে পেতে পারি

আমার উদ্দেশ্যটি কেবলমাত্র হাতের কনট্যুর পাওয়া (আমি অন্য কোনও অঞ্চলের বিষয়ে চিন্তা করি না)


হাত দ্বারা আপনি আসলে অস্ত্র বোঝাতে। আপনার ত্বকের রঙ মেলে আপনি কেবল ত্বক সনাক্ত করতে ব্যবহার করেছেন এমন রঙটি সামঞ্জস্য করতে পারেন না?
waspinator

আমি এটি করেছি এবং এটি সূক্ষ্ম আউটপুট দেয় (যখন আমার ত্বক আলোকিত হয়)। সন্ধ্যার সময় এটি প্রদর্শিত হিসাবে আসে। যাইহোক আমি ভেবেছিলাম কাছের ব্লবগুলিকে সংযুক্ত করার জন্য কোনও পদ্ধতি থাকতে পারে।
রনি দ্বীপ


স্ট্যাক এক্সচেঞ্জে স্বাগতম এসই কোনও ফোরাম নয়! এটি প্রশ্নের উত্তর নয়। আপনার যদি প্রশ্ন সম্পর্কে প্রশ্ন থাকে - এটি একটি মন্তব্য হিসাবে রাখুন।
দিপান মেহতা

আপনি কিভাবে ত্বক সনাক্ত করবেন?
nkint

উত্তর:


10

আপনি যদি হাতের গতি বা সঠিক কনট্যুর সম্পর্কে উদ্বিগ্ন না হন তবে নীচে একটি সহজ সমাধান।

পদ্ধতিটি এরকম: আপনি প্রতিটি কনট্যুর নেন এবং অন্যান্য রূপরেখার দূরত্ব খুঁজে পান। দূরত্ব যদি 50 এরও কম হয় তবে এগুলি কাছাকাছি রয়েছে এবং আপনি এগুলি একসাথে রেখেছেন। যদি তা না হয় তবে এগুলি আলাদা হিসাবে রাখা হয়।

সুতরাং প্রতিটি কনট্যুরের দূরত্ব পরীক্ষা করা সময় সাপেক্ষ প্রক্রিয়া is কয়েক সেকেন্ড সময় নেয়। সুতরাং কোনওভাবেই আপনি এটি রিয়েল টাইম করতে পারবেন না।

এছাড়াও, রূপরেখায় যোগদানের জন্য, আমি সেগুলি একটি একক সেটে রেখেছি এবং সেই সেটটির জন্য উত্তল হাল তৈরি করেছি। সুতরাং আপনি যে ফলাফলটি পাচ্ছেন তা হ'ল হাতের উত্তল হাল, আসল হাত নয়।

ওপেনসিভি-পাইথনে আমার কোডের নীচে। আমি কোনও অপ্টিমাইজেশনের জন্য যাইনি, কেবল এটি কাজ করতে চেয়েছিল, এটাই। যদি এটি আপনার সমস্যার সমাধান করে তবে অপ্টিমাইজেশনের জন্য যান।

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)

নীচে আমি পেয়েছি ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


এটি সি ++ এ কীভাবে করা যায়? আমার কাছে অনুসন্ধানকন্টোর অংশ রয়েছে তবে তার পরে আমি উপরে দেখানো একটি বহুভুজনে আবৃত করার জন্য সংক্ষিপ্তসারগুলি দেখতে পাচ্ছি না (একটি আবদ্ধ আয়তক্ষেত্রের বিপরীতে)।
এলিয়নার্দো ফেলিসানো

আমি আপনার পদ্ধতির প্রশংসা করি এবং আমার ক্ষেত্রে আবেদন করার চেষ্টা করেছি তবে দুর্ভাগ্যক্রমে এটি পাইথনের ক্ষেত্রে অত্যন্ত ধীর (যদিও আমার ল্যাপটপে কোর আই 7 কিউএম এবং 8 জিবি র‌্যাম রয়েছে)। আমি অঞ্চলগুলি সনাক্ত করতে এমএসইআর ব্যবহার করি এবং এখন কোন জোড় অঞ্চল "সংলগ্ন" তা নির্ধারণ করা দরকার, আমি আপনার অ্যালগরিদমটি প্রান্তিক 10 দিয়ে চেষ্টা করেছি ... সংলগ্ন অঞ্চলগুলি ফিরে আসতে কয়েক বছর সময় লাগে।
জিম রায়নোর

4

সংযোগ সমস্যা সমাধানের জন্য, আপনি একটি ঘনিষ্ঠ অপারেশন চেষ্টা করতে পারেন:

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

আমি সন্দেহ করি যে এটি আপনার পছন্দসই ফলাফল আনবে তবে আপনি এটি ব্যবহার করে দেখতে পারেন।


2

দেখে মনে হচ্ছে আপনি নিজের ইমেজটিকে "ওভারগেটেশন" করছেন। জ্যোর্নার্জ বলেছে যে রূপচর্চা অপারেশনগুলি সাহায্য করবে। বিশেষত, একটি জলের শেডিং পদ্ধতির দূরত্ব যাচাইয়ের চেয়ে আপনি যা চান তার কাছাকাছি হওয়া উচিত (উপরে পাইথনের উদাহরণ হিসাবে)। Http://cmm.ensmp.fr/~beucher/wtshed.html দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.