1. baracuda - 06 Августа, 2013 - 03:08:34 - перейти к сообщению
Есть задача.. определить картинки(номер телефона состоит из 10 цыфр) и записать в текстовый файл.. не могу понять как реализовать. для примера можно взять любое объявление с avito.ru.. заранее спасибо за ответ...
2. Andrew - 06 Августа, 2013 - 06:20:19 - перейти к сообщению
baracuda , Это картинка, врятли кибор сможет ее перевести в текст, надо пользоваться ещё одной программой. Сначала будем искать картинку слева (Значек телефона), далее с отступом в право сохранять картинку(Номер телефона) и работать с ней в программе подобной FineReader. В FineReader (или подобной) нужно будет загрузить эту картинку и обработать её - получиться текст, который мы и сохраним в блокнот
Как сохранять рассказать не могу, сам не до конца разобрался, времени не было.
P.S. Может я и бред наговорил, но по мне только так

Как сохранять рассказать не могу, сам не до конца разобрался, времени не было.
P.S. Может я и бред наговорил, но по мне только так

3. Kibor - 06 Августа, 2013 - 06:45:55 - перейти к сообщению
Andrew пишет:
Это картинка, врятли кибор сможет ее перевести в текст
Ээх... учишь вас учишь..

Скачать скрипт и изображения для определения телефона на avito.ru
Распаковать на C:
Смысл, ищем рисунок трубки, от него направо уже ищем по 1 цифре в области поиска ограниченной координатами исходя из координат трубки.
Вот сам скрипт. Не оптимальный вариант, но рабочий:
CODE:
int color, xe, ye;//разрешение экрана
getdisplay(color, xe, ye);//Узнать разрешение экрана
int tel_X[1], tel_Y[1];//координаты тел трубки
int X[2], Y[2];//координаты начала и конца рамки где искать цифры
int Cx[10], Cy[10];//координаты найденых цифр
int fl[10];// флаг, 1 если найдена цифра,
int rast_x;//растояние от цифры до начала рамки поиска
int n;
int CIF;
string nom_tel;//телефонный номер
int razmerX[10];//тут размеры рисунков цифр
//Загрузка рисунков
int zn_tel[9][14];loadimage (#zn_tel[0][0], "C:\chs\zn_tel.bmp");//рис тел трубки
//рис цифр
int C_0[7][10];loadimage (#C_0[0][0], "C:\chs\0.bmp");
int C_1[5][10];loadimage (#C_1[0][0], "C:\chs\1.bmp");
int C_2[7][10];loadimage (#C_2[0][0], "C:\chs\2.bmp");
int C_3[7][10];loadimage (#C_3[0][0], "C:\chs\3.bmp");
int C_4[7][10];loadimage (#C_4[0][0], "C:\chs\4.bmp");
int C_5[7][10];loadimage (#C_5[0][0], "C:\chs\5.bmp");
int C_6[7][10];loadimage (#C_6[0][0], "C:\chs\6.bmp");
int C_7[7][9];loadimage (#C_7[0][0], "C:\chs\7.bmp");
int C_8[7][10];loadimage (#C_8[0][0], "C:\chs\8.bmp");
int C_9[7][10];loadimage (#C_9[0][0], "C:\chs\9.bmp");
razmerX[0]=imagewidth(#C_0[0][0]);
razmerX[1]=imagewidth(#C_1[0][0]);
razmerX[2]=imagewidth(#C_2[0][0]);
razmerX[3]=imagewidth(#C_3[0][0]);
razmerX[4]=imagewidth(#C_4[0][0]);
razmerX[5]=imagewidth(#C_5[0][0]);
razmerX[6]=imagewidth(#C_6[0][0]);
razmerX[7]=imagewidth(#C_7[0][0]);
razmerX[8]=imagewidth(#C_8[0][0]);
razmerX[9]=imagewidth(#C_9[0][0]);
if (findimage(1, #zn_tel[0][0], 0, #tel_X[0], #tel_Y[0], 0, 0, xe, ye, -1)==1)//Нашли если рисунок трубки
{
//расчет рамки поиска цифр исходя из координат рисунка трубки
X[0]=tel_X[0]; Y[0]=tel_Y[0];
X[1]=X[0]+170; Y[1]=Y[0]+15;
nom_tel="";
int s=0;
skan:if (s<11)//ищем 11 цифр
{
//ищем по 1 цифре в рамке поиска. записываем координаты
fl[0]=findimage(1, #C_0[0][0], 255, #Cx[0], #Cy[0], X[0], Y[0], X[1], Y[1], -1);
fl[1]=findimage(1, #C_1[0][0], 255, #Cx[1], #Cy[1], X[0], Y[0], X[1], Y[1], -1);
fl[2]=findimage(1, #C_2[0][0], 255, #Cx[2], #Cy[2], X[0], Y[0], X[1], Y[1], -1);
fl[3]=findimage(1, #C_3[0][0], 255, #Cx[3], #Cy[3], X[0], Y[0], X[1], Y[1], -1);
fl[4]=findimage(1, #C_4[0][0], 255, #Cx[4], #Cy[4], X[0], Y[0], X[1], Y[1], -1);
fl[5]=findimage(1, #C_5[0][0], 255, #Cx[5], #Cy[5], X[0], Y[0], X[1], Y[1], -1);
fl[6]=findimage(1, #C_6[0][0], 255, #Cx[6], #Cy[6], X[0], Y[0], X[1], Y[1], -1);
fl[7]=findimage(1, #C_7[0][0], 255, #Cx[7], #Cy[7], X[0], Y[0], X[1], Y[1], -1);
fl[8]=findimage(1, #C_8[0][0], 255, #Cx[8], #Cy[8], X[0], Y[0], X[1], Y[1], -1);
fl[9]=findimage(1, #C_9[0][0], 255, #Cx[9], #Cy[9], X[0], Y[0], X[1], Y[1], -1);
//тут перебираем найденные цифры
rast_x=99999;
n=0;
lop: if(n<10)
{
if (fl[n]==1)//если такая цифра вообще найдена
{
if (Cx[n]-X[0]<rast_x)//проверяем растояние от начала рамки для поиска до цифры
{//если оно меньше уже найденного значит цифра левее. зпаисываем ее и новое растояние
CIF=n;
rast_x=Cx[n]-X[0];
}
}
n++;
goto lop;
}
if (rast_x==99999)goto t;//Если переменная не изменилась. нет цифр
X[0]=X[0]+Cx[CIF]+razmerX[CIF];//расчет нового X для рамки поиска. что бы следующий поиск начинать уже после найденой цифры
nom_tel=nom_tel+format(CIF);//припишем найденую цифру
s++;
goto skan;
}
}
t:;
messagebox(nom_tel);
getdisplay(color, xe, ye);//Узнать разрешение экрана
int tel_X[1], tel_Y[1];//координаты тел трубки
int X[2], Y[2];//координаты начала и конца рамки где искать цифры
int Cx[10], Cy[10];//координаты найденых цифр
int fl[10];// флаг, 1 если найдена цифра,
int rast_x;//растояние от цифры до начала рамки поиска
int n;
int CIF;
string nom_tel;//телефонный номер
int razmerX[10];//тут размеры рисунков цифр
//Загрузка рисунков
int zn_tel[9][14];loadimage (#zn_tel[0][0], "C:\chs\zn_tel.bmp");//рис тел трубки
//рис цифр
int C_0[7][10];loadimage (#C_0[0][0], "C:\chs\0.bmp");
int C_1[5][10];loadimage (#C_1[0][0], "C:\chs\1.bmp");
int C_2[7][10];loadimage (#C_2[0][0], "C:\chs\2.bmp");
int C_3[7][10];loadimage (#C_3[0][0], "C:\chs\3.bmp");
int C_4[7][10];loadimage (#C_4[0][0], "C:\chs\4.bmp");
int C_5[7][10];loadimage (#C_5[0][0], "C:\chs\5.bmp");
int C_6[7][10];loadimage (#C_6[0][0], "C:\chs\6.bmp");
int C_7[7][9];loadimage (#C_7[0][0], "C:\chs\7.bmp");
int C_8[7][10];loadimage (#C_8[0][0], "C:\chs\8.bmp");
int C_9[7][10];loadimage (#C_9[0][0], "C:\chs\9.bmp");
razmerX[0]=imagewidth(#C_0[0][0]);
razmerX[1]=imagewidth(#C_1[0][0]);
razmerX[2]=imagewidth(#C_2[0][0]);
razmerX[3]=imagewidth(#C_3[0][0]);
razmerX[4]=imagewidth(#C_4[0][0]);
razmerX[5]=imagewidth(#C_5[0][0]);
razmerX[6]=imagewidth(#C_6[0][0]);
razmerX[7]=imagewidth(#C_7[0][0]);
razmerX[8]=imagewidth(#C_8[0][0]);
razmerX[9]=imagewidth(#C_9[0][0]);
if (findimage(1, #zn_tel[0][0], 0, #tel_X[0], #tel_Y[0], 0, 0, xe, ye, -1)==1)//Нашли если рисунок трубки
{
//расчет рамки поиска цифр исходя из координат рисунка трубки
X[0]=tel_X[0]; Y[0]=tel_Y[0];
X[1]=X[0]+170; Y[1]=Y[0]+15;
nom_tel="";
int s=0;
skan:if (s<11)//ищем 11 цифр
{
//ищем по 1 цифре в рамке поиска. записываем координаты
fl[0]=findimage(1, #C_0[0][0], 255, #Cx[0], #Cy[0], X[0], Y[0], X[1], Y[1], -1);
fl[1]=findimage(1, #C_1[0][0], 255, #Cx[1], #Cy[1], X[0], Y[0], X[1], Y[1], -1);
fl[2]=findimage(1, #C_2[0][0], 255, #Cx[2], #Cy[2], X[0], Y[0], X[1], Y[1], -1);
fl[3]=findimage(1, #C_3[0][0], 255, #Cx[3], #Cy[3], X[0], Y[0], X[1], Y[1], -1);
fl[4]=findimage(1, #C_4[0][0], 255, #Cx[4], #Cy[4], X[0], Y[0], X[1], Y[1], -1);
fl[5]=findimage(1, #C_5[0][0], 255, #Cx[5], #Cy[5], X[0], Y[0], X[1], Y[1], -1);
fl[6]=findimage(1, #C_6[0][0], 255, #Cx[6], #Cy[6], X[0], Y[0], X[1], Y[1], -1);
fl[7]=findimage(1, #C_7[0][0], 255, #Cx[7], #Cy[7], X[0], Y[0], X[1], Y[1], -1);
fl[8]=findimage(1, #C_8[0][0], 255, #Cx[8], #Cy[8], X[0], Y[0], X[1], Y[1], -1);
fl[9]=findimage(1, #C_9[0][0], 255, #Cx[9], #Cy[9], X[0], Y[0], X[1], Y[1], -1);
//тут перебираем найденные цифры
rast_x=99999;
n=0;
lop: if(n<10)
{
if (fl[n]==1)//если такая цифра вообще найдена
{
if (Cx[n]-X[0]<rast_x)//проверяем растояние от начала рамки для поиска до цифры
{//если оно меньше уже найденного значит цифра левее. зпаисываем ее и новое растояние
CIF=n;
rast_x=Cx[n]-X[0];
}
}
n++;
goto lop;
}
if (rast_x==99999)goto t;//Если переменная не изменилась. нет цифр
X[0]=X[0]+Cx[CIF]+razmerX[CIF];//расчет нового X для рамки поиска. что бы следующий поиск начинать уже после найденой цифры
nom_tel=nom_tel+format(CIF);//припишем найденую цифру
s++;
goto skan;
}
}
t:;
messagebox(nom_tel);
4. Andrew - 06 Августа, 2013 - 06:50:59 - перейти к сообщению
Kibor пишет:
Ээх... учишь вас учишь..
Не всем дано мыслить на столько рационально

О таком я даже и не подумал...
5. Kibor - 06 Августа, 2013 - 06:53:53 - перейти к сообщению
baracuda пишет:
записать в текстовый файл
Записать в файл можно и так:
CODE:
if (fopen ("c:\tel.txt", "a")!=0)
{//если открылся
fwrite(nom_tel);//записываем в файл
fwrite(ENDL);//записываем в файл перевод строки
fclose();//закрываем файл
}
{//если открылся
fwrite(nom_tel);//записываем в файл
fwrite(ENDL);//записываем в файл перевод строки
fclose();//закрываем файл
}
Andrew пишет:
О таком я даже и не подумал
Так Кибор это среда программирования. Тут надо придумывать алгоритмы.
6. Andrew - 06 Августа, 2013 - 06:55:30 - перейти к сообщению
Kibor , Надо добавить строку для клика по надписи "показать номер", а то ошибка вылетает

7. Kibor - 06 Августа, 2013 - 06:57:31 - перейти к сообщению
Andrew пишет:
Надо добавить строку для клика по надписи "показать номер", а то ошибка вылетает
Ну так я просто набросал скрипт который изначально ориентируется что уже показан номер.
Добавить пару строк и он будет сам показывать...
(Добавление)
Надо добавить проверку и выход с цикла если не найдены больше цифры.
При случае если номер короче.
Сделать это можно примерно так добавив строку:
rast_x=99999;
n=0;
lop: if(n<10)
{
if (fl[n]==1)//если такая цифра вообще найдена
{
if (Cx[n]-X[0]<rast_x)//проверяем растояние от начала рамки для поиска до цифры
{//если оно меньше уже найденного значит цифра левее. зпаисываем ее и новое растояние
CIF=n;
rast_x=Cx[n]-X[0];
}
}
n++;
goto lop;
}
if (rast_x==99999)goto t;//Если переменная не изменилась. нет цифр
X[0]=X[0]+Cx[CIF]+razmerX[CIF];//расчет нового X для рамки поиска. что бы следующий поиск начинать уже после найденой цифры
nom_tel=nom_tel+format(CIF);//припишем найденую цифру
s++;
goto skan;
}
}
t::
messagebox(nom_tel);
8. baracuda - 06 Августа, 2013 - 07:21:04 - перейти к сообщению
Ох сильно.... сейчас буду изучать
9. Kibor - 06 Августа, 2013 - 08:51:37 - перейти к сообщению
Алгоритм такой:
Находим на экране картинку изображающую трубку. Рассчитываем область поиска телефонных цифр (синяя рамка)
Ищем в области поиска этой рамки все цифры от 0 до 9. Ищем только по одной штуке самые левые.
Потом проверяем расстояние от каждой цифры до рисунка трубки (зеленые стрелки) и находим ближнее. Эта цифра является самой левой.
Приписываем ее к string.
Смещаем область поиска на 1 цифру и повторяем все пока не найдем полный номер.
Находим на экране картинку изображающую трубку. Рассчитываем область поиска телефонных цифр (синяя рамка)
Ищем в области поиска этой рамки все цифры от 0 до 9. Ищем только по одной штуке самые левые.
Потом проверяем расстояние от каждой цифры до рисунка трубки (зеленые стрелки) и находим ближнее. Эта цифра является самой левой.
Приписываем ее к string.
Смещаем область поиска на 1 цифру и повторяем все пока не найдем полный номер.
