Pemrosesan Gambar: Peningkatan Algoritma untuk Pengakuan 'Coca-Cola Can'

1659

Salah satu proyek paling menarik yang saya kerjakan dalam beberapa tahun terakhir adalah proyek tentang pemrosesan gambar . Tujuannya adalah untuk mengembangkan sistem agar dapat mengenali 'kaleng' Coca-Cola (perhatikan bahwa saya menekankan kata 'kaleng', Anda akan mengerti mengapa dalam satu menit). Anda dapat melihat sampel di bawah ini, dengan dapat dikenali dalam persegi panjang hijau dengan skala dan rotasi.

Pencocokan template

Beberapa kendala pada proyek:

  • Latar belakang bisa sangat bising.
  • Can dapat memiliki skala atau rotasi atau bahkan orientasi apa pun (dalam batas yang wajar).
  • Gambar dapat memiliki beberapa tingkat ketidakjelasan (kontur mungkin tidak sepenuhnya lurus).
  • Mungkin ada botol Coca-Cola di gambar, dan algoritme seharusnya hanya mendeteksi kaleng !
  • Kecerahan gambar bisa sangat bervariasi (sehingga Anda tidak bisa mengandalkan "terlalu banyak" pada deteksi warna).
  • The kaleng bisa sebagian tersembunyi di sisi atau tengah dan mungkin sebagian tersembunyi di balik botol.
  • Mungkin tidak ada yang bisa sama sekali dalam gambar, dalam hal ini Anda harus menemukan apa-apa dan menulis pesan yang mengatakannya.

Jadi Anda bisa berakhir dengan hal-hal rumit seperti ini (yang dalam hal ini algoritme saya benar-benar gagal):

Gagal total

Saya melakukan proyek ini beberapa waktu lalu, dan sangat senang melakukannya, dan saya memiliki implementasi yang layak. Berikut ini beberapa detail tentang implementasi saya:

Bahasa : Dilakukan dalam C ++ menggunakan pustaka OpenCV .

Pra-pemrosesan : Untuk pra-pemrosesan gambar, yaitu mengubah gambar menjadi bentuk yang lebih mentah untuk diberikan kepada algoritma, saya menggunakan 2 metode:

  1. Mengubah domain warna dari RGB ke HSV dan menyaring berdasarkan rona "merah", saturasi di atas ambang batas tertentu untuk menghindari warna seperti oranye, dan penyaringan bernilai rendah untuk menghindari nada gelap. Hasil akhirnya adalah gambar hitam putih biner, di mana semua piksel putih akan mewakili piksel yang cocok dengan ambang ini. Jelas masih ada banyak omong kosong dalam gambar, tetapi ini mengurangi jumlah dimensi yang harus Anda kerjakan. Gambar yang dipolarisasi
  2. Pemfilteran noise menggunakan pemfilteran median (mengambil nilai piksel median dari semua tetangga dan mengganti piksel dengan nilai ini) untuk mengurangi noise.
  3. Menggunakan Canny Edge Detection Filter untuk mendapatkan kontur semua item setelah 2 langkah sebelumnya. Deteksi kontur

Algoritma : Algoritma itu sendiri yang saya pilih untuk tugas ini diambil dari buku yang luar biasa ini tentang ekstraksi fitur dan disebut Generalized Hough Transform (sangat berbeda dari Hough Transform biasa). Pada dasarnya dikatakan beberapa hal:

  • Anda dapat mendeskripsikan objek di ruang tanpa mengetahui persamaan analitisnya (yang terjadi di sini).
  • Ini tahan terhadap deformasi gambar seperti penskalaan dan rotasi, karena pada dasarnya akan menguji gambar Anda untuk setiap kombinasi faktor skala dan faktor rotasi.
  • Ia menggunakan model dasar (templat) yang akan "dipelajari" algoritma.
  • Setiap piksel yang tersisa dalam gambar kontur akan memilih piksel lain yang konon akan menjadi pusat (dalam hal gravitasi) objek Anda, berdasarkan apa yang dipelajari dari model.

Pada akhirnya, Anda berakhir dengan peta panas suara, misalnya di sini semua piksel kontur kaleng akan memilih untuk pusat gravitasinya, sehingga Anda akan memiliki banyak suara dalam piksel yang sama sesuai dengan pusat, dan akan melihat puncak di peta panas seperti di bawah ini:

GHT

Setelah Anda memilikinya, heuristik berbasis ambang batas sederhana dapat memberi Anda lokasi piksel tengah, dari mana Anda dapat memperoleh skala dan rotasi dan kemudian plot persegi panjang kecil Anda di sekitarnya (skala akhir dan faktor rotasi jelas akan relatif terhadap Anda template asli). Secara teori setidaknya ...

Hasil : Sekarang, sementara pendekatan ini bekerja dalam kasus-kasus dasar, itu sangat kurang di beberapa bidang:

  • Ini sangat lambat ! Saya tidak cukup menekankan hal ini. Hampir satu hari penuh diperlukan untuk memproses 30 gambar uji, jelas karena saya memiliki faktor penskalaan yang sangat tinggi untuk rotasi dan terjemahan, karena beberapa kaleng sangat kecil.
  • Itu benar-benar hilang ketika botol ada dalam gambar, dan untuk beberapa alasan hampir selalu menemukan botol alih-alih kaleng (mungkin karena botol lebih besar, sehingga memiliki lebih banyak piksel, sehingga lebih banyak suara)
  • Gambar fuzzy juga tidak bagus, karena suara berakhir dalam pixel di lokasi acak di sekitar pusat, sehingga berakhir dengan peta panas yang sangat bising.
  • Perbedaan dalam terjemahan dan rotasi dicapai, tetapi tidak dalam orientasi, yang berarti bahwa kaleng yang tidak langsung menghadap sasaran kamera tidak dikenali.

Dapatkah Anda membantu saya meningkatkan algoritma spesifik saya , menggunakan fitur OpenCV eksklusif , untuk menyelesaikan empat masalah spesifik yang disebutkan?

Saya harap beberapa orang juga akan belajar sesuatu dari itu, setelah semua saya pikir tidak hanya orang yang bertanya harus belajar. :)

Charles Menguy
sumber
45
Bisa dikatakan bahwa pertanyaan ini lebih tepat di dsp.stackexchange.com, atau stats.stackexchange.com, dan Anda tentu harus mempertimbangkan untuk bertanya kembali di situs-situs itu juga.
Ely
49
Hal pertama yang harus dilakukan di sini adalah menganalisis mengapa berbagai kasus kegagalan terjadi. Misalnya, pisahkan contoh tempat botol menang, tempat gambar tidak jelas, dll., Dan lakukan beberapa analisis statistik untuk mempelajari perbedaan antara representasi Hough dan yang Anda inginkan akan dideteksi. Beberapa tempat yang bagus untuk belajar tentang pendekatan alternatif ada di sini dan di sini
ely
7
@ Stacker membuat poin yang bagus. Untuk kecepatan, Anda ingin mendapatkan fitur komputasi murah, seperti histogram gradien berorientasi. Pendekatan pertama yang benar-benar naif adalah memberi label secara manual pada sekelompok kaleng persegi panjang dalam beberapa gambar pelatihan, dan menggunakan contoh negatif plus acak ini untuk melatih SVM atau class-tree classifier. Pelatihan akan memakan waktu lebih lama, tetapi eksekusi pada gambar novel akan jauh lebih cepat. Saya berencana untuk menulis metode ini ketika saya mendapatkan lebih banyak waktu luang untuk memasukkan referensi yang tepat.
ely
9
Bagaimana dengan pendekatan yang mirip dengan reCAPTCHA ? ;)
George Duckett
39
Mengapa ini dipindahkan dari dsp.stackexchange.com ? Sepertinya situs itu akan lebih cocok daripada stackoverflow o_O
BlueRaja - Danny Pflughoeft

Jawaban:

672

Pendekatan alternatif adalah mengekstraksi fitur (keypoint) menggunakan transformasi fitur invarian skala (SIFT) atau Fitur Mempercepat Kuat (SURF).

Ini diimplementasikan dalam OpenCV 2.3.1.

Anda dapat menemukan contoh kode yang bagus menggunakan fitur di Features2D + Homografi untuk menemukan objek yang dikenal

Kedua algoritme tersebut tidak berbeda dengan penskalaan dan rotasi. Karena mereka bekerja dengan fitur, Anda juga dapat menangani oklusi (selama cukup banyak penekanan tombol yang terlihat).

Masukkan deskripsi gambar di sini

Sumber gambar: contoh tutorial

Pemrosesan membutuhkan beberapa ratus ms untuk SIFT, SURF sedikit lebih cepat, tetapi tidak cocok untuk aplikasi waktu nyata. ORB menggunakan FAST yang lebih lemah terkait invarian rotasi.

Koran-koran asli

stacker
sumber
6
Saya setuju dengan @stacker - SIFT adalah pilihan yang sangat baik. Ini sangat kuat terhadap operasi skala dan rotasi. Ini agak kuat terhadap deformasi perspektif (ini dapat ditingkatkan seperti yang disarankan oleh stacker: database template dengan pandangan perspektif yang berbeda dari objek yang diinginkan). Tumor Achilles dalam pengalaman saya adalah variasi pencahayaan yang kuat dan perhitungan yang sangat mahal. Saya tidak tahu implementasi Java apa pun. Saya mengetahui implementasi OpenCV dan telah menggunakan implementasi GPU c ++ / Windows ( SiftGPU ) yang cocok untuk kinerja waktu nyata.
31
Sebuah catatan peringatan: sebanyak saya suka SIFT / SURF dan apa yang telah mereka lakukan terhadap saya, mereka dibebani hak paten. Ini mungkin masalah, tergantung pada sejumlah kondisi termasuk lokasi geografis AFAIK.
Agos
12
Jadi cobalah ORB atau FREAK OpenCV yang tidak memiliki masalah paten. ORB jauh lebih cepat daripada SIFT. ORB agak buruk dengan variasi skala dan cahaya dalam pengalaman saya, tetapi mengujinya sendiri.
Rui Marques
66
Bagaimana Anda dapat menerima ini sebagai jawaban ... Tidak ada deskriptor fitur yang dapat membedakan botol dari kaleng. Mereka semua hanya melihat deskriptor pola lokal yang tidak berubah. Saya setuju bahwa SIFT, SURF, ORB, FREAK dll. Dapat membantu Anda dalam pencocokan fitur tapi .. Bagaimana dengan bagian pertanyaan Anda yang lain seperti oklusi, Bottle vs Can, dll. Saya harap ini bukan solusi lengkap sebenarnya jika Anda mau telah GOOGLED masalah Anda mungkin hasil pertama adalah jawaban ini saja.
G453
11
@ G453 Anda memang benar! Mungkin dia terpesona oleh kinerja SHIFT dan lupa bahwa ekstraksi fitur dan pencocokan BUKAN MASALAH ...
sepdek
383

Untuk mempercepat, saya akan mengambil keuntungan dari fakta bahwa Anda tidak diminta untuk menemukan gambar / objek yang berubah-ubah, tetapi secara khusus menggunakan logo Coca-Cola. Ini penting karena logo ini sangat khas, dan harus memiliki karakteristik, tanda-skala invarian dalam domain frekuensi, khususnya di saluran merah RGB. Dengan kata lain, pola bolak-balik antara merah-ke-putih-ke-merah yang ditemui oleh garis pemindaian horizontal (dilatih pada logo yang selaras secara horizontal) akan memiliki "ritme" yang khas saat melewati poros tengah logo. Ritme itu akan "mempercepat" atau "memperlambat" pada skala dan orientasi yang berbeda, tetapi akan tetap setara secara proporsional. Anda dapat mengidentifikasi / menetapkan beberapa lusin scanlines tersebut, baik secara horizontal dan vertikal melalui logo dan beberapa lagi secara diagonal, dalam pola starburst. Sebut ini "garis pindai tanda tangan."

Garis pemindaian tanda tangan

Mencari tanda tangan ini di gambar target adalah masalah sederhana memindai gambar dalam strip horizontal. Carilah frekuensi tinggi di saluran merah (yang mengindikasikan bergerak dari daerah merah ke yang putih), dan sekali ditemukan, lihat apakah itu diikuti oleh salah satu ritme frekuensi yang diidentifikasi dalam sesi pelatihan. Setelah kecocokan ditemukan, Anda akan langsung mengetahui orientasi garis pindai dan lokasi di logo (jika Anda melacak hal-hal itu selama pelatihan), jadi mengidentifikasi batas-batas logo dari sana sepele.

Saya akan terkejut jika ini bukan algoritma linear-efisien, atau hampir jadi. Ini jelas tidak membahas diskriminasi botol kaleng Anda, tetapi setidaknya Anda akan memiliki logo Anda.

(Pembaruan: untuk pengenalan botol, saya akan mencari kokas (cairan coklat) yang berdekatan dengan logo - yaitu di dalam botol. Atau, dalam kasus botol kosong, saya akan mencari tutup yang selalu memiliki bentuk dasar yang sama, ukuran, dan jarak dari logo dan biasanya akan semua putih atau merah. Mencari bentuk elips warna solid di mana topi harus , relatif terhadap logo. Tidak mudah tentu saja, tetapi tujuan Anda di sini adalah untuk menemukan mudah yang cepat .)

(Sudah beberapa tahun sejak hari pemrosesan gambar saya, jadi saya menyimpan saran ini tingkat tinggi dan konseptual. Saya pikir ini mungkin sedikit mendekati bagaimana mata manusia dapat beroperasi - atau setidaknya bagaimana otak saya!)

kmote
sumber
24
Itu saran yang bagus, saya terutama menyukai kenyataan bahwa algoritma ini harus cukup cepat, bahkan jika itu mungkin akan memiliki banyak negatif palsu. Salah satu tujuan tersembunyi saya adalah menggunakan deteksi ini secara real-time untuk robotika, sehingga bisa menjadi kompromi yang bagus!
Charles Menguy
42
Ya, sering dilupakan (dalam bidang yang ditandai dengan presisi) bahwa algoritma aproksimasi sangat penting untuk sebagian besar tugas real-time, pemodelan dunia nyata. (Saya mendasarkan tesis saya pada konsep ini.) Simpan algoritma Anda yang menuntut waktu untuk wilayah terbatas (untuk memangkas positif palsu). Dan ingat: dalam robotika Anda biasanya tidak terbatas pada satu gambar. Dengan asumsi robot mobile, alg cepat dapat mencari lusinan gambar dari sudut yang berbeda dalam waktu kurang dari yang dihabiskan algoritma canggih pada satu, secara signifikan mengurangi negatif palsu.
kmote
29
Saya menyukai gagasan untuk menggunakan apa yang jumlahnya untuk pemindai kode batang untuk deteksi logo Coca-Cola yang sangat cepat . +1!
Li-aung Yip
8
Masalah mencari tanda tangan dalam hal ini adalah bahwa jika kita memutar kaleng ke sisi lain, yaitu menyembunyikan tanda tangan, algoritme akan gagal mendeteksi kaleng.
karlphillip
34
@karlphillip: Jika Anda menyembunyikan tanda tangan, yaitu logo, maka metode apa pun yang didasarkan pada pencarian logo akan gagal.
Li-aung Yip
162

Masalah yang menyenangkan: ketika saya melirik gambar botol Anda, saya pikir itu juga bisa. Tapi, sebagai manusia, apa yang saya lakukan untuk mengatakan perbedaannya adalah saya kemudian memperhatikan bahwa itu juga sebuah botol ...

Jadi, untuk membedakan kaleng dan botol, bagaimana kalau hanya memindai botol dulu? Jika Anda menemukannya, tutup label sebelum mencari kaleng.

Tidak terlalu sulit untuk diterapkan jika Anda sudah melakukan kaleng. Kelemahan sebenarnya adalah dua kali lipat waktu pemrosesan Anda. (Tapi berpikir ke depan untuk aplikasi dunia nyata, Anda akhirnya ingin melakukan botol ;-)

Darren Cook
sumber
5
Ya saya sudah memikirkannya juga, tetapi tidak punya banyak waktu untuk melakukannya. Bagaimana Anda mengenali botol, karena bagian utamanya akan terlihat seperti kaleng bersisik? Saya berpikir untuk mencari sumbat merah juga dan melihat apakah itu selaras dengan pusat botol, tetapi itu tidak tampak sangat kuat.
Charles Menguy
42
Jika ada tutup merah (atau cincin) sejajar dengan "Coca cola", kemungkinan besar itu adalah botol.
Lukasz Madon
@linker Bagaimana Anda melatih algoritme untuk kaleng? Apakah Anda punya contoh kaleng? Bagaimana dengan pelatihan dengan contoh botol?
siamii
1
Kekuatan dari algoritma ini adalah bahwa Anda hanya perlu satu templat untuk dilatih, dan kemudian menerapkan semua transformasi untuk mencocokkannya dengan kaleng potensial lainnya. Saya menggunakan versi templat berbasis binari dan berbasis kontur ini untuk berlatih, jadi satu-satunya perbedaan antara kaleng dan botol adalah colokannya, tetapi saya khawatir itu akan membawa lebih banyak false positive karena pusat gravitasi akan berada di suatu tempat di tepi atau di luar botol. Layak untuk dicoba, kurasa. Tapi itu akan menggandakan waktu pemrosesan saya dan saya akan menangis;)
Charles Menguy
7
Pada dasarnya ini adalah arah yang masuk akal. Saya akan mengatakannya sedikit berbeda: Pertama temukan semua kandidat, dan kemudian untuk setiap kandidat tentukan apakah itu botol, kaleng, atau yang lainnya.
MSalters
131

Bukankah sulit bagi manusia untuk membedakan antara botol dan kaleng pada gambar kedua (asalkan wilayah transparan botol disembunyikan)?

Mereka hampir sama kecuali untuk wilayah yang sangat kecil (yaitu, lebar di bagian atas kaleng agak kecil sementara pembungkus botol memiliki lebar yang sama di seluruh, tetapi perubahan kecil kan?)

Hal pertama yang terlintas di benak saya adalah memeriksa botol merah. Tapi itu masih menjadi masalah, jika tidak ada tutup botol, atau jika sebagian tersembunyi (seperti yang disebutkan di atas).

Hal kedua yang saya pikirkan adalah tentang transparansi botol. OpenCV memiliki beberapa karya untuk menemukan objek transparan dalam gambar. Periksa tautan di bawah ini.

Terutama lihat ini untuk melihat seberapa akurat mereka mendeteksi kaca:

Lihat hasil implementasi mereka:

Masukkan deskripsi gambar di sini

Mereka mengatakan itu adalah implementasi dari makalah "Kerangka Kerja Kontur Aktif Geodesik untuk Menemukan Kaca" oleh K. McHenry dan J. Ponce, CVPR 2006 .

Ini mungkin membantu dalam kasus Anda sedikit, tetapi masalah muncul lagi jika botol diisi.

Jadi saya pikir di sini, Anda dapat mencari tubuh transparan botol pertama atau untuk wilayah merah yang terhubung ke dua benda transparan lateral yang jelas botol. (Saat bekerja idealnya, gambar sebagai berikut.)

Masukkan deskripsi gambar di sini

Sekarang Anda dapat menghapus wilayah kuning, yaitu label botol dan menjalankan algoritma Anda untuk menemukan kaleng.

Lagi pula, solusi ini juga memiliki masalah yang berbeda seperti pada solusi lainnya.

  1. Ini hanya berfungsi jika botol Anda kosong. Dalam hal ini, Anda harus mencari wilayah merah di antara dua warna hitam (jika cairan Coca Cola berwarna hitam).
  2. Masalah lain jika bagian transparan tertutup.

Tapi bagaimanapun, jika tidak ada masalah di atas dalam gambar, ini tampaknya menjadi cara yang lebih baik.

Abid Rahman K
sumber
+1 Saya memikirkan hal ini dan sedang berupaya menerapkan pendekatan ini. Namun, @linker harus membagikan rangkaian gambarnya sehingga kami dapat mencoba melakukan tebakan yang lebih terdidik.
karlphillip
ya .. saya juga berpikir itu bagus jika ada lebih banyak gambar.
Abid Rahman K
Mempertimbangkan jika kita hanya memiliki label untuk botol / kaleng dan tidak ada faktor pembeda lain dari tutup botol atau transparansi atau dapat atas / bawah - Lebar botol berbeda dari lebar kaleng.
Ken
Bagaimana jika kaleng diletakkan di depan logo untuk botol?
AlgoRythm
51

Saya sangat suka jawaban Darren Cook dan stacker untuk masalah ini. Saya berada di tengah-tengah melemparkan pikiran saya ke dalam komentar tentang itu, tetapi saya percaya pendekatan saya terlalu berbentuk jawaban untuk tidak pergi dari sini.

Singkatnya, Anda telah mengidentifikasi algoritma untuk menentukan bahwa logo Coca-Cola hadir di lokasi tertentu di luar angkasa. Anda sekarang mencoba untuk menentukan, untuk orientasi sewenang-wenang dan faktor skala sewenang-wenang, yang cocok heuristik untuk membedakan Coca-Cola kaleng dari benda-benda lain, termasuk: botol , billboard , iklan , dan Coca-Cola perlengkapan semua yang berhubungan dengan logo ikonik ini. Anda tidak menyebut banyak dari kasus-kasus tambahan ini dalam pernyataan masalah Anda, tetapi saya merasa mereka penting untuk keberhasilan algoritma Anda.

Rahasianya di sini adalah menentukan fitur visual apa yang bisa berisi atau, melalui ruang negatif, fitur apa yang ada untuk produk Coke lain yang tidak ada untuk kaleng. Untuk itu, jawaban teratas saat ini menggambarkan pendekatan dasar untuk memilih "bisa" jika dan hanya jika "botol" tidak teridentifikasi, baik dengan adanya tutup botol, cairan, atau heuristik visual serupa lainnya.

Masalahnya adalah ini rusak. Sebuah botol bisa, misalnya, kosong dan tidak memiliki tutup, yang mengarah ke positif palsu. Atau, itu bisa berupa botol parsial dengan fitur tambahan hancur, mengarah lagi ke deteksi palsu. Tidak perlu dikatakan, ini tidak elegan, juga tidak efektif untuk tujuan kita.

Untuk tujuan ini, kriteria pemilihan kaleng yang paling benar adalah sebagai berikut:

  • Apakah bentuk bayangan objek, seperti yang Anda sketsa dalam pertanyaan Anda , benar? Jika demikian, +1.
  • Jika kita menganggap ada cahaya alami atau buatan, apakah kita mendeteksi garis krom pada botol yang menandakan apakah ini terbuat dari aluminium? Jika demikian, +1.
  • Apakah kita menentukan bahwa properti specular objek sudah benar, relatif terhadap sumber cahaya kita ( tautan video ilustratif pada deteksi sumber cahaya )? Jika demikian, +1.
  • Bisakah kita menentukan properti lain tentang objek yang mengidentifikasinya sebagai kaleng, termasuk, tetapi tidak terbatas pada, kemiringan gambar topologis logo, orientasi objek, penjajaran objek (misalnya, pada permukaan planar) seperti meja atau dalam konteks kaleng lain), dan keberadaan tab penarik? Jika demikian, untuk masing-masing, +1.

Klasifikasi Anda kemudian akan terlihat seperti berikut:

  • Untuk setiap pertandingan kandidat, jika keberadaan logo Coca Cola terdeteksi, buat garis abu-abu.
  • Untuk setiap kecocokan lebih dari +2, buat garis merah.

Ini secara visual menyoroti kepada pengguna apa yang terdeteksi, menekankan kelemahan positif yang mungkin, dengan benar, dideteksi sebagai kaleng hancur.

Deteksi setiap properti membawa kompleksitas waktu dan ruang yang sangat berbeda, dan untuk setiap pendekatan, akses cepat ke http://dsp.stackexchange.com lebih dari cukup untuk menentukan algoritma yang paling benar dan paling efisien untuk keperluan Anda. Maksud saya di sini adalah, murni dan sederhana, untuk menekankan bahwa mendeteksi jika sesuatu adalah suatu kaleng dengan membatalkan sebagian kecil dari ruang deteksi kandidat bukanlah solusi yang paling kuat atau efektif untuk masalah ini, dan idealnya, Anda harus mengambil tindakan yang sesuai demikian.

Dan hei, selamat atas posting Hacker News! Secara keseluruhan, ini adalah pertanyaan yang cukup hebat layak publisitas yang diterimanya. :)

MrGomez
sumber
2
Itu pendekatan yang menarik yang setidaknya patut dicoba, saya sangat suka alasan Anda pada masalah
Charles Menguy
Ini adalah jenis apa yang saya pikirkan: jangan mengesampingkan jenis positif palsu tertentu. Atur lebih banyak fitur dari apa yang membuat kokas bisa. Tapi saya bertanya-tanya: apa yang Anda lakukan tentang kaleng yang terjepit Maksud saya, jika Anda menginjak kaleng kokas itu masih kaleng kokas. Tapi itu tidak akan memiliki bentuk yang sama lagi. Atau apakah itu masalah AI-Lengkap?
Ian
41

Melihat bentuk

Ambil melihat bentuk bagian merah kaleng / botol. Perhatikan bagaimana kaleng meruncing sedikit di bagian paling atas sedangkan label botol lurus. Anda dapat membedakan antara keduanya dengan membandingkan lebar bagian merah di sepanjang itu.

Melihat highlight

Salah satu cara untuk membedakan antara botol dan kaleng adalah bahannya. Botol terbuat dari plastik sedangkan kaleng terbuat dari logam aluminium. Dalam situasi yang cukup terang, melihat specularity akan menjadi salah satu cara untuk mengatakan label botol dari label kaleng.

Sejauh yang saya tahu, itulah cara manusia membedakan perbedaan antara dua jenis label. Jika kondisi pencahayaan buruk, pasti ada ketidakpastian dalam membedakan keduanya. Dalam hal ini, Anda harus dapat mendeteksi keberadaan botol transparan / bening itu sendiri.

tskuzzy
sumber
Saya suka ide itu, tetapi sepertinya Anda memerlukan beberapa kondisi pencahayaan yang benar-benar bagus. Pada contoh gambar di mana ada kaleng dan botol misalnya, ini agak sulit untuk membuat perbedaan.
Charles Menguy
Dalam contoh Anda, perhatikan bagaimana specularity untuk label plastik jauh lebih menyebar daripada titik-titik yang sangat terang pada kaleng? Begitulah cara Anda tahu.
tskuzzy
Saya melihat, representasi ruang warna seperti apa yang akan Anda gunakan dalam kasus ini untuk menangkap spekularitas dalam algoritme Anda? Ini sepertinya cukup sulit untuk didapatkan di RGB atau HSV
Charles Menguy
3
Bagaimana jika sumber cahaya ada di belakang kaleng? Saya pikir Anda tidak akan melihat puncaknya.
Rui Marques
37

Silakan lihat pelacak Predator Zdenek Kalal . Ini membutuhkan beberapa pelatihan, tetapi dapat secara aktif mempelajari bagaimana objek yang dilacak melihat berbagai orientasi dan skala dan melakukannya secara realtime!

Kode sumber tersedia di situsnya. Itu ada di MATLAB , tapi mungkin ada implementasi Java yang sudah dilakukan oleh anggota komunitas. Saya telah berhasil mengimplementasikan kembali bagian pelacak TLD di C #. Jika saya ingat dengan benar, TLD menggunakan Ferns sebagai pendeteksi titik kunci. Saya menggunakan SURF atau SIFT sebagai gantinya (sudah disarankan oleh @stacker) untuk mendapatkan kembali objek jika hilang oleh pelacak. Umpan balik pelacak membuatnya mudah dibuat dengan waktu daftar dinamis dari template pengayakan / penelusuran yang dengan waktu memungkinkan untuk mendapatkan kembali objek dengan presisi sangat tinggi.

Jika Anda tertarik dengan implementasi C # saya dari pelacak, jangan ragu untuk bertanya.

Nakilon
sumber
Terima kasih atas tautannya yang terlihat menarik. Mengenai pelatihan, berapa ukuran set pelatihan yang masuk akal untuk mencapai hasil yang masuk akal? Jika Anda memiliki implementasi bahkan dalam c # itu akan sangat membantu juga!
Charles Menguy
Saat meneliti TLD, saya menemukan pengguna lain mencari implementasi C # --- apakah ada alasan untuk tidak menempatkan pekerjaan Anda di Github? stackoverflow.com/questions/29436719/…
spillner
2
NB Bertahun-tahun, kemudian, tautannya sekarang mati
J Evans
33

Jika Anda tidak terbatas hanya pada kamera yang tidak berada di salah satu kendala Anda, mungkin Anda dapat beralih menggunakan sensor rentang seperti Xbox Kinect . Dengan ini, Anda dapat melakukan segmentasi yang cocok berdasarkan kedalaman dan warna gambar. Ini memungkinkan pemisahan objek yang lebih cepat dalam gambar. Anda kemudian dapat menggunakan pencocokan ICP atau teknik serupa bahkan untuk mencocokkan bentuk kaleng daripada hanya garis atau warna dan mengingat bahwa itu silinder, ini mungkin merupakan opsi yang valid untuk orientasi apa pun jika Anda memiliki pemindaian 3D target sebelumnya. Teknik-teknik ini seringkali cukup cepat terutama ketika digunakan untuk tujuan tertentu yang harus menyelesaikan masalah kecepatan Anda.

Saya juga bisa menyarankan, tidak harus untuk akurasi atau kecepatan tetapi untuk bersenang-senang Anda bisa menggunakan jaringan saraf terlatih pada gambar tersegmentasi rona Anda untuk mengidentifikasi bentuk kaleng. Ini sangat cepat dan seringkali bisa akurat hingga 80/90%. Pelatihan akan menjadi sedikit proses yang panjang karena Anda harus mengidentifikasi kaleng di setiap gambar secara manual.

Tuan Fox yang luar biasa
sumber
3
Sebenarnya saya tidak menjelaskan hal itu dalam posting, tetapi untuk tugas ini saya diberikan satu set kira-kira 30 gambar, dan harus melakukan algoritma yang akan cocok dengan mereka semua dalam berbagai situasi seperti yang dijelaskan. Tentu saja beberapa gambar dikerahkan untuk menguji algoritma pada akhirnya. Tapi saya suka ide sensor Kinect, dan saya ingin membaca lebih lanjut tentang topik ini!
Charles Menguy
Berapa kira-kira ukuran set pelatihan dengan jaringan saraf untuk mendapatkan hasil yang memuaskan? Apa yang baik dengan metode ini juga adalah saya hanya perlu satu templat untuk mencocokkan hampir semuanya.
Charles Menguy
2
Jika rangkaian gambar Anda sudah ditentukan sebelumnya dan terbatas, cukup hardcore hasil sempurna dalam prog Anda;)
sne11ius
Ya jika saya berlatih pada dataset saya akan menjalankan algoritma terhadap, tentu saya akan mendapatkan hasil yang sempurna :) Tapi misalnya untuk tugas ini, program ini diuji oleh guru pada akhirnya pada satu set gambar yang diulurkan . Saya ingin melakukan sesuatu yang kuat dan tidak sesuai dengan data pelatihan.
Charles Menguy
Jumlah set pelatihan bervariasi, Anda harus berhati-hati terhadap beberapa hal: Jangan berlatih berlebihan, Anda mungkin ingin set tes untuk menunjukkan bagaimana akurasi Anda. Juga jumlah set pelatihan akan tergantung pada jumlah layer yang akan Anda gunakan.
Fantastic Mr Fox
24

Saya akan mendeteksi persegi panjang merah: RGB -> HSV, filter merah -> gambar biner, tutup (melebarkan lalu mengikis, dikenal sebagai imclosedi matlab)

Kemudian lihat melalui persegi panjang dari terbesar ke terkecil. Persegi panjang yang memiliki persegi panjang yang lebih kecil dalam posisi / skala yang diketahui dapat dihilangkan (dengan asumsi proporsi botol konstan, persegi panjang yang lebih kecil akan menjadi tutup botol).

Ini akan meninggalkan Anda dengan persegi panjang merah, maka Anda harus entah bagaimana mendeteksi logo untuk mengetahui apakah mereka persegi panjang merah atau kaleng kokas. Suka OCR, tetapi dengan logo yang dikenal?

Alex L
sumber
2
Seperti ini sedang dibahas pada DSP dalam waktu singkat ketika dipindahkan, beberapa botol mungkin tidak memiliki colokan;) atau colokan sebagian dapat disembunyikan.
Charles Menguy
22

Ini mungkin ide yang sangat naif (atau mungkin tidak bekerja sama sekali), tetapi dimensi semua kaleng kokas sudah diperbaiki. Jadi mungkin jika gambar yang sama berisi kaleng dan botol maka Anda dapat membedakannya berdasarkan pertimbangan ukuran (botol akan menjadi lebih besar). Sekarang karena kedalaman yang tidak ada (mis. Pemetaan 3D ke pemetaan 2D), kemungkinan botolnya terlihat menyusut dan tidak ada perbedaan ukuran. Anda dapat memulihkan beberapa informasi mendalam menggunakan pencitraan stereo dan kemudian memulihkan ukuran aslinya.

Sharad
sumber
3
Sebenarnya tidak: tidak ada batasan ukuran atau orientasi (atau orientasi tetapi saya tidak benar-benar mengatasinya), jadi Anda dapat memiliki botol yang sangat jauh di latar belakang, dan kaleng di latar depan, dan kaleng akan menjadi lebih besar dari pada botol.
Charles Menguy
Saya juga sudah memeriksa bahwa rasio lebar ke tinggi sangat mirip untuk botol dan kaleng, jadi itu bukan pilihan juga.
Charles Menguy
Rasio label (menjadi merek dagang) adalah sama. Jadi jika botol (lebih besar) sedikit lebih jauh pada gambar, ukurannya akan persis sama dengan kaleng.
littleadv
3
Untuk menjelaskan lebih banyak. Misalkan kaleng di z = 0 dan botol di z = -100. Karena botol jauh di belakangnya akan terlihat lebih kecil. Tetapi jika saya tahu bahwa botolnya di z = -100 dan kaleng di z = 0, maka saya bisa menghitung ukuran kaleng / botol yang diharapkan jika keduanya diterjemahkan ke z = 0. Jadi sekarang mereka berada di kedalaman yang sama dan karenanya saya dapat membuat keputusan berdasarkan ukuran.
Sharad
2
Ini hanya komentar, bukan jawaban, tetapi jauh lebih dekat untuk menjadi jawaban daripada komentar sebagai jawaban di atas dengan 120 suara.
Fattie
22

Hmm, saya benar-benar berpikir saya ke sesuatu (ini seperti pertanyaan paling menarik yang pernah - jadi akan memalukan untuk tidak terus mencoba menemukan jawaban "sempurna", meskipun yang dapat diterima telah ditemukan) .. .

Setelah Anda menemukan logo, masalah Anda setengah selesai. Maka Anda hanya perlu mencari tahu perbedaan antara apa yang ada di sekitar logo. Selain itu, kami ingin melakukan sesedikit mungkin. Saya pikir ini sebenarnya bagian yang mudah ini ...

Apa yang ada di sekitar logo? Untuk kaleng, kita bisa melihat logam, yang terlepas dari efek pencahayaan, tidak berubah apa pun dalam warna dasarnya. Selama kita tahu sudut labelnya, kita bisa tahu apa yang langsung di atasnya, jadi kita melihat perbedaannya:

Di sini, apa yang di atas dan di bawah logo sepenuhnya gelap, warnanya konsisten. Relatif mudah dalam hal itu.

Di sini, apa yang di atas dan di bawah ini ringan, tetapi tetap konsisten dalam warna. Ini semua-perak, dan semua-perak logam tampaknya cukup langka, serta warna perak pada umumnya. Selain itu, ia berada dalam celah tipis dan cukup dekat dengan merah yang telah diidentifikasi sehingga Anda dapat melacak bentuknya untuk seluruh panjangnya untuk menghitung persentase dari apa yang dapat dianggap sebagai cincin logam kaleng. Sungguh, Anda hanya perlu sebagian kecil dari itu di mana saja di sepanjang kaleng untuk mengatakan itu adalah bagian dari itu, tetapi Anda masih perlu menemukan keseimbangan yang memastikan itu bukan hanya botol kosong dengan sesuatu logam di belakangnya.

Dan akhirnya, yang rumit. Tapi tidak terlalu rumit, setelah kita hanya pergi dengan apa yang bisa kita lihat langsung di atas (dan di bawah) pembungkus merah. Ini transparan, yang berarti akan menunjukkan apa pun yang ada di belakangnya. Itu bagus, karena benda-benda yang ada di belakangnya tidak mungkin memiliki warna yang sama konsistennya dengan logam bundar perak kaleng. Mungkin ada banyak hal berbeda di belakangnya, yang akan memberi tahu kita bahwa itu adalah botol kosong (atau diisi dengan cairan bening), atau warna yang konsisten, yang dapat berarti bahwa itu diisi dengan cairan atau bahwa botol itu hanya di depan sebuah warna solid. Kami bekerja dengan apa yang paling dekat dengan bagian atas dan bawah, dan kemungkinan warna yang tepat berada di tempat yang tepat relatif ramping. Kita tahu itu botol, karena tidak punya elemen visual kunci kaleng,

(yang terakhir adalah yang terbaik yang dapat saya temukan dari botol coca cola kosong yang besar - yang menarik tutup DAN cincin berwarna kuning, menunjukkan bahwa kemerahan tutup mungkin tidak boleh diandalkan)

Dalam keadaan langka di mana warna perak yang sama ada di belakang botol, bahkan setelah abstraksi plastik, atau botol entah bagaimana diisi dengan warna cairan perak yang sama, kita dapat kembali pada apa yang secara kasar dapat kita perkirakan sebagai bentuk perak - yang seperti yang saya sebutkan, berbentuk lingkaran dan mengikuti bentuk kaleng. Tetapi meskipun saya tidak memiliki pengetahuan tertentu dalam pemrosesan gambar, itu terdengar lambat. Lebih baik lagi, mengapa tidak menyimpulkan ini dengan sekali memeriksa di sekitar sisi logo untuk memastikan tidak ada warna perak yang sama di sana? Ah, tapi bagaimana jika ada warna perak yang sama di belakang kaleng? Kemudian, kita memang harus lebih memperhatikan bentuk, melihat bagian atas dan bawah kaleng lagi.

Tergantung pada bagaimana sempurna semua ini perlu, itu bisa sangat lambat, tapi saya kira konsep dasar saya adalah untuk memeriksa hal-hal termudah dan terdekat terlebih dahulu. Pergi dengan perbedaan warna di sekitar bentuk yang sudah cocok (yang tampaknya bagian paling sepele dari ini sih) sebelum pergi ke upaya mengusahakan bentuk elemen lainnya. Untuk daftar itu, begini:

  • Temukan daya tarik utama (latar belakang logo merah, dan mungkin logo itu sendiri untuk orientasi, meskipun jika kalengnya ditolak, Anda harus berkonsentrasi hanya pada yang merah)
  • Verifikasi bentuk dan orientasi, sekali lagi melalui kemerahan yang sangat khas
  • Periksa warna di sekitar bentuk (karena cepat dan tidak menyakitkan)
  • Akhirnya, jika perlu, verifikasi bentuk warna-warna di sekitar daya tarik utama untuk kebulatan yang tepat.

Jika Anda tidak dapat melakukan ini, itu mungkin berarti bagian atas dan bawah kaleng tertutup, dan satu-satunya hal yang mungkin bisa digunakan manusia untuk membuat perbedaan antara kaleng dan botol adalah oklusi dan refleksi. dari kaleng, yang akan menjadi pertempuran yang jauh lebih sulit untuk diproses. Namun, untuk melangkah lebih jauh, Anda bisa mengikuti sudut kaleng / botol untuk memeriksa lebih banyak sifat seperti botol, menggunakan teknik pemindaian semi-transparan yang disebutkan dalam jawaban lain.

Mimpi buruk tambahan yang menarik mungkin termasuk kaleng yang dengan nyaman duduk di belakang botol pada jarak tertentu sehingga logam itu kebetulan muncul di atas dan di bawah label, yang masih akan gagal selama Anda memindai sepanjang merah. label - yang sebenarnya lebih merupakan masalah karena Anda tidak mendeteksi kaleng di mana Anda bisa, dibandingkan dengan mempertimbangkan bahwa Anda sebenarnya mendeteksi botol, termasuk kaleng secara tidak sengaja. Gelasnya setengah kosong, dalam hal ini!


Sebagai penafian, saya tidak memiliki pengalaman dalam atau tidak pernah berpikir tentang pemrosesan gambar di luar pertanyaan ini, tetapi sangat menarik sehingga membuat saya berpikir cukup mendalam tentang hal itu, dan setelah membaca semua jawaban lain, saya menganggap ini mungkin cara termudah dan paling efisien untuk menyelesaikannya. Secara pribadi, saya senang saya tidak benar - benar harus memikirkan pemrograman ini!

EDIT

gambar yang buruk dari kaleng di cat MS Selain itu, lihat gambar yang saya lakukan di MS Paint ... Ini benar-benar mengerikan dan tidak lengkap, tetapi berdasarkan bentuk dan warna saja, Anda dapat menebak apa yang mungkin terjadi. Pada dasarnya, ini adalah satu-satunya hal yang perlu diganggu oleh pemindaian. Ketika Anda melihat bentuk yang sangat khas dan kombinasi warna yang begitu dekat, apa lagi yang mungkin terjadi? Bit yang saya tidak lukis, latar belakang putih, harus dianggap "sesuatu yang tidak konsisten". Jika latar belakangnya transparan, gambar itu bisa menembus hampir semua gambar lain dan Anda masih bisa melihatnya.

Deji
sumber
10
Warna merah sebagian besar subyektif dan sangat dipengaruhi oleh pertimbangan pencahayaan dan keseimbangan putih. Anda mungkin terkejut dengan betapa banyak yang bisa berubah. Pertimbangkan, misalnya, ilusi kotak-kotak ini .
Octopus
2
Pembaruan tautan yang diposting oleh @Octopus
Hat
Ilusi persepsi tidak memengaruhi apa yang dilihat webcam Anda - yaitu apa yang diperoleh kode Anda - hanya bagaimana mata manusia membantu (?) Menipu otak.
Nyonya
17

Saya tidak mengetahui OpenCV tetapi melihat masalah secara logis saya pikir Anda dapat membedakan antara botol dan dapat dengan mengubah gambar yang Anda cari yaitu Coca Cola. Anda harus memasukkan sampai bagian atas kaleng karena jika ada lapisan perak di atas coca cola dan dalam kasus botol tidak akan ada lapisan perak tersebut.

Tetapi jelas algoritma ini akan gagal dalam kasus-kasus di mana tutup kaleng disembunyikan, tetapi dalam kasus seperti itu bahkan manusia tidak akan dapat membedakan antara keduanya (jika hanya bagian botol coca cola / kaleng yang terlihat)

techExplorer
sumber
1
Saya memiliki pemikiran yang sama, tetapi saya pikir lapisan perak di atas kaleng berubah secara dramatis tergantung pada sudut kaleng pada gambar. Itu bisa berupa garis lurus atau lingkaran. Mungkin dia bisa menggunakan keduanya sebagai referensi?
Alexis Dufrenoy
15

Saya suka tantangan dan ingin memberikan jawaban, yang memecahkan masalah, saya pikir.

  1. Ekstrak fitur (keypoints, deskriptor seperti SIFT, SURF) dari logo
  2. Cocokkan poin dengan gambar model logo (menggunakan Matcher seperti Brute Force)
  3. Perkirakan koordinat benda tegar (masalah PnP - SolvePnP)
  4. Perkirakan posisi tutup sesuai dengan tubuh yang kaku
  5. Lakukan proyeksi ulang dan hitung posisi piksel gambar (ROI) tutup botol (saya berasumsi Anda memiliki parameter intrinsik kamera)
  6. Periksa dengan metode apakah tutupnya ada atau tidak. Jika ada, maka ini botolnya

Deteksi topi adalah masalah lain. Ini bisa rumit atau sederhana. Jika saya jadi Anda, saya hanya akan memeriksa histogram warna di ROI untuk keputusan sederhana.

Tolong, berikan umpan balik jika saya salah. Terima kasih.

edayangac
sumber
13

Saya terlambat beberapa tahun dalam menjawab pertanyaan ini. Dengan keadaan mutakhir yang didorong oleh CNN dalam 5 tahun terakhir saya tidak akan menggunakan OpenCV untuk melakukan tugas ini sekarang! ( Saya tahu Anda secara khusus menginginkan fitur OpenCv dalam pertanyaan ) Saya merasakan algoritma deteksi objek seperti Faster-RCNNs, YOLO, SSD dll. Akan memecahkan masalah ini dengan margin yang signifikan dibandingkan dengan fitur OpenCV. Jika saya menangani masalah ini sekarang (setelah 6 tahun !!) Saya pasti akan menggunakan Faster-RCNN .

Abhijit Balaji
sumber
5
OP mengatakan ada 30 gambar beresolusi tinggi, yang mungkin bukan skenario terbaik untuk melatih ConvNets. Tidak hanya mereka terlalu sedikit (bahkan ditambah), bagian beresolusi tinggi akan menghancurkan ConvNets.
Kostas Mouratidis
11

Saya suka pertanyaan Anda, terlepas dari apakah itu di luar topik atau tidak: P

Selain yang menarik; Saya baru saja menyelesaikan subjek di tingkat saya di mana kami membahas robotika dan visi komputer. Proyek kami untuk semester ini sangat mirip dengan yang Anda gambarkan.

Kami harus mengembangkan robot yang menggunakan Xbox Kinect untuk mendeteksi botol dan kaleng kokas dengan orientasi apa pun dalam berbagai kondisi pencahayaan dan lingkungan. Solusi kami melibatkan penggunaan band pass filter pada saluran Hue dalam kombinasi dengan transformasi hough circle. Kami dapat sedikit membatasi lingkungan (kami dapat memilih di mana dan bagaimana menempatkan robot dan sensor Kinect), jika tidak, kami akan menggunakan transformasi SIFT atau SURF.

Anda dapat membaca tentang pendekatan kami pada posting blog saya tentang topik :)

aaronsnoswell
sumber
2
Proyek yang menarik tetapi hanya berlaku untuk pengaturan Anda yang sangat spesifik.
Rui Marques
10

Ada banyak deskriptor warna yang digunakan untuk mengenali objek, makalah di bawah ini membandingkan banyak dari mereka. Mereka sangat kuat ketika dikombinasikan dengan SIFT atau SURF. SURF atau SIFT saja tidak terlalu berguna dalam gambar coca cola karena mereka tidak mengenali banyak poin minat, Anda memerlukan informasi warna untuk membantu. Saya menggunakan BIC (Klasifikasi Border / Interior Pixel) dengan SURF dalam sebuah proyek dan bekerja sangat baik untuk mengenali objek.

Deskriptor warna untuk pengambilan gambar Web: studi banding

Guilherme Defreitas
sumber
10

Pembelajaran yang mendalam

Kumpulkan setidaknya beberapa ratus gambar yang berisi kaleng cola, beri catatan kotak pembatas di sekitar mereka sebagai kelas positif, termasuk botol cola dan produk cola lainnya label kelas negatif serta objek acak.

Kecuali Anda mengumpulkan dataset yang sangat besar, lakukan trik menggunakan fitur pembelajaran mendalam untuk dataset kecil. Idealnya menggunakan kombinasi Support Vector Machines (SVM) dengan jaring saraf yang dalam.

Setelah Anda memasukkan gambar ke model pembelajaran mendalam yang sebelumnya telah dilatih (misalnya GoogleNet), alih-alih menggunakan lapisan keputusan (akhir) jaringan saraf untuk melakukan klasifikasi, gunakan data lapisan sebelumnya sebagai fitur untuk melatih pengklasifikasi Anda.

OpenCV dan Google Net: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html

OpenCV dan SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

Semih Korkmaz
sumber
9

Anda memerlukan program yang mempelajari dan meningkatkan akurasi klasifikasi secara organik dari pengalaman.

Saya akan menyarankan pembelajaran mendalam, dengan pembelajaran mendalam ini menjadi masalah sepele.

Anda dapat melatih kembali model awal v3 di Tensorflow:

Cara Melatih Kembali Lapisan Akhir Inception untuk Kategori Baru .

Dalam hal ini, Anda akan melatih jaringan saraf convolutional untuk mengklasifikasikan objek sebagai coca cola dapat atau tidak.

Nuelsian
sumber
2
Hot dog atau tidak hot dog?
YellowPillow
6

Sebagai alternatif dari semua solusi bagus ini, Anda dapat melatih classifier Anda sendiri dan menjadikan aplikasi Anda tangguh terhadap kesalahan. Sebagai contoh, Anda dapat menggunakan Pelatihan Haar , memberikan sejumlah gambar positif dan negatif yang baik dari target Anda.

Dapat bermanfaat untuk mengekstrak hanya kaleng dan dapat dikombinasikan dengan deteksi objek transparan.

madduci
sumber
3

Ada paket visi komputer yang disebut HALCON dari MVTec yang demo bisa memberikan ide-ide algoritma yang baik. Ada banyak contoh yang mirip dengan masalah Anda yang bisa Anda jalankan dalam mode demo dan kemudian lihat operator dalam kode dan lihat bagaimana menerapkannya dari operator OpenCV yang ada.

Saya telah menggunakan paket ini untuk dengan cepat membuat prototipe algoritma kompleks untuk masalah seperti ini dan kemudian menemukan cara mengimplementasikannya menggunakan fitur OpenCV yang ada. Khususnya untuk kasus Anda, Anda dapat mencoba menerapkan di OpenCV fungsionalitas yang tertanam dalam operator find_scaled_shape_model . Beberapa operator menunjuk ke makalah ilmiah tentang implementasi algoritma yang dapat membantu untuk mengetahui bagaimana melakukan sesuatu yang serupa di OpenCV. Semoga ini membantu...

Darien Pardinas
sumber
0

Jika Anda tertarik untuk menjadi realtime, maka yang Anda butuhkan adalah menambahkan filter pra-pemrosesan untuk menentukan apa yang akan dipindai dengan tugas berat. Filter pra-pemrosesan yang sangat cepat, sangat real-time, yang memungkinkan Anda memindai hal-hal yang lebih mungkin menjadi kaleng coca-cola daripada sebelum beralih ke hal-hal yang lebih rapuh adalah sesuatu seperti ini: cari gambar untuk patch terbesar warna yang toleransi tertentu jauh dari sqrt(pow(red,2) + pow(blue,2) + pow(green,2))kaleng coca-cola Anda. Mulailah dengan toleransi warna yang sangat ketat, dan turunkan hingga toleransi warna yang lebih lunak. Kemudian, ketika robot Anda kehabisan waktu yang ditentukan untuk memproses bingkai saat ini, ia menggunakan botol yang ditemukan saat ini untuk keperluan Anda. Harap dicatat bahwa Anda harus mengubah warna RGB sqrt(pow(red,2) + pow(blue,2) + pow(green,2))untuk mendapatkannya dengan benar.

Juga, ini akan tampak sangat bodoh, tetapi apakah Anda memastikan untuk mengaktifkan -oFastoptimisasi kompiler ketika Anda mengkompilasi kode C Anda?


sumber
0

Mungkin terlambat bertahun-tahun, tetapi toh teori untuk dicoba.

Rasio pembatas persegi panjang wilayah logo merah dengan dimensi keseluruhan botol / kaleng berbeda. Dalam kasus Can, harus 1: 1, sedangkan akan berbeda dalam botol (dengan atau tanpa tutup). Ini harus membuatnya mudah untuk membedakan keduanya.

Pembaruan: Lengkungan horizontal dari wilayah logo akan berbeda antara Can dan Bottle karena perbedaan ukuran masing-masing. Ini bisa berguna secara khusus jika robot Anda perlu mengambil kaleng / botol, dan Anda memutuskan pegangan yang sesuai.

KB
sumber
-1

Hal pertama yang akan saya cari adalah warna - seperti RED, ketika melakukan deteksi mata Merah dalam gambar - ada rentang warna tertentu untuk dideteksi, beberapa karakteristik tentang hal itu mempertimbangkan area sekitarnya dan seperti jarak terpisah dari mata lain jika memang terlihat dalam gambar.

1: Karakteristik pertama adalah warna dan Merah sangat dominan. Setelah mendeteksi Coca Cola Red ada beberapa item menarik 1A: Seberapa besar area merah ini (apakah itu jumlah yang cukup untuk membuat penentuan kaleng benar atau tidak - 10 piksel mungkin tidak cukup), 1B: Apakah mengandung warna Label - "Coca-Cola" atau gelombang. 1B1: Apakah ada cukup untuk mempertimbangkan probabilitas tinggi bahwa itu adalah label.

Item 1 adalah jenis jalan pintas - pra-proses jika ingus itu ada di gambar - lanjutkan.

Jadi jika itu yang terjadi maka saya dapat memanfaatkan segmen gambar saya dan mulai mencari lebih banyak zoom keluar dari area yang dimaksud sedikit - pada dasarnya melihat wilayah sekitarnya / tepi ...

2: Diberikan ID area gambar di atas dalam 1 - verifikasi titik-titik [tepi] sekitarnya dari item yang dimaksud. A: Apakah ada apa yang tampak sebagai kaleng atas atau bawah - perak? B: Sebuah botol mungkin terlihat transparan, tetapi mungkin sebuah meja kaca - jadi apakah ada meja kaca / rak atau area transparan - jika demikian ada beberapa kemungkinan yang keluar. Botol MUNGKIN memiliki topi merah, mungkin tidak, tetapi harus berbentuk sekrup atas / ulir botol, atau tutup. C: Bahkan jika ini gagal A dan B masih bisa menjadi parsial-can .. Ini lebih kompleks ketika parsial karena botol parsial / parsial mungkin terlihat sama, sehingga lebih banyak pemrosesan pengukuran tepi wilayah Merah ke tepi .. botol kecil mungkin memiliki ukuran yang serupa ..

3: Setelah analisis di atas, ketika saya akan melihat huruf dan logo wave - karena saya dapat mengarahkan pencarian saya untuk beberapa huruf dalam kata-kata Karena Anda mungkin tidak memiliki semua teks karena tidak memiliki semua bisa, gelombang akan menyelaraskan pada titik-titik tertentu dengan teks (jarak bijaksana) sehingga saya bisa mencari probabilitas itu dan tahu huruf mana yang harus ada pada titik gelombang jarak x.

Ken
sumber
-9

Ini adalah proyek lama yang saya kerjakan. Gambar MAP sangat mudah digunakan dengan javascript. Saya menawarkan objek, Anda membacanya dan tahu cara menggunakannya. Kami tidak membutuhkan JQuery dan sistem lain untuk menggunakan gambar MAP.

    //Copyright Cherif yahiaoui, by ELEBAN.FR

//variables de flottement.
var myInstOne = null;
var globalize = null;

var eleban_preload_images = function (name, imgs, url){
try{
    var oThis = this;
    this.images = new Array();
    this.imageshover = new Array();
    this.imagesNames = new Array(imgs.split(";"));


        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i] = new Image();
            this.imageshover[i] = new Image();
        }

    this.url = url;

    this.GetAbsoluteurl = function () {

    var img = new Image(); img.src = url;
    url = img.src; img = null; 
        this.url = url; 

    };

    this.Preload = function () {

        for(var i=0; i < this.imagesNames[0].length; i++){
            this.images[i].src = this.url+("btn-"+this.imagesNames[0][i]+".png");
            this.imageshover[i].src = this.url+("btn-"+this.imagesNames[0][i]+"-hover.png");
        }

    };
    this.GetAbsoluteurl();
    this.Preload();
}
finally {return;}
}

var g_preloaderhover = new eleban_preload_images("loaderhover","menu;malette;reservation;cabine;facebook;map;amis","./images/");


//variable arret flottement
var g_stopflo = false;

var myObjfloater = function(name, idname, itop, differ ) {
var oThis = this; // création d'une référence vers l'objet courant
this.name = name;
this.id =idname;
this.xstep= 0.3;
this.itime = 30;
this.obj = null;
this.y = itop;
this.yadd = 0;
this.up = true;
this.pause = false;
this.differ = differ;
this.coordsimage = null;
this.objimg = null;
this.initimages = false;
this.compteur = 0;
this.over = false;
this.timeoutstop = null;
try{
this.initimage = function(){
var img = this.obj.getElementsByTagName('img')[0];
this.coordsimage = new Array(img.width, img.height);
this.objimg = img;
this.initimages = true;
};


this.myMethod = function() {
if(!g_stopflo){
    if(this.differ != 0){ 
this.differ=this.differ-0.1; 
}else{

if(this.obj){
if(this.over == false){
    this.yadd=this.yadd+0.1; this.itime = this.itime + 10;
this.obj.style.visibility = "hidden";
this.y = ((this.up)? this.y - this.yadd : this.y + this.yadd);
this.obj.style.marginTop = this.y +"%" ;
this.obj.style.visibility = "visible";

if (this.yadd > this.xstep){ 
    this.up = (this.up)? false : true;
    this.yadd = -0.1; this.itime=180;
}
}
}else{
    if (document){
        if(document.getElementById) {
         this.obj = document.getElementById(this.id); 
        //this.y = this.obj.offsetTop;
        }else{
        if(document.getElementByTagName) { this.obj = document.getElementByTagName(this.id); this.y = this.obj.offsetTop;}
        }

    }
}
}
this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}    
};

this.callDelayed = function() {
    // utilisation de la référence vers l'objet
if(!g_stopflo){
    this.timeoutstop=setTimeout(function() { oThis.myMethod(); }, this.itime);
}
};
}
finally {return;}
};

// special creation des zones AREA
function eleban_createallarea(){
try{
var measur = new Array("w", "h");
measur["w"] = new Array(330,570,185,300,115,390,225);
measur["h"] = new Array(460,570,295,450,100,190,115);
var ititle = new Array("Voir les menus  et nos suggestions","Repas &agrave; emporter","R&eacute;servation d&rsquo;une table","Nous contacter","Nous rejoindre sur FaceBook","Calculer votre trajet","liste des amis");
var ihref = new Array("menus.html","emporter.html","reservation.html","contact.html","likebox.html","google.html","amis.html");
var b_map = new Array(0,1,2,3,4,5,6);
b_map[0] = "71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38";
b_map[1] = "66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92";
b_map[2] = "19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90";
b_map[3] = "60,0,216,1,226,20,225,403,168,421,42,410,45,10";
b_map[4] = "31,7,72,10,82,18,88,45,88,71,76,81,29,80,17,68,16,18";
b_map[5] = "91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94";
b_map[6] = "6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65";

if (document.getElementById){
for (var i=0; i<b_map.length;i++){
var obj = document.getElementById("pc_menu"+i);
    if(obj){
    var ct = '<img class=\"pc_menu\" src=\"'+g_preloaderhover.images[i].src+'\" alt=\"\" width=\"'+measur["w"][i]+'\" height=\"'+measur["h"][i]+'\" usemap=\"#MAP_INDEX'+i+'\" \/>';
    ct+='<map name=\"MAP_INDEX'+i+'\">';
    ct+='<area shape=\"poly\" coords=\"'+b_map[i]+'\" title=\"'+ititle[i]+'\" href=\"'+ihref[i]+'\" \/>';
    ct+='<\/map>';
    obj.innerHTML = ct;
    }
}
}
}
finally {return;}
}

//preload, creation et gestion de tous les evenements


var image_resizer = function(g_layer){


    b_org_elm = new Array("w",  "h");
    b_org_elm["w"] = new Array(330,570,185,300,115,390,225);
    b_org_elm["h"] = new Array(460,570,295,450,100,190,115);

    b_map = new Array(0,1,2,3,4,5,6);
    b_map[0] = new Array(71,32,240,32,249,43,289,352,280,366,102,385,90,371,51,38);
    b_map[1] = new Array(66,52,95,14,129,56,115,91,100,93,112,273,128,284,122,366,176,343,193,296,191,194,147,189,145,166,201,111,199,84,545,105,532,354,509,388,412,478,32,401,77,383,87,375,82,286,95,269,94,221,24,195,11,165,9,120,89,123,89,94,78,92,77,92,77,93,75,93,77,93,76,93,79,92);
    b_map[2] = new Array(19,25,169,38,173,112,161,113,105,103,90,125,91,262,121,269,124,281,96,293,62,289,49,281,56,268,83,264,84,121,71,98,16,90);
    b_map[3] = new Array(60,0,216,1,226,20,225,403,168,421,42,410,45,10);
    b_map[4] = new Array(31,6,70,10,78,18,84,23,88,44,88,70,78,80,75,81,33,82,23,76,18,69,16,22,21,13);
    b_map[5] = new Array(91,40,141,38,178,27,184,4,211,5,223,24,240,23,386,135,229,121,103,180,6,156,49,94);
    b_map[6] = new Array(6,32,69,18,79,6,118,7,141,2,149,10,211,17,202,28,209,30,189,62,195,70,178,74,180,90,164,90,154,107,68,101,34,104,34,98,18,97,28,84,15,84,30,65);


    b_layer = g_layer;

//gere mouseover
    this.mouseover = function(e){
        if (!e) var e = window.event;
        var tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                var divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.imageshover[ii].src;
                                }
                        }
                    }
                }
            }
    };

//gere mouseout
    this.mouseout = function(e){
        if (!e) var e = window.event;
        tg = (window.event) ? e.srcElement : e.target
            if (tg.nodeName){
                if(tg.nodeName == "AREA"){
                divpar = (tg.parentNode)? tg.parentNode.parentNode : tg.parentElement.parentElement;
                    if (divpar){
                        if(divpar.nodeName == "DIV"){
                            var iiobjimg = divpar.getElementsByTagName('img');
                                if (iiobjimg){
                                    ii = parseInt(divpar.id.substring(divpar.id.length-1,divpar.id.length));
                                    iiobjimg[0].src = g_preloaderhover.images[ii].src;
                                }
                        }
                    }
                }
            }
    };

//ajout evenements entree sortie à la page web lors du chargement de la page
    this.init = function () {

        for(var i=0; i<b_org_elm["w"].length;i++){
            w = document.getElementById("pc_menu"+i).offsetWidth;
            h = document.getElementById("pc_menu"+i).offsetHeight;

            xa = w/parseFloat(b_org_elm["w"][i]);
            ya = h/parseFloat(b_org_elm["h"][i]);

            area = document.getElementById("pc_menu"+i).getElementsByTagName('area')[0];

            b_map2 = area.coords.split(",");
            yswitch = true;
                for(m=0; m<b_map2.length;m++){
                b_map2[m] = Math.round(parseFloat(b_map[i][m]) * ((yswitch)? xa: ya));
                yswitch = (yswitch)? false :  true;
                }
            area.coords = b_map2.join(',');
        }
    }; 


    this.resize = function () {
    clearTimeout(myInstOne.timeoutstop);
    g_stopflo=true;

    globalize.init();
    g_stopflo=false;
    myInstOne.obj = null;
    myInstOne.callDelayed();
    };


    nar = document.getElementsByTagName('area').length;

        for(var i=0; i<nar;i++){
            var elem = document.getElementsByTagName('area')[i];
            if (elem.addEventListener){
                    elem.addEventListener("onmouseover",this.mouseover,true);
                elem.addEventListener("onmouseout",this.mouseout,true);
            }else if (elem.attachEvent) {
                    elem.attachEvent("onmouseover", this.mouseover);
                    elem.attachEvent("onmouseout", this.mouseout);
            }else{
                    elem["onmouseover"] = this.mouseover;
                    elem["onmouseout"] = this.mouseout;
            }
        }

            window.onresize = this.resize;
        window.onmouseover = this.mouseover;
        window.onmouseout = this.mouseout;
}


//permet de temporiser et éviter les erreurs de chargement des objets
function temporise_Init(Lastdiv){
if(document.getElementById){
    if(document.getElementById(Lastdiv)){

    eleban_createallarea();

    myInstOne = new myObjfloater('b_menumap11', 'pc_menu1', 1, 0);

    globalize = new image_resizer(document.getElementById('pc_redim'));
    globalize.init();
        globalize.resize();



    }else{
    setTimeout(temporise_Init(Lastdiv), 30);
    }
}
}


window.onload = function () {
temporise_Init("pc_bandeau");
}
Cherif
sumber
3
apa fungsinya?
user8408080