Menggunakan pohon biner di swift dengan enum menggunakan OCR sebagai contoh

Tujuannya adalah untuk membuat aplikasi mac yang dapat mengenali kode dari gambar dan video.

Saya ingin memastikan bahwa meskipun dengan sejumlah besar kode, teksnya dikenali dalam waktu kurang dari satu detik.

Masalahnya difasilitasi oleh fakta bahwa bahasa di mana kode ditulis selalu bahasa Inggris dan lebar antara semua huruf adalah sama (font monospace) - ini digunakan untuk pemrograman, dan dalam font ini mudah untuk melihat perbedaan antara 1 dan I, 0 dan O, dll.

Singkatnya, tugas itu terbagi menjadi dua bagian:

1. Menemukan surat itu sendiri dengan perbatasannya


Dan Vision, kerangka kerja baru Apple, melakukan pekerjaan yang baik.

Ini adalah screenshot cara kerjanya.


2. Pengakuan huruf dalam batas yang diberikan


Saya memutuskan untuk tidak pergi dengan cara yang rumit dan memeriksa piksel tertentu dari alun-alun, di dalam batas-batas di mana ada huruf (misalnya: pusat, sudut, sisi) dan, berdasarkan ada atau tidaknya surat, mengklasifikasikan apa surat itu.

Contoh ilustrasi:



Dan seperti inilah bentuk pohon itu
Ini adalah bagian karena semuanya tidak cocok, dan itu tidak perlu.


Bagaimana cara mentransfer gambar skematik ini ke kode, agar tidak menggali di dalamnya, dan itu sama jelasnya ?!

Di sinilah pohon biner datang untuk menyelamatkan. Ini bingkainya.

enum Tree<Node, Result> { ///Empty result case empty ///Result with generic type case r(Result) ///Recursive case with generic tree indirect case n(Node, Tree<Node, Result>, Tree<Node, Result>) } 

Sekarang, berdasarkan itu, kita dapat mentransfer seluruh gambar kita ke kode.

 //.c ,       ,   "H"    "O" //  .c   ,     let HorOTree = TreeOCR.n(.c, .r("H"), .r("O")) 

Ini adalah bagaimana sepotong kayu akan terlihat lebih besar.



Anda dapat menguraikan semuanya dengan sangat skematis dan dengan mudah menemukan surat yang Anda butuhkan.

Dan saat terakhir, inilah bagaimana model itu sendiri terlihat, di mana semua pekerjaan terjadi.

 extension Tree where Node == OCROperations, Result == String { func find(_ colorChecker: LetterExistenceChecker, with frame: CGRect) -> String? { switch self { case .empty: return nil case .r(let element): return element case let .n(operation, left, right): let exist = operation.action(colorChecker, frame) return (exist ? left : right).find(colorChecker, with: frame) } } } 

Di pohon ini kami melewati kelas LetterExistenceChecker, yang bertanggung jawab untuk memeriksa keberadaan piksel huruf pada titik tertentu dalam batas-batas persegi yang diinginkan. Tentu saja, saya menghilangkan banyak detail, kalau tidak artikel itu akan terlalu rumit. Dan di sini, tidak hanya dua tahap ini yang disebutkan dalam artikel, tetapi lebih banyak lagi, tetapi mereka dihilangkan, karena tujuannya adalah untuk menunjukkan cara menggunakan pohon biner dan enum.

Berikut ini adalah demo cara kerja program, harap dicatat bahwa karena tujuannya adalah untuk mengenali hanya teks dengan kode, saya memutuskan untuk mengabaikan semua teks yang bukan kode, sehingga program hanya akan mencari teks dengan kode.


Saya akan senang mendengar komentar Anda, kritik.

Source: https://habr.com/ru/post/id439324/


All Articles