Saya perlu menemukan kotak dalam gambar menggunakan OpenCV (tidak ada masalah di matlab atau lainnya, umumnya yang saya harapkan adalah beberapa ide).
Perhatikan gambar uji di bawah ini:
Saya perlu menemukan kotak berwarna pada gambar di atas secara akurat (bukan strip panjang putih).
Apa yang telah aku lakukan :
Saya menerapkan metode umum (yang datang dengan sampel OpenCV), yaitu menemukan kontur di semua bidang warna, perkiraan dan periksa jumlah elemen = 4. Ini berfungsi untuk beberapa memperluas itu, beberapa kotak terdeteksi, terutama yang gelap.
Langkah selanjutnya yang saya lakukan adalah prediksi . yaitu pengaturan ini diperbaiki . Jadi, jika ada yang diperoleh, saya bisa memprediksi yang tersisa. Ini juga berhasil sampai batas tertentu. Tetapi akurasi sangat buruk.
Tetapi saya merasa prediksi bukanlah metode yang baik di sini dan tidak selalu memberikan jawaban yang akurat seperti yang diberikan pada langkah pertama.
Apa yang saya butuhkan :
1) Apakah ada metode lain yang lebih baik untuk mendeteksi kotak ini lebih akurat? Atau beberapa metode?
Satu poin penting adalah bahwa waktu tidak menjadi masalah di sini . Algoritma bisa lambat, tidak masalah. Tetapi akurasi adalah kriteria utama.
Terkadang, gambar bisa menjadi lebih buram.
Dan salah satu masalah utama yang saya hadapi adalah beberapa kotak memiliki warna yang hampir sama dengan latar belakang (periksa kolom 3 kotak pertama dan kedua).
Mencari ide, terima kasih sebelumnya
PEMBARUAN:
Di bawah ini adalah hasil akurat maksimum yang saya dapatkan:
Tentu saja, gambar hasil diubah ukurannya sedikit.
PEMBARUAN 2:
Saya telah memberikan solusi yang jauh lebih baik dalam jawaban saya di bawah ini: https://dsp.stackexchange.com/a/7526/818
sumber
Jawaban:
Upaya pertama menggunakan Matlab:
Hasil di wilayah berikut:
Seperti yang Anda lihat, memilih ambang yang menghasilkan jumlah wilayah tertinggi (T = 120) sudah akan memberikan 7 lokasi yang benar, beberapa lokasi digabung, satu positif palsu dan dua negatif palsu.
Ini adalah upaya yang cukup sederhana tetapi saya pikir itu menunjukkan bahwa pendekatan tersebut berhasil. Menambahkan beberapa barang untuk memecah daerah yang memanjang, atau melakukan ini untuk setiap saluran warna secara terpisah adalah beberapa hal yang dapat Anda lakukan untuk meningkatkannya.
Ini juga akan membantu jika Anda memberikan beberapa gambar uji lagi.
sumber
Saya telah mencoba sesuatu yang lain untuk meningkatkan hasil saya dalam pertanyaan. Solusi di bawah ini dengan asumsi bahwa kuadrat pertama (oranye) selalu terdeteksi pada langkah 1. Dan praktis karena warna kontrasnya yang tinggi dibandingkan dengan latar belakang. Bahkan hasil yang saya tunjukkan dalam pertanyaan telah mendeteksi dengan benar
Langkah 1: Temukan sebanyak mungkin kotak
Saya membagi gambar menjadi bidang R, G, B, H, S, V dan menetapkan ambang batas gambar untuk nilai ambang yang berbeda seperti kelipatan 25. Untuk setiap gambar, saya menemukan kotak di dalamnya, dan meletakkannya di "gambar topeng" . Saya juga menemukan tinggi dan lebar rata-rata bujur sangkar.
gambar topeng (Total 7/12 kotak terdeteksi):
Langkah 2: Bentuk kotak kotak
Selanjutnya saya menemukan centroid kotak ini dalam gambar topeng. Mengurutkan mereka dan menemukan pusat massa persegi pertama (oranye). Dari analisis dekat, kita dapat melihat celah antara dua kotak adalah kuadrat baik dalam arah horizontal maupun vertikal. Jadi dengan cara ini, saya membuat kotak kotak seperti di bawah ini dan menyebutnya ideal_squares (itu hanya sebuah nama, itu tidak berarti ini adalah output yang saya butuhkan):
ideal_squares:
Langkah 3: Remap the ideal_image
Sekarang kami memiliki centroid ideal_squares dan centroid asli. Saya menemukan kecocokan yang benar untuk setiap centroid asli dari ideal_centroids (dengan mengambil jarak euclidean di antara mereka). Lalu saya menggunakan Scipy interpolate.griddata untuk interpolasi dan memetakan ulang ideal_image sesuai dengan nilai centroid (hampir sama dengan melengkungkan yang dilakukan dalam T&J ini: Cara menghapus cacat kecembungan pada sudoku square & transformasi Gambar di OpenCV ). Jadi di bawah ini adalah output yang saya dapatkan:
Keluaran:
Langkah 4: ATAU beroperasi output di atas dengan gambar topeng dari langkah pertama
Sekarang Anda dapat melihat semua kotak terdeteksi, tetapi dengan masalah yang disebutkan di bawah ini:
Masalah:
Lihatlah output Langkah 3, yaitu gambar yang dipetakan ulang dari kotak persegi. Kecuali dua kotak pusat, semua kotak lainnya terpotong. Ini adalah masalah yang terkait dengan pemetaan ulang ini. Saya tidak yakin di mana masalahnya, dengan scipy.interpolate.griddata () atau cv2.remap (). Saya pikir seluruh gambar akan bengkok, tetapi tidak. Itu warp gambar hanya di dalam centroid yang kami berikan. Jika saya bisa memperbaikinya, hasilnya akan baik-baik saja.
Jadi, jika seseorang tahu ide bagus untuk itu, selamat datang !!!
sumber
Catatan: Metode ini akan sangat lambat.
Hasilkan topeng yang terlihat seperti kontur objek yang ideal. Mirip dengan ini:
kemudian geser (posisi, skala, rotasi) topeng di atas gambar dan cocokkan dengan kontur gambar nyata (mungkin kabur sedikit untuk mendapatkan respons yang lebih lembut) untuk menghitung seberapa mirip mereka, (posisi, skala, rotasi) dengan respons kesamaan tertinggi seharusnya adalah (posisi, skala, rotasi) dari objek nyata.
Metode ini tidak keberatan memadukan kuadrat ke latar belakang atau bahkan sebagian oklusi objek, karena mempertimbangkan seluruh objek.
Saya secara pribadi telah menggunakan metode ini dengan sukses untuk melacak moncong dan kumis tikus, tetapi saya memiliki beberapa anggapan seperti itu dekat dengan posisi terakhir yang diketahui dll. Tapi saya pikir Anda dapat menurunkan ruang pencarian dengan menerapkan beberapa asumsi seperti: ukuran yang mungkin dari objek di kamera, seberapa jauh dari pusat dapat atau rotasi <10deg dll.
sumber
Langkah 1: Apa pun gambar biner terakhir yang Anda peroleh dari analisis dalam bidang B, G, R, H, S, V, dalam gambar tersebut lakukan algoritma penghitungan gumpalan.
Langkah 2: Temukan gumpalan terbesar berdasarkan luas atau panjang kontur. Karena gumpalan Anda sebagian besar merupakan jenis jajaran genjang sehingga luas atau kontur, siapa pun akan melakukannya.
Langkah 3: Dengan gumpalan terbesar (karena gumpalan terbesar adalah gumpalan terbaik yang menyerupai kuadrat dunia nyata Anda) cobalah untuk menemukan orientasi gumpalan ... ini bisa Anda dapatkan dengan memasang persegi panjang paling pas ATAU Anda bisa mendapatkan titik sudut ... dapatkan kemiringan garis yang menyertainya (baik dalam cakrawala dan arah vertikal).
Langkah 4: Setelah Anda mendapatkan dua lereng, buat dua garis berjalan melalui sumbu gumpalan. untuk sumbu Anda dapat rata-rata titik sudut atau Anda dapat menggunakan centroid (pusat massa) ... Saya akan pergi dengan rata-rata titik sudut ...
Langkah 5: Karena di setiap arah horizontal dan vertikal, jaraknya sama (jarak horizontal dan vertikal idealnya juga sama karena berasal dari gambar persegi ideal Anda, tetapi kami tidak akan menganggapnya ..) hanya perlu menemukan kemungkinan centroid yang lain jajaran genjang
BOTTOM LINE: Jika ada satu kotak yang terdeteksi dengan sempurna, Anda dapat membuat seluruh kotak. Terus tandai pusat pada interval 2H (H = lebar horizontal gumpalan terbesar) sepanjang sumbu horizontal gumpalan terbesar dan pada interval 2V (V = ketinggian vertikal gumpalan terbesar) secara vertikal di sepanjang sumbu vertikal gumpalan.
Beberapa foto untuk didukung
sumber
Saya tidak benar-benar tahu prediksi seperti apa yang Anda lakukan sebelumnya, tetapi pernahkah Anda mencoba untuk fokus pada strip panjang putih sebagai root. Kemudian (jika 3 kolom kuadrat berukuran sama), Anda dapat mendeteksi ketinggian kotak (jarak antara dua strip) dan Anda dapat mendeteksi area max dan min (tinggi dan lebar) pada gambar.
Kemudian, cobalah untuk mendeteksi warna yang paling umum di dalam seluruh kotak Anda dan mengaturnya ke area "non-kotak". Sisanya seharusnya kotak yang Anda cari.
sumber
Saya akan menyarankan menggunakan transformasi Hough, yang merupakan algoritma yang sangat kuat untuk menemukan bentuk parametrik sederhana misalnya garis, lingkaran dll. Deteksi garis akan menjadi yang terbaik dalam kasus Anda. Setidaknya Anda bisa menemukan sisi-sisi dari tetesan putih panjang; kemudian, dengan algoritme ekstraktor sudut mana pun (Harris atau bahkan SIFT atau SURF), Anda dapat menemukan sudut di sepanjang garis tersebut, bahkan menggunakan fakta bahwa kotak-kotak tersebut kira-kira berjarak sama.
sumber
Saya mencoba masalah ini menggunakan opencv, python. Pendekatan melibatkan masking image berdasarkan warna, diikuti dengan menemukan kontur yang sesuai.
Kode: https://github.com/rbhambriiit/computer_vision/blob/master/find_color_box
[1 kotak terlewatkan tetapi itu harus datang dengan menyetel fungsi masking]
sumber