Значить проблема буває слідуюча – появився замовник якому потрібно навчити CapMonstr2 розпізнавати букви на зображеннях. Прислав архів в якому декілька тисяч картинок. Проте відповідей до картинок немає. Тому потрібно для кожної картинки співставити значення самостійно. Звичайно і тут для розмітки таких зображень може допомогти ZennoPoster.
Сама логіка проєкта може бути приблизно такою:
– беремо всі шляхи до картинок з директорії в список
– беремо перший шлях до картинки і видаляємо його зі списку
– читаємо картинку в масив байт
– переводимо в base64
– відправляємо на розпізнавання в модуль MonkeyEnter.dll
Після розпізнавання зберігаємо шлях до картинки і розпізнане значення наприклад в інший список чи таблицю.
Звичайно, можна відправляти зображення наприклад на сервіси ручного розпізнавання, можна розпізнавати за допомогою бібліотеки Tesseract.
Проте важливо розуміти, що в будь-якому випадку прийдеться переглядати всі зображення і відповіді, щоб впевнитись у відсутності помилок.
Цікавим мабуть повинно бути саме переведення картинки в base64, тому колись я записував на цю тему відео, а всю логіку написання цього рішення залишаю на самостійне опрацювання (дуже корисно з метою набору досвіду вирішувати такі маленькі завдання) – тому постарайтесь написати весь код не більше ніж за 1 годину, користуватись пошуком звичайно можна і навіть потрібно:
В мене получилось зібрати такий C# код, який виконує це завдання обробки файлів.
Один потік ZennoPoster за 1 виконання працює тільки з одним зображенням після чого завершує роботу.
Зображення переміщається в тимчасову папку, щоб не втратити його, якщо виникне якась помилка.
Можливо запускати декілька потоків одночасно, тому що використовується синхронізація потоків.
project.SendInfoToLog("start",true); var tb = project.Lists["table"]; string[] dir = new[]{"INPUT", "TEMP", "OUT"}; string path = string.Empty; string name = string.Empty; string temp_path = string.Empty; string base64 = string.Empty; string code= string.Empty; bool check = false; lock(SyncObjects.ListSyncer) { // синхронізація потоків, щоб декілька потоків не брали в роботу один файл List<string> list = Directory.GetFiles(Path.Combine(project.Directory, dir[0])).ToList(); path = list.First(); name = Path.GetFileName(path); temp_path = Path.Combine(project.Directory, dir[1],name); File.Move(path, temp_path); } base64 = Convert.ToBase64String(File.ReadAllBytes(temp_path)); code = ZennoPoster.CaptchaRecognition("MonkeyEnter.dll", base64, ""); switch(code) { case "---": check = true; break; default: check = false; break; } if(!check) { string good_path = Path.Combine(project.Directory, dir[2], name); File.Move(temp_path, good_path); lock(SyncObjects.ListSyncer) {// синхронізація потоків в момент запису результату tb.Add(string.Join(";", new[]{name, code})); } } project.SendInfoToLog("end",true);