Pencocokan kontur - menemukan perpindahan kontur

16

Saya menemukan kontur pada dua gambar dengan objek yang sama dan saya ingin menemukan perpindahan dan rotasi objek ini. Saya sudah mencoba dengan kotak pembatas yang diputar dari kontur ini dan kemudian sudut dan titik tengahnya tetapi pembalikan dari kotak pembatas tidak memberi tahu tentang rotasi kontur dengan benar karena itu sama untuk sudut a + 0, a 90, 180 + 180 dll. derajat. Apakah ada cara lain yang baik untuk menemukan rotasi dan perpindahan kontur? Mungkin beberapa penggunaan lambung cembung, cacat cembung? Saya telah membaca di Belajar OpenCv tentang mencocokkan kontur tetapi tidak membantu. Bisakah seseorang memberi contoh?

Contoh:

1 2 3 4

Saya ingin mendeteksi misalnya kotak merah muda, dan dalam pena kasus kedua. Contoh lain dapat berupa kotak dengan beberapa lubang, bintang dll. Seperti yang saya katakan saya ingin membuat beberapa hal yang tidak ramah. Setiap saran sangat dihargai karena saya ingin menguji sebanyak mungkin metode.

krzych
sumber
Gambar akan membantu di sini
mirror2image
Saya ingin membuat beberapa fungsi universal. Sehingga gambar tes bisa apa saja. Elemen berbentuk sederhana seperti persegi panjang, atau sedikit lebih kompleks berbentuk.
krzych
2
Ya, Anda tidak dapat menggunakan satu metode untuk semua kasus. Metode praktis tergantung pada rentang kontras, perkiraan kebisingan, latar belakang dan bentuk itu sendiri - itu halus, topologi dll. Itulah sebabnya gambar akan membantu.
mirror2image

Jawaban:

4

Apakah Anda harus khawatir tentang perbedaan skala antara kontur? Jika tidak, Anda dapat dengan mudah menemukan pusat massa dari setiap kontur, dan menghitung perpindahan dengan mengurangi satu dari yang lain. Kemudian Anda dapat menghitung sumbu utama kontur, dan menemukan sudut rotasi di antara mereka.

Jika penskalaan terlibat, maka Anda dapat menghitung faktor skala dengan mengambil rasio sumbu utama yang sesuai.

Dima
sumber
Ya skala juga bisa berbeda. Saya juga memikirkan sesuatu yang mirip dengan rantai freeman dari opencv membuat rantai freeman dari setiap kontur dan kemudian membandingkannya dan mencoba menemukan translaton dengan cara tertentu, tetapi saya tidak dapat menemukan beberapa algoritma yang baik untuk itu.
krzych
Ini sama dengan membuat kotak batas diputar minimum dan mengambil rotasi dan perpindahannya. Mencoba pendekatan ini dan hasilnya tidak memuaskan. Jadi saya pikir metode ini tidak baik sama sekali.
krzych
Bisakah Anda lebih spesifik mengapa itu tidak berhasil? Apakah kontur hanya terkait oleh terjemahan, rotasi, dan penskalaan, atau bisakah mereka dideformasi dengan cara lain? Beberapa gambar akan sangat membantu. Jika Anda perlu menangani transformasi non-affine atau noise acak, Anda dapat mencoba konteks bentuk. Biarkan saya tahu, saya bisa mengarahkan Anda ke beberapa surat kabar.
Dima
Mereka hanya terkait dengan terjemahan, rotasi dan penskalaan, deformasi terhubung ke sedikit deteksi kontur yang berbeda pada foto yang berbeda. Konteks bentuk? Bisakah Anda mengembangkan ini?
krzych
1
@ kzych Sepertinya masalah terbesar Anda di sini adalah noise di deteksi tepi. Bagaimana Anda menemukan kotak yang diputar minimum? Saya masih tidak jelas mengapa itu tidak berhasil. Konteks bentuk adalah cara mewakili kontur. Detailnya ada di sini: en.wikipedia.org/wiki/Shape_context
Dima
2

Jika Anda tidak perlu khawatir tentang skala atau kode rantai distorsi proyektif dapat membantu di sini. Jika Anda memiliki kode berantai dengan bentuk yang hampir sama dengan skala yang sama, Anda dapat menemukan terjemahan dengan korelasi fase FFT satu dimensi http://en.wikipedia.org/wiki/Phase_correlation

Jika Anda harus mempertimbangkan distorsi proyektif, Anda juga dapat mempertimbangkan kemungkinan menggunakan poin fitur (seperti sudut) daripada kontur.

mirror2image
sumber
Adakah saran bagaimana membangun kode rantai yang baik? Mayby sesuatu dari OpenCv (sejauh yang saya tahu itu hanya memiliki rantai freeman)? Untuk saat ini saya sedang membangun kode rantai menggunakan setiap titik kontur dan menghitung sudut ke sumbu x titik tetangga, tapi mungkin ada beberapa ide yang lebih baik? Jika Anda memiliki referensi ke makalah bagus tentang rantai itu akan dihargai.
krzych
2

Dalam pertanyaan yang Anda katakan

Seperti yang saya katakan, saya ingin membuat beberapa hal uniwersal

tetapi saya khawatir cukup sulit untuk menemukan solusi "universal" untuk masalah ini.

Anda dapat membeli perangkat lunak pencari pola yang tersedia secara komersial dan mengintegrasikannya dalam aplikasi Anda, biasanya mereka berkinerja cukup baik untuk berbagai aplikasi. Hanya untuk memberi Anda ide ini adalah referensi manual untuk produk semacam itu http://www.lmi3d.com/sites/default/files/support/4.2.0.70-hexsight_user_guide.pdf

Juga, Anda dapat mengembangkan solusi ad hoc untuk beberapa kasus tertentu (misalnya untuk pena di gambar Anda).

Kalau tidak, Anda dapat mempelajari masalah dengan susah payah, mulai dari dasar yang sangat mendasar yang berakar pada geometri komputasi ( http://www.cs.sunysb.edu/~algorith/files/shape-similarity.shtml ), tempat "kontur" Anda dipanggil "poligon", membaca hal-hal seperti:

M. de Berg, O. Devillers, M. Kreveld, O. Schwarzkopf, dan M. Teillaud. Menghitung tumpang tindih maksimum dua poligon cembung di bawah terjemahan. Ilmu Komputer Teoritis, 31: 613–628, 1998.

dan

H. Ahn, O. Cheong, C. Park, C. Shin, dan A. Vigneron. Memaksimalkan tumpang tindih dari dua set planar cembung di bawah gerakan yang kaku.Geometri Komputasi: Teori dan Aplikasi, 37: 3–15, 2007.

dan diakhiri dengan "Pengakuan Real-Time Hierarchical Objects in Images" oleh Markus Ulrich yang bekerja sama dengan MVTec , rumah perangkat lunak lain yang menjual alat perangkat lunak pengenalan objek.

Alessandro Jacopson
sumber