Marat |
Отправлено: 18 Ноября, 2018 - 09:53:16
|
Прохожий
Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2018
Репутация: 0
|
Zireael пишет: Картинки все такого типа? Одинаковый шрифт, фон, кроме текста нет ничего лишнего?
Глубина цвета должна быть 24, а не 8 как на примере. Допустимые расширения jpg, png, bmp.
Формат jpg, шрифт самого текста(который нужно распознать и удалить) одинаковый, фон чаще всего белый(в каких-то местах слегка сероват), кроме текста который нужно удалить есть и другой текст, само собой, обычно шрифт в другом формате(который не нужно удалять). |
|
|
Zireael |
Отправлено: 18 Ноября, 2018 - 10:50:17
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
https://drive.google.com/open?id...Kz798PtLBNCtthJ1
В архиве папка, в которой картинки для теста. Картинки разных размеров в разных форматах (jpg, bmp, png).
Папку '123' закинуть на диск C:
Кибор запускать от админа. Когда скрипт закончит работу откроется папка 'result', которая будет создана в '123'. В ней будут картинки, из которых будут удалены надписи 'гдз.ру' и 'gdz.ru'.
Для повторного теста перезапустить кибор. Или приобрести максимальную версию, в которой нет ограничения на использование функции readtext.
Цитата: фон чаще всего белый(в каких-то местах слегка сероват)
Нужна картинка с этим фоном.
code (Отобразить)CODE:string path="C:\123"; // путь к папке с картинками,
// там же должна лежать база для распознавания текста basetext2.sib
external(INT, "CreateDirectory", "CreateDirectoryA", "kernel32.dll");
int a[1920][1080];
string P[100], PP[100], Text, type_file, name_file;
int pos[100], x, h, w, h_end, w_end;
int i, j, k, n, m;
char c[10000];
loadsymbolbase (path+"\basetext2.sib");
string s[50000];
int count_image=dir(path, #s[0], "file"); // поиск всех картинок по указанному пути
CreateDirectory(path+"\result", 0);
textbkcolor(255, 65280);
textout(0, 300, 300, "Всего файлов в папке: "+format(count_image), 2);
for (n=0; n<count_image; n++) // для всех файлов
{
regexsearch(1, #name_file, s[n], "[^\\]+(?=\.)"); // имя файла
if(regexsearch(1, #type_file, s[n], "jpg|bmp|png")>0) // если расширение соответствует jpg, bmp или png
{
if(type_file=="jpg")loadimage(JPG, #a[0][0], path+"\"+name_file+"."+type_file); // если jpg
else
{
if(type_file=="bmp")loadimage(#a[0][0], path+"\"+name_file+"."+type_file); // если bmp
else
{
if(type_file=="png")loadimage(PNG, #a[0][0], path+"\"+name_file+"."+type_file); // если png
}
}
x=readtext (NUM | RU | EN | MARK, #Text, 40, -1, -1, -1, -1, -1, -1, 0, 50, 0, 0, imagewidth(#a[0][0]), imageheight(#a[0][0]), #a[0][0]);
//messagebox(Text); // распознанный текст
if(x>0)
{
strcpy(#c[0], Text);
int gdz_count=regexsearch(-1, #P[0], Text, "[гдзруgdzruy.,]{6}"); // поиск в тексте всех 'гдз.ru' и 'gdz.ru'
if(gdz_count>0)
{
regexstart(#pos[0]);
for(k=0; k<gdz_count; k++)
{
x=regexsearch(-1, #PP[0], format(#c[0], pos[k]), "\r\n"); // узнаём сколько в строке переносов строк до найденного слова
// pos[k]=pos[k]-x;
for(m=0; m<6; m++) // удаляем с картинки символы
{
h=symbolxpos(pos[k]+m)-1; // позиция X начала символа
w=symbolypos(pos[k]+m)-symbolheight(pos[k]+m)-1; // позиция Y начала символа
h_end=symbolxpos(pos[k]+m)+symbolwidth(pos[k]+m)+1; // позиция X конца символа
w_end=symbolypos(pos[k]+m)+1; // позиция Y конца символа
// закрашиваем буквы в белый цвет
for(i=w; i<w_end; i++)
{
for(j=h; j<h_end; j++)a[j][i]=16777215;
}
}
///////
}
///// сохраняем картинку
if(type_file=="jpg")saveimage(JPG, #a[0][0], path+"\result\"+name_file+"."+type_file); // если jpg
else
{
if(type_file=="bmp")saveimage(#a[0][0], path+"\result\"+name_file+"."+type_file); // если bmp
else
{
if(type_file=="png")saveimage(PNG, #a[0][0], path+"\result\"+name_file+"."+type_file); // если png
}
}
}
}
//////////////
}
textout(1, 300, 320, "Обработано файлов: "+format(n+1), 2);
}
start(path+"\result"); |
|
|
Marat |
Отправлено: 18 Ноября, 2018 - 11:46:54
|
Прохожий
Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2018
Репутация: 0
|
Zireael пишет: https://drive.google.com/open?id...Kz798PtLBNCtthJ1
В архиве папка, в которой картинки для теста. Картинки разных размеров в разных форматах (jpg, bmp, png).
Папку '123' закинуть на диск C:
Кибор запускать от админа. Когда скрипт закончит работу откроется папка 'result', которая будет создана в '123'. В ней будут картинки, из которых будут удалены надписи 'гдз.ру' и 'gdz.ru'.
Для повторного теста перезапустить кибор. Или приобрести максимальную версию, в которой нет ограничения на использование функции readtext.
Цитата: фон чаще всего белый(в каких-то местах слегка сероват)
Нужна картинка с этим фоном.
code (Отобразить)CODE:string path="C:\123"; // путь к папке с картинками,
// там же должна лежать база для распознавания текста basetext2.sib
external(INT, "CreateDirectory", "CreateDirectoryA", "kernel32.dll");
int a[1920][1080];
string P[100], PP[100], Text, type_file, name_file;
int pos[100], x, h, w, h_end, w_end;
int i, j, k, n, m;
char c[10000];
loadsymbolbase (path+"\basetext2.sib");
string s[50000];
int count_image=dir(path, #s[0], "file"); // поиск всех картинок по указанному пути
CreateDirectory(path+"\result", 0);
textbkcolor(255, 65280);
textout(0, 300, 300, "Всего файлов в папке: "+format(count_image), 2);
for (n=0; n<count_image; n++) // для всех файлов
{
regexsearch(1, #name_file, s[n], "[^\\]+(?=\.)"); // имя файла
if(regexsearch(1, #type_file, s[n], "jpg|bmp|png")>0) // если расширение соответствует jpg, bmp или png
{
if(type_file=="jpg")loadimage(JPG, #a[0][0], path+"\"+name_file+"."+type_file); // если jpg
else
{
if(type_file=="bmp")loadimage(#a[0][0], path+"\"+name_file+"."+type_file); // если bmp
else
{
if(type_file=="png")loadimage(PNG, #a[0][0], path+"\"+name_file+"."+type_file); // если png
}
}
x=readtext (NUM | RU | EN | MARK, #Text, 40, -1, -1, -1, -1, -1, -1, 0, 50, 0, 0, imagewidth(#a[0][0]), imageheight(#a[0][0]), #a[0][0]);
//messagebox(Text); // распознанный текст
if(x>0)
{
strcpy(#c[0], Text);
int gdz_count=regexsearch(-1, #P[0], Text, "[гдзруgdzruy.,]{6}"); // поиск в тексте всех 'гдз.ru' и 'gdz.ru'
if(gdz_count>0)
{
regexstart(#pos[0]);
for(k=0; k<gdz_count; k++)
{
x=regexsearch(-1, #PP[0], format(#c[0], pos[k]), "\r\n"); // узнаём сколько в строке переносов строк до найденного слова
pos[k]=pos[k]-x;
for(m=0; m<6; m++) // удаляем с картинки символы
{
h=symbolxpos(pos[k]+m)-1; // позиция X начала символа
w=symbolypos(pos[k]+m)-symbolheight(pos[k]+m)-1; // позиция Y начала символа
h_end=symbolxpos(pos[k]+m)+symbolwidth(pos[k]+m)+1; // позиция X конца символа
w_end=symbolypos(pos[k]+m)+1; // позиция Y конца символа
// закрашиваем буквы в белый цвет
for(i=w; i<w_end; i++)
{
for(j=h; j<h_end; j++)a[j][i]=16777215;
}
}
///////
}
///// сохраняем картинку
if(type_file=="jpg")saveimage(JPG, #a[0][0], path+"\result\"+name_file+"."+type_file); // если jpg
else
{
if(type_file=="bmp")saveimage(#a[0][0], path+"\result\"+name_file+"."+type_file); // если bmp
else
{
if(type_file=="png")saveimage(PNG, #a[0][0], path+"\result\"+name_file+"."+type_file); // если png
}
}
}
}
//////////////
}
textout(1, 300, 320, "Обработано файлов: "+format(n+1), 2);
}
start(path+"\result");
Скрипт на другие из картинок ругается.
"Ошибка readtext. Область сканирования выходит за реальный размер изображения"
Ошибка #2 -(для просмотра ссылки Вам необходимо авторизоваться)
Сами картинки, на которые ругается.(для просмотра ссылки Вам необходимо авторизоваться) |
|
|
Marat |
Отправлено: 18 Ноября, 2018 - 13:42:52
|
Прохожий
Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2018
Репутация: 0
|
Zireael пишет: Цитата: Скрипт на другие из картинок ругается.
Глубина цвета должна быть 24. В свойствах картинки можно посмотреть.
Надписи, которые под углом не удалить. Их не распознать.
Глубину цвета я изменил, примерно 39 картинок Кибор обрабатывает, а далее такие же ошибки пишет, возможно ли эти ошибки пропустить как-то, то есть впускать картинку необработанную в папку result, если программа не может обработать? |
|
|
Zireael |
Отправлено: 18 Ноября, 2018 - 15:12:10
|
Эксперт
Покинул форум
Сообщений всего: 4467
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: а далее такие же ошибки пишет
У меня нет такой ошибки. Даже если битность не та. Просто не сохранит картинку.
Добавил проверку битности для png. Если не соответствует, то файл копируется без изменений в папку raw, а не result.
code (Отобразить)CODE:string path="C:\123"; // путь к папке с картинками,
// там же должна лежать база для распознавания текста basetext2.sib
external(INT, "CreateDirectory", "CreateDirectoryA", "kernel32.dll");
external(INT, "CopyFile", "CopyFileA", "kernel32.dll");
int a[1920][1080];
string P[100], PP[100], Text, type_file, name_file;
int pos[100], x, h, w, h_end, w_end;
int i, j, k, n, m;
char c[10000];
char rb[25];
loadsymbolbase (path+"\basetext2.sib");
string s[50000];
int count_image=dir(path, #s[0], "file"); // поиск всех картинок по указанному пути
CreateDirectory(path+"\result", 0);
CreateDirectory(path+"\raw", 0);
textbkcolor(255, 65280);
textout(0, 300, 300, "Всего файлов в папке: "+format(count_image), 2);
for (n=0; n<count_image; n++) // для всех файлов
{
regexsearch(1, #name_file, s[n], "[^\\]+(?=\.)"); // имя файла
if(regexsearch(1, #type_file, s[n], "jpg|bmp|png")>0) // если расширение соответствует jpg, bmp или png
{
if(type_file=="jpg")loadimage(JPG, #a[0][0], path+"\"+name_file+"."+type_file); // если jpg
else
{
if(type_file=="bmp")loadimage(#a[0][0], path+"\"+name_file+"."+type_file); // если bmp
else
{
if(type_file=="png")
{
// проверки битности
if(fopen (path+"\"+name_file+"."+type_file, "rb")!=0)
{
freadb(#rb[0], sizearray(rb)); fclose();
if(codhexi(#rb[24], 1)!=8) // если битность неравна 8
{
CopyFile(path+"\"+s[n], path+"\raw\"+name_file+"."+type_file, 0);
continue;
}
}
}
loadimage(PNG, #a[0][0], path+"\"+name_file+"."+type_file); // если png
}
}
x=readtext (NUM | RU | EN | MARK, #Text, 40, -1, -1, -1, -1, -1, -1, 0, 50, 0, 0, imagewidth(#a[0][0]), imageheight(#a[0][0]), #a[0][0]);
//messagebox(Text); // распознанный текст
if(x>0)
{
strcpy(#c[0], Text);
int gdz_count=regexsearch(-1, #P[0], Text, "[гдзруgdzruy.,]{6}"); // поиск в тексте всех 'гдз.ru' и 'gdz.ru'
if(gdz_count>0)
{
regexstart(#pos[0]);
for(k=0; k<gdz_count; k++)
{
x=regexsearch(-1, #PP[0], format(#c[0], pos[k]), "\r\n"); // узнаём сколько в строке переносов строк до найденного слова
// pos[k]=pos[k]-x;
for(m=0; m<6; m++) // удаляем с картинки символы
{
h=symbolxpos(pos[k]+m)-1; // позиция X начала символа
w=symbolypos(pos[k]+m)-symbolheight(pos[k]+m)-1; // позиция Y начала символа
h_end=symbolxpos(pos[k]+m)+symbolwidth(pos[k]+m)+1; // позиция X конца символа
w_end=symbolypos(pos[k]+m)+1; // позиция Y конца символа
// закрашиваем буквы в цвет фона, цвет левого верхнего пикселя на картинке
for(i=w; i<w_end; i++)
{
for(j=h; j<h_end; j++)a[j][i]=a[0][0];
}
}
///////
}
///// сохраняем картинку
if(type_file=="jpg")saveimage(JPG, #a[0][0], path+"\result\"+name_file+"."+type_file); // если jpg
else
{
if(type_file=="bmp")saveimage(#a[0][0], path+"\result\"+name_file+"."+type_file); // если bmp
else
{
if(type_file=="png")saveimage(PNG, #a[0][0], path+"\result\"+name_file+"."+type_file); // если png
}
}
}
}
//////////////
}
textout(1, 300, 320, "Обработано файлов: "+format(n+1), 2);
}
start(path+"\result"); |
|
|
|