OpenCV / C ++ เชื่อมต่อรูปทรงใกล้เคียงตามระยะทางระหว่างพวกเขา


15

ฉันต้องเชื่อมต่อรูปทรงใกล้เคียงในภาพตามระยะห่างระหว่างพวกเขาซึ่งระบุว่าจะต้องเชื่อมต่อรูปทรงหรือไม่

ตอนนี้มีคำถามเกี่ยวกับปัญหาเดียวกันนี้แล้วที่นี่/programming/8973017/opencv-c-obj-c-connect-nearby-contoursแต่ที่นี่เขารวมรูปทรงทั้งหมดเป็นหนึ่งเดียว ฉันไม่ต้องการ ฉันไม่คิดว่ามีฟังก์ชั่นบางอย่างใน opencv สำหรับเรื่องนี้ แต่คุณสามารถแนะนำอัลกอริทึมสำหรับสิ่งนั้นได้ แอปพลิเคชันของฉันเป็นดังนี้:

ฉันกำลังตรวจจับมือดังนั้นฉันจึงใช้อัลกอริธึมการตรวจจับผิวหนังเพื่อตรวจสอบพวกเขา แต่เนื่องจากผิวของฉันไม่ขาวและอาจเป็นเพราะสภาพแสงบางครั้งเส้นแบ่งที่ข้อศอก ดังนั้นฉันจึงต้องการให้รูปทรงใกล้เคียงเชื่อมต่อกัน แต่ไม่ใช่ทั้งหมด (เพราะทั้งสองมือของฉันจะอยู่ในรูปทรง) (ด้วยมือฉันหมายถึงจากไหล่ถึงต้นปาล์ม)

ยิ่งกว่านั้นฉันคิดว่าการใช้การตรวจจับขอบบางอย่างฉันจะทำให้มือของฉันมีขอบเขตและตรวจสอบว่ามีการตรวจพบว่าแพทช์นี้ภายในขอบเขตนี้เป็นผิวหนังจากนั้นพื้นที่ทั้งหมดภายในขอบเขตนี้จะถูกตรวจพบเป็นผิวหนัง แต่ฉันไม่แน่ใจว่าจะทำอย่างไร ส่วนหนึ่ง

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม. ขอบคุณล่วงหน้า

ภาพตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ในภาพนี้ฉันต้องการเชื่อมต่อจุดเชื่อมต่อ (การเชื่อมต่อ 8 จุด) ซึ่งน้อยกว่าความยาว 40 พิกเซลเพื่อบอกว่าฉันจะได้มือซ้ายของฉันเป็นรูปร่างเดียว

เป้าหมายของฉันคือการได้รับรูปร่างของมือ (ฉันไม่สนใจเกี่ยวกับภูมิภาคอื่น ๆ )


ด้วยมือคุณหมายถึงแขนจริงๆ คุณไม่สามารถปรับเฉดสีที่ใช้ตรวจจับสีผิวให้เหมาะกับสีผิวของคุณได้หรือไม่?
waspinator

ฉันทำไปแล้วและมันก็ให้ผลดี (เมื่อผิวของฉันสว่าง) ดังนั้นในช่วงเย็นมันก็มาตามที่แสดง อย่างไรก็ตามฉันคิดว่าอาจมีวิธีการเชื่อมต่อกับ blobs ใกล้เคียง
Roney Island

เกี่ยวข้องกับdsp.stackexchange.com/q/2588/590
Chris

ยินดีต้อนรับสู่กองแลกเปลี่ยน SE ไม่ใช่ฟอรัม! นี่ไม่ใช่คำตอบสำหรับคำถาม หากคุณมีคำถามเกี่ยวกับคำถามให้ใส่นี่เป็นความคิดเห็น
Dipan Mehta

คุณตรวจจับผิวหนังได้อย่างไร
nkint

คำตอบ:


10

หากคุณไม่กังวลเกี่ยวกับความเร็วหรือรูปร่างที่แน่นอนด้านล่างเป็นคำตอบง่ายๆ

วิธีนี้เป็นเช่นนี้: คุณใช้แต่ละเส้นชั้นความสูงและหาระยะทางกับรูปทรงอื่น ๆ หากระยะทางน้อยกว่า 50 พวกมันอยู่ใกล้คุณและคุณรวมมันเข้าด้วยกัน ถ้าไม่พวกเขาจะแตกต่างกัน

ดังนั้นการตรวจสอบระยะห่างของแต่ละเส้นจึงเป็นกระบวนการที่ใช้เวลานาน ใช้เวลาสองสามวินาที ดังนั้นไม่มีวิธีที่คุณสามารถทำได้ในเวลาจริง

นอกจากนี้เพื่อเข้าร่วม contours ฉันใส่พวกเขาในชุดเดียวและดึงเปลือกนูนสำหรับชุดนั้น ดังนั้นผลลัพธ์ที่คุณได้รับคือลำเรือมือนูนไม่ใช่มือจริง

ด้านล่างเป็นโค้ดของฉันใน 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 ++ ฉันมีส่วนของ findContour มากขึ้น แต่หลังจากนั้นฉันก็ไม่สามารถนำรูปทรงที่ล้อมรอบเป็นรูปหลายเหลี่ยมดังที่แสดงไว้ด้านบน (ตรงข้ามกับสี่เหลี่ยมผืนผ้าที่มีขอบเขต)
Elionardo Feliciano

ฉันขอขอบคุณแนวทางของคุณและพยายามใช้กับกรณีของฉัน แต่น่าเสียดายที่มันช้ามากใน Python (แม้ว่าแล็ปท็อปของฉันมี Core i7QM และ 8GB RAM) ฉันใช้ MSER เพื่อตรวจหาภูมิภาคและตอนนี้จำเป็นต้องกำหนดคู่ของพื้นที่ที่เป็น "ติดกัน" ฉันลองอัลกอริทึมของคุณด้วยเกณฑ์ 10 ... ใช้เวลาหลายปีกว่าจะคืนค่าภูมิภาคที่อยู่ติดกัน
Jim Raynor

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.