Значить проблема буває слідуюча – появився замовник якому потрібно навчити 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);
