Saya harus menghubungkan kontur terdekat dalam gambar berdasarkan jarak di antara mereka yang menentukan apakah kontur harus dihubungkan.
Sekarang sudah ada pertanyaan tentang masalah yang sama di sini /programming/8973017/opencv-c-obj-c-connect-nearby-contours tetapi di sini ia menggabungkan semua kontur menjadi satu. Saya tidak mau ini. Saya tidak berpikir bahwa ada beberapa fungsi dalam OpenCV untuk ini tetapi Anda dapat menyarankan algoritma untuk itu. Aplikasi saya berjalan seperti ini:
Saya mendeteksi tangan, jadi saya menggunakan algoritma pendeteksian kulit untuk menentukannya, tetapi karena kulit saya tidak putih dan mungkin karena kondisi keringanan kadang-kadang kontur patah pada siku. Jadi saya ingin kontur terdekat terhubung tetapi tidak semuanya (karena kedua tangan saya akan ada di kontur.) (Dengan tangan saya maksudkan dari bahu ke telapak tangan.)
Selain itu saya berpikir bahwa dengan menggunakan beberapa deteksi tepi saya akan mendapatkan batas tangan saya dan mendeteksi jika beberapa patch di dalam batas ini terdeteksi sebagai kulit maka seluruh wilayah dalam batas ini akan terdeteksi sebagai kulit tetapi saya tidak yakin bagaimana melakukan ini. bagian.
Bantuan apa pun akan dihargai. Terima kasih sebelumnya
Contoh gambar:
Dalam Gambar ini saya ingin menghubungkan titik (8 konektivitas) yang kurang dari katakan jarak 40 piksel sehingga saya akan mendapatkan tangan kiri sebagai satu kontur
Tujuan saya adalah hanya mendapatkan kontur tangan (saya tidak peduli dengan daerah lain)
Jawaban:
Jika Anda tidak khawatir tentang kecepatan atau kontur tangan yang tepat, di bawah ini adalah solusi sederhana.
Metodenya seperti ini: Anda mengambil setiap kontur dan menemukan jarak ke kontur lainnya. Jika jaraknya kurang dari 50, mereka berada di dekatnya dan Anda menyatukannya. Jika tidak, mereka dianggap berbeda.
Jadi memeriksa jarak ke setiap kontur adalah proses yang memakan waktu. Butuh beberapa detik. Jadi tidak mungkin Anda bisa melakukannya secara real time.
Juga, untuk bergabung dengan kontur, saya menempatkan mereka dalam satu set dan menggambar lambung cembung untuk set itu. Jadi hasil yang Anda dapatkan sebenarnya adalah lambung cembung, bukan tangan asli.
Di bawah ini adalah kode saya di OpenCV-Python. Saya belum pergi untuk optimasi apa pun, hanya ingin bekerja, itu saja. Jika itu memecahkan masalah Anda, pergi untuk optimasi.
Di bawah ini adalah hasil yang saya dapatkan:
sumber
Untuk memperbaiki masalah konektivitas, Anda dapat mencoba operasi tutup:
Saya ragu bahwa ini akan menghasilkan hasil yang Anda inginkan, tetapi Anda dapat mencobanya.
sumber
Sepertinya Anda "men-overegmentasikan" gambar Anda. Operasi morfologis, seperti yang disarankan bjnoernz, akan membantu. Secara khusus, pendekatan watershedding harus lebih dekat dengan apa yang Anda inginkan daripada hanya memeriksa jarak (seperti pada contoh python di atas). Lihat http://cmm.ensmp.fr/~beucher/wtshed.html .
sumber