Ziel war es, eine Mac-Anwendung zu erstellen, die Code aus Bildern und Videos erkennt.
Ich wollte sicherstellen, dass der Text auch mit einer großen Menge Code in weniger als einer Sekunde erkannt wurde.
Das Problem wird durch die Tatsache erleichtert, dass die Sprache, in der der Code geschrieben ist, immer Englisch ist und die Breite zwischen allen Buchstaben gleich ist (monospaced Schriftart) - diese werden zum Programmieren verwendet, und in diesen Schriftarten ist der Unterschied zwischen 1 und I, 0 und O usw. leicht zu erkennen.
Kurz gesagt, die Aufgabe besteht aus zwei Teilen:
1. Den Buchstaben selbst mit seinen Rändern finden
Und Vision, das neue Framework von Apple, hat großartige Arbeit geleistet.
Hier ist ein Screenshot, wie es funktioniert. 2. Anerkennung des Briefes in den angegebenen Grenzen
Ich habe mich entschieden, nicht auf knifflige Weise bestimmte Pixel des Quadrats zu überprüfen, innerhalb deren Grenzen Buchstaben liegen (sagen wir: Mitte, Ecken, Seiten), und ausgehend vom Vorhandensein oder Fehlen eines Buchstabens zu klassifizieren, was der Buchstabe ist.
Illustratives Beispiel:

Und so wird der Baum aussehenDies ist ein Teil, da nicht alles passen würde und es nicht notwendig ist.

Wie übertrage ich diese schematische Zeichnung auf den Code, um mich nicht darin zu vergraben und damit es genauso offensichtlich ist ?!
Hier kommt ein Binärbaum zur Rettung. Hier ist sein Rahmen.
enum Tree<Node, Result> {
Darauf basierend können wir jetzt unsere gesamte Zeichnung in Code übertragen.
So würde ein Stück Holz größer aussehen.

Sie können alles sehr schematisch zerlegen und leicht den Buchstaben finden, den Sie benötigen.
Und im letzten Moment sieht das Modell selbst so aus, in dem die ganze Arbeit stattfindet.
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) } } }
In diesem Baum übergeben wir die LetterExistenceChecker-Klasse, die dafür verantwortlich ist, das Vorhandensein eines Pixels eines Buchstabens an einem bestimmten Punkt innerhalb der Grenzen des gewünschten Quadrats zu überprüfen. Natürlich habe ich viele Details weggelassen, sonst wäre der Artikel zu umständlich. Und hier wurden nicht nur diese beiden Stufen, die im Artikel erwähnt wurden, sondern noch viel mehr, weggelassen, da das Ziel darin bestand, zu zeigen, wie der Binärbaum und die Aufzählung verwendet werden.
Hier ist eine Demo der Funktionsweise des Programms. Da das Ziel darin bestand, nur Text mit Code zu erkennen, habe ich beschlossen, den Rest des Textes, der kein Code ist, einfach zu ignorieren, damit das Programm nur nach Text mit Code sucht.
Ich freue mich über Ihre Kommentare, Kritik.