Як вручну ввести код з картинки в ZennoPoster

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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *