Eu tenho que conectar contornos próximos em uma imagem com base na distância entre eles, que especifica se os contornos devem ser conectados.
Agora, já existe uma pergunta sobre o mesmo problema aqui /programming/8973017/opencv-c-obj-c-connect-nearby-contours, mas aqui ele mescla todos os contornos em um único. Isso eu não quero. Eu não acho que exista alguma função no opencv para isso, mas você pode sugerir um algoritmo para isso. Minha aplicação é assim:
Estou detectando mãos, então usei um algoritmo de detecção de pele para determiná-las, mas como minha pele não é branca e talvez por causa de condições de iluminação, em algum momento o contorno quebra no cotovelo. Então, eu quero que os contornos próximos sejam conectados, mas não todos (porque ambas as minhas mãos estarão lá em contornos.) (Por mãos, quero dizer do ombro à palma da mão.)
Além disso, acho que, ao usar alguma detecção de borda, vou obter os limites das minhas mãos e detectar se parte desse adesivo dentro desse limite é detectado como pele, então toda a região dentro desse limite será detectada como pele, mas não tenho certeza de como fazer isso parte.
Qualquer ajuda será apreciada. desde já, obrigado
Imagem de exemplo:
Nesta imagem, quero conectar pontos (8 conectividade) com menos de 40 pixels de distância, para que eu ponha minha mão esquerda em um único contorno
Meu objetivo é obter apenas o contorno da mão (não me importo com nenhuma outra região)
fonte
Respostas:
Se você não está preocupado com a velocidade ou o contorno exato da mão, abaixo está uma solução simples.
O método é o seguinte: você pega cada contorno e encontra distância de outros contornos. Se a distância for menor que 50, eles estão próximos e você os reúne. Caso contrário, eles são colocados como diferentes.
Portanto, verificar a distância de cada contorno é um processo demorado. Demora alguns segundos. Portanto, você não pode fazer isso em tempo real.
Além disso, para juntar contornos, coloquei-os em um único conjunto e desenhei um casco convexo para esse conjunto. Portanto, o resultado que você está obtendo é, na verdade, um casco convexo da mão, não uma mão real.
Abaixo está o meu pedaço de código no OpenCV-Python. Não busquei nenhuma otimização, só queria que funcionasse, só isso. Se resolver o seu problema, vá para a otimização.
Abaixo estão os resultados que obtive:
fonte
Para corrigir o problema de conectividade, você pode tentar uma operação fechada:
Duvido que isso produza os resultados desejados, mas você pode tentar.
fonte
Parece que você está "oversegmenting" sua imagem. Operações morfológicas, como bjnoernz sugeriu, ajudariam. Em particular, uma abordagem de captação de água deve se aproximar do que você deseja, além de apenas verificar a distância (como no exemplo de python acima). Veja http://cmm.ensmp.fr/~beucher/wtshed.html .
fonte