- Pra-syarat
- Langkah-langkah yang terlibat dalam Pengiktirafan Plat Lesen menggunakan Raspberry Pi
- 1. Pengesanan Plat
- 2. Segmentasi Perwatakan
- 3. Pengecaman Perwatakan
- Kes Gagal dalam Pengecaman Plat Nombor
- Contoh lain yang Berjaya
Keselamatan selalu menjadi perhatian utama umat manusia. Hari ini kita mempunyai kamera pengawasan video di sekolah, hospital dan setiap tempat awam yang lain untuk membuat kita merasa aman. Menurut tinjauan oleh HIS, dianggarkan terdapat sekitar 245 juta kamera keselamatan yang dipasang dan berfungsi pada tahun 2014, seperti memiliki satu kamera keselamatan untuk setiap 30 orang di planet ini. Dengan kemajuan teknologi terutamanya dalam pemprosesan Imej dan Pembelajaran Mesin, adalah mungkin untuk menjadikan kamera ini lebih pintar dengan melatih mereka memproses maklumat dari suapan Video.
Suapan video dari kamera ini dapat digunakan untuk melakukan pengecaman wajah, analisis corak, analisis emosi dan banyak lagi yang akan benar-benar mendekati sesuatu seperti "Mata Tuhan" yang ditunjukkan dalam filem FF7. Sebenarnya, syarikat pengawasan seperti Hikvision dan banyak syarikat lain sudah mula menerapkan ciri-ciri ini dalam produk mereka. Kami sebelum ini menggunakan pemprosesan Gambar MATLAB untuk membaca plat nombor, hari ini dalam artikel ini kita akan belajar bagaimana mengenali dan membaca Nombor Plat dari Automobil menggunakan Raspberry Pi dan OpenCV. Kami akan menggunakan beberapa gambar kenderaan rawak dari Google dan menulis program untuk mengenali plat nombor menggunakan OpenCV Contour Detection dan kemudian membaca nombor dari plat menggunakan Tesseract OCR. Kedengarannya menarik !, jadi Mari kita mulakan.
Pra-syarat
Seperti diberitahu sebelumnya, kami akan menggunakan OpenCV Library untuk mengesan dan mengenali wajah. Oleh itu, pastikan untuk memasang OpenCV Library pada Raspberry Pi sebelum meneruskan tutorial ini. Kuasakan Pi anda dengan penyesuai 2A dan sambungkannya ke monitor paparan untuk penyahpepijatan yang lebih mudah.
Tutorial ini tidak akan menerangkan bagaimana sebenarnya OpenCV berfungsi, jika anda berminat untuk belajar Pemprosesan imej, lihat asas OpenCV ini dan tutorial pemprosesan Imej lanjutan. Anda juga boleh belajar mengenai kontur, Blob Detection dll dalam tutorial Segmentasi Imej ini menggunakan OpenCV. Kami akan melakukan sesuatu yang serupa dengan ini untuk mengesan plat kenderaan dari gambar.
Langkah-langkah yang terlibat dalam Pengiktirafan Plat Lesen menggunakan Raspberry Pi
Ringkasnya Pengiktirafan Plat atau LPR, melibatkan tiga langkah utama. Langkahnya adalah seperti berikut
1. Pengesanan Plat Plat: Langkah pertama adalah mengesan plat nombor dari kereta. Kami akan menggunakan pilihan kontur di OpenCV untuk mengesan objek segi empat tepat untuk mencari plat nombor. Ketepatannya dapat ditingkatkan jika kita mengetahui ukuran, warna dan lokasi tepat plat nombor. Biasanya algoritma pengesanan dilatih berdasarkan kedudukan kamera dan jenis plat nombor yang digunakan di negara tersebut. Ini menjadi lebih sukar jika gambar itu tidak mempunyai kereta, dalam hal ini kita akan melakukan langkah tambahan untuk mengesan kereta dan kemudian plat nombor.
2. Segmentasi Karakter: Setelah kita mengesan Plat Lesen, kita harus memotongnya dan menyimpannya sebagai gambar baru. Sekali lagi ini dapat dilakukan dengan mudah menggunakan OpenCV.
3. Pengecaman Karakter: Sekarang, gambar baru yang kami perolehi pada langkah sebelumnya pasti mempunyai beberapa watak (Nombor / Huruf) yang ditulis di atasnya. Jadi, kita boleh melakukan OCR (Optical Character Recognition) di atasnya untuk mengesan nombornya. Kami sudah menjelaskan Pengecaman Karakter Optik (OCR) menggunakan Raspberry Pi.
1. Pengesanan Plat
Langkah pertama dalam Pembaca Plat Lesen Raspberry Pi ini adalah mengesan Plat Plat. Mari ambil contoh gambar kereta dan mulakan dengan mengesan Plat Iklan pada kereta tersebut. Kami kemudian akan menggunakan gambar yang sama untuk Segmentasi Karakter dan Pengecaman Karakter juga. Sekiranya anda ingin terus memasuki kod tanpa penjelasan, anda boleh menatal ke bawah halaman ini, di mana kod lengkap disediakan. Gambar ujian yang saya gunakan untuk tutorial ini ditunjukkan di bawah.
Langkah 1: Ubah saiz gambar ke saiz yang diperlukan dan kemudian skalakannya menjadi kelabu. Kod untuk yang sama diberikan di bawah
img = cv2. ubah saiz (img, (620,480)) kelabu = cv2.cvtWarna (img, cv2.COLOR_BGR2GRAY) #konversi ke skala kelabu
Mengubah saiz kami membantu kami untuk mengelakkan masalah dengan gambar beresolusi yang lebih besar, pastikan plat nombor masih berada di bingkai setelah ukurannya. Penskalaan kelabu adalah perkara biasa dalam semua langkah memproses gambar. Ini mempercepat proses berikut yang lain, kita tidak lagi perlu berurusan dengan perincian warna ketika memproses gambar. Imej akan berubah seperti ini ketika langkah ini dilakukan
Langkah 2: Setiap gambar akan mempunyai maklumat yang berguna dan tidak berguna, dalam hal ini bagi kami hanya plat nombor adalah maklumat berguna yang selebihnya tidak berguna untuk program kami. Maklumat yang tidak berguna ini disebut kebisingan. Biasanya menggunakan penapis dua hala (Bluring) akan menghilangkan butiran yang tidak diingini dari gambar. Kod untuk yang sama adalah
kelabu = cv2.bilateralFilter (kelabu, 11, 17, 17)
Sintaks adalah destination_image = cv2.bilateralFilter (source_image, diameter pixel, sigmaColor, sigmaSpace). Anda boleh meningkatkan warna sigma dan ruang sigma dari 17 ke nilai yang lebih tinggi untuk mengaburkan lebih banyak maklumat latar belakang, tetapi berhati-hati agar bahagian yang berguna tidak kabur. Gambar output ditunjukkan di bawah, kerana anda dapat melihat perincian latar belakang (pokok dan bangunan) kabur dalam gambar ini. Dengan cara ini kita dapat mengelakkan program daripada menumpukan perhatian di kawasan-kawasan ini kelak.
Langkah 3: Langkah seterusnya adalah menarik di mana kita melakukan pengesanan tepi. Terdapat banyak cara untuk melakukannya, cara yang paling mudah dan popular adalah dengan menggunakan kaedah canggih dari OpenCV. Garis untuk melakukan perkara yang sama ditunjukkan di bawah
edged = cv2.Canny (kelabu, 30, 200) #Performasi Edge Edge
Sintaksnya akan menjadi destination_image = cv2.Canny (source_image, thresholdValue 1, thresholdValue 2). Threshold Vale 1 dan Threshold Value 2 adalah nilai ambang minimum dan maksimum. Hanya tepi yang mempunyai kecerunan intensiti lebih daripada nilai ambang minimum dan kurang dari nilai ambang maksimum yang akan ditampilkan. Gambar yang dihasilkan ditunjukkan di bawah
Langkah 4: Sekarang kita boleh mula mencari kontur pada gambar kita, kita sudah mengetahui cara mencari kontur menggunakan OpenCV dalam tutorial sebelumnya sehingga kita terus seperti yang sama.
nts = cv2.findContours (edged.copy (), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) CNTs = imutils.grab_contours (CNTs) CNTs = disusun (CNTs, key = cv2.contourArea, mengakaskan = Benar) screenCnt = Tiada
Setelah pembilang dikesan, kami mengisinya dari besar hingga kecil dan hanya mempertimbangkan 10 hasil pertama yang mengabaikan yang lain. Pada gambar kami, kaunter boleh menjadi apa saja yang mempunyai permukaan tertutup tetapi dari semua hasil yang diperoleh nombor plat juga akan ada kerana ia juga permukaan tertutup.
Untuk menapis gambar plat nombor di antara hasil yang diperoleh, kami akan melengkapkan semua hasil dan memeriksa yang mempunyai kontur bentuk segi empat dengan empat sisi dan angka tertutup. Oleh kerana plat nombor pasti berbentuk empat segi empat segi.
# gelung di atas kontur kami untuk c dalam cnts: # kira peri kontur = cv2.arcLength (c, True) lebih kurang = cv2.approxPolyDP (c, 0.018 * peri, True) # jika kontur kami yang hampir mempunyai empat titik, maka # kami boleh menganggap bahawa kita telah menemui skrin kita jika len (lebih kurang) == 4: screenCnt = kira-kira pecah
Nilai 0.018 adalah nilai eksperimen; anda boleh bermain di sekitarnya untuk memeriksa mana yang paling sesuai untuk anda. Atau naik ke tahap seterusnya dengan menggunakan pembelajaran mesin untuk melatih berdasarkan gambar kereta dan kemudian gunakan nilai yang tepat di sana. Sebaik sahaja kami menemui pembilang yang tepat, kami menyimpannya dalam pemboleh ubah yang disebut screenCnt dan kemudian melukis kotak segi empat tepat di sekelilingnya untuk memastikan kami telah mengesan plat nombor dengan betul.
Langkah 5: Sekarang kita tahu di mana nombor platnya, maklumat yang tinggal hampir tidak berguna bagi kita. Oleh itu, kita boleh meneruskan penyamaran keseluruhan gambar kecuali tempat di mana plat nombornya. Kod untuk melakukan perkara yang sama ditunjukkan di bawah
# Menyembunyikan bahagian selain topeng plat nombor = np.zeros (grey.shape, np.uint8) new_image = cv2.drawContours (mask,, 0,255, -1,) new_image = cv2.bitwise_and (img, img, mask = topeng)
Gambar baru yang bertopeng akan kelihatan seperti di bawah
2. Segmentasi Perwatakan
Langkah seterusnya dalam Pengecaman Plat Nombor Raspberry Pi adalah dengan membagi plat nombor dari gambar dengan memotong dan menyimpannya sebagai gambar baru. Kita kemudian boleh menggunakan gambar ini untuk mengesan watak di dalamnya. Kod untuk memotong gambar roi (Wilayah minat) dari gambar utama ditunjukkan di bawah
# Sekarang pangkas (x, y) = np.where (mask == 255) (topx, topy) = (np.min (x), np.min (y)) (bottomx, bottomy) = (np.max (x), np.max (y)) Dipotong = kelabu
Gambar yang dihasilkan ditunjukkan di bawah. Biasanya ditambahkan untuk memotong gambar, kita juga dapat mengaburkannya dan mengatasinya jika diperlukan. Ini dilakukan untuk meningkatkan pengecaman watak pada langkah seterusnya. Namun saya dapati ia berfungsi dengan baik walaupun dengan gambar yang asal.
3. Pengecaman Perwatakan
Langkah terakhir dalam Pengecaman Plat Nombor Raspberry Pi ini adalah dengan betul-betul membaca maklumat plat nombor dari gambar yang disegmentasikan. Kami akan menggunakan paket pytesseract untuk membaca watak dari gambar, seperti yang kami lakukan dalam tutorial sebelumnya. Kod untuk yang sama diberikan di bawah
#Baca teks nombor plat = pytesseract.image_to_string (Cropped, config = '- psm 11') print ("Number Detected is:", teks)
Kami telah menerangkan cara mengkonfigurasi mesin Tesseract, jadi di sini sekali lagi jika diperlukan, kami dapat mengkonfigurasi Tesseract OCR untuk mendapatkan hasil yang lebih baik jika diperlukan. Watak yang dikesan kemudian dicetak pada konsol. Semasa disusun hasilnya ditunjukkan seperti di bawah
Seperti yang anda lihat, gambar asalnya ada tulisan "HR 25 BR9044" di atasnya dan program kami telah mengesannya mencetak nilai yang sama di layar.
Kes Gagal dalam Pengecaman Plat Nombor
Fail lengkap projek Pengenalan Plat Raspberry Pi ini boleh dimuat turun dari sini, ia mengandungi program dan gambar ujian yang kami gunakan untuk memeriksa program kami. Tanpa dinyatakan, perlu diingat bahawa hasil dari kaedah ini tidak akan tepat . Ketepatan bergantung pada kejelasan gambar, orientasi, pendedahan cahaya dll. Untuk mendapatkan hasil yang lebih baik, anda boleh mencuba menerapkan algoritma pembelajaran Mesin bersama dengan ini.
Untuk mendapatkan idea, mari kita lihat contoh lain di mana kereta tidak menghadap kamera secara langsung.
Seperti yang anda lihat, program kami dapat mengesan plat nombor dengan betul dan memotongnya. Tetapi perpustakaan Tesseract gagal mengenali watak dengan betul. Daripada "TS 08 UE 3396" yang sebenarnya, OCR telah mengenalinya menjadi "1508 ye 3396". Masalah seperti ini dapat diperbaiki dengan menggunakan gambar orientasi yang lebih baik atau dengan mengkonfigurasi mesin Tesseract .
Satu lagi senario terburuk adalah apabila kontur gagal mengesan plat nombor dengan betul. Gambar di bawah mempunyai terlalu banyak maklumat latar dan pencahayaan yang buruk sehingga program ini gagal mengenal pasti plat nombor dari nombor tersebut. Dalam kes ini kita harus sekali lagi bergantung pada Pembelajaran mesin atau meningkatkan kualiti gambar.
Contoh lain yang Berjaya
Sebilangan besar masa kualiti dan orientasi gambar betul, program ini dapat mengenal pasti plat nombor dan membaca nombor daripadanya. Petikan gambar di bawah menunjukkan beberapa hasil kejayaan yang diperoleh. Sekali lagi semua gambar ujian dan kod yang digunakan di sini akan tersedia dalam fail ZIP yang disediakan di sini.
Harap anda memahami Pengecam Plat Nombor Automatik menggunakan Raspberry Pi dan menikmati membina sesuatu yang menarik sendiri. Apa lagi yang anda fikir boleh dilakukan dengan OpenCV dan Tesseract ?, beritahu saya pendapat anda di bahagian komen. Sekiranya anda mempunyai pertanyaan mengenai artikel ini, silakan tinggalkan di bahagian komen di bawah atau gunakan forum untuk pertanyaan teknikal yang lain.