SASGIS

Веб-картография и навигация

Привязка карт с maps.ggc.ru

программа для загрузки и просмотра спутниковых снимков Земли, Луны, Марса предоставленных сервисами Google Maps и Космоснимки. Возможность работы с GPS приёмником.

Модератор: Tolik

Привязка карт с maps.ggc.ru

Сообщение akapaulo » 03 ноя 2011, 00:18

Всем привет!

Озадачился задачей привязать(в Ozi) несколько пятисотметровок с maps.ggc.ru, любезно предоставленных Shurik'ом (viewtopic.php?f=2&t=1517), за что ему огромное спасибо:-)

Сначала пытался действовать по алгоритму здесь: http://ozi-piter.narod.ru/calibration/calibration.html
Но Ozi в конце калибровки всегда выдавал ошибку "invalid floating point operation". Система у меня Win7 64bit.

Нашел маленькую программку ggcozi.exe за авторством IgorKogan, которая должна автоматически привязывать лист с maps.ggc.ru по его названию. Однако в результате получается серьезное расхождение с Google (проверял по нескольким опорным точкам). Порядка 170 метров.
Пробовал привязывать лист как в оригинале (с белыми полями, немного повернут влево), так и обрезанный и развернутый. Результат аналогичный.

Кто подскажет, как же решить задачу точной привязки? То есть получить заветный файлик .map...
akapaulo
Новичок
 
Сообщения: 8
Зарегистрирован: 19 июн 2011, 17:30
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение Papazol » 03 ноя 2011, 23:46

Указанная программа задаёт углам изображения координаты, соответствующие листам карт Главного штаба, однако углы карты никогда не совпадают с углами картинки. Поэтому и расхождения происходят. Автоматизировать установку маркеров на углы карты - задача решаемая, но сложная, поэтому гарантированно привязать карты правильно можно только вручную. В разделе Вики есть описание привязки как раз листа этих карт, посмотрите. Ссылка на эту тему: http://sasgis.org/wikisasiya/doku.php/привязка_пользовательских_карт_в_oziexplorer (кликать не надо, надо скопировать и в адресную строку браузера).
У меня есть небольшая утилитка для облегчения процесса привязки, она вычисляет координаты углов указанного листа карты масштаба 25k. Конечно, делалось под себя, поэтому работает только с тремя квадратами: N-36, N-37 и N-38.
Вложения
.zip
(294.33 KiB) Скачиваний: 201
Аватара пользователя
Papazol
Гуру
 
Сообщения: 2069
Зарегистрирован: 04 дек 2009, 01:39
Откуда: Рязань
Благодарил (а): 74 раз.
Поблагодарили: 647 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение garl » 04 ноя 2011, 09:09

Papazol писал(а): Конечно, делалось под себя, поэтому работает только с тремя квадратами: N-36, N-37 и N-38.

мега полезная штука. ибо приходится местами ручками подбирать это хозяйство.
а можно или добавить диапазон по России или если исходники на делфи и не секретные опубликовать их.
Russian NDN Team
QIP NightlyTester
Аватара пользователя
garl
Гуру
 
Сообщения: 1625
Зарегистрирован: 16 июл 2008, 14:40
Откуда: Краснодар, Кубанская столица.
Благодарил (а): 97 раз.
Поблагодарили: 273 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение Papazol » 04 ноя 2011, 15:23

Это написано на AutoIt'е, а не на Delphi. Исходный текст позволяет добавить всё, что угодно, язык довольно простой.
PS Посмотрел - а для N-36 ничего у меня не написано... Попробую поправить.

Посидел, подумал и дописАл программу. Теперь можно вычислять координаты углов для любых квадратов (в которые помещается Россия, это всё-таки ggc).
Вложения
Source.zip
(2.94 KiB) Скачиваний: 223
Coords.zip
(296.96 KiB) Скачиваний: 235

За это сообщение автора Papazol поблагодарили: 2
igel72 (09 ноя 2011, 07:02) • zOn (09 ноя 2011, 15:08)
Рейтинг: 10.53%
 
Аватара пользователя
Papazol
Гуру
 
Сообщения: 2069
Зарегистрирован: 04 дек 2009, 01:39
Откуда: Рязань
Благодарил (а): 74 раз.
Поблагодарили: 647 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение eeonw » 06 ноя 2011, 11:41

Я с ggcozi.exe привязывал сотни карт, никогда ещё с таким не сталкивался.
Очень теперь забеспокоился, что где-то получились неточные привязки.
Вчера только всю московскую область километовку делал, а сегодня - 250-метровку. Накладываю в ози треки из инета- максимум 10-15 метров сдвиг, а в основном - меньше. У ggcozi.exe есть разные версии, у той, которой я пользуюсь размер - 509 952 байт.
Вроде неоткуда взяться расхождению - ищет угол, ставит точку по номенклатуре, всё должно быть очень точно.
Если есть расхождение, то получается на ggc границы номенклатурных листов сдвинуты? Вряд ли.

А какие листы дали такое расхождение?
Вообще такое расхождение (около 100) метров похоже на путаницу с датумами.
eeonw
Новичок
 
Сообщения: 13
Зарегистрирован: 25 янв 2009, 16:26
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение akapaulo » 06 ноя 2011, 22:10

Papazol писал(а):Это написано на AutoIt'е, а не на Delphi. Исходный текст позволяет добавить всё, что угодно, язык довольно простой.
PS Посмотрел - а для N-36 ничего у меня не написано... Попробую поправить.

Посидел, подумал и дописАл программу. Теперь можно вычислять координаты углов для любых квадратов (в которые помещается Россия, это всё-таки ggc).


Замечательно! Только уточните, программа работает только с масштабом 250м или может и с 500м?
akapaulo
Новичок
 
Сообщения: 8
Зарегистрирован: 19 июн 2011, 17:30
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение akapaulo » 06 ноя 2011, 22:16

eeonw писал(а):Я с ggcozi.exe привязывал сотни карт, никогда ещё с таким не сталкивался.
Очень теперь забеспокоился, что где-то получились неточные привязки.
Вчера только всю московскую область километовку делал, а сегодня - 250-метровку. Накладываю в ози треки из инета- максимум 10-15 метров сдвиг, а в основном - меньше. У ggcozi.exe есть разные версии, у той, которой я пользуюсь размер - 509 952 байт.
Вроде неоткуда взяться расхождению - ищет угол, ставит точку по номенклатуре, всё должно быть очень точно.
Если есть расхождение, то получается на ggc границы номенклатурных листов сдвинуты? Вряд ли.

А какие листы дали такое расхождение?
Вообще такое расхождение (около 100) метров похоже на путаницу с датумами.


Тренировался только на одном листе, O-37-038-Г (500м). Скачивал с Рамблера.
Вышеупомянутой ggcozi.exe лист подсовывать в исходном варианте или стоит обрезать поля и развернуть его?
akapaulo
Новичок
 
Сообщения: 8
Зарегистрирован: 19 июн 2011, 17:30
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение akapaulo » 06 ноя 2011, 23:37

Если кому нужно - тут все есть с привязками!

За это сообщение автора akapaulo поблагодарил:
yori (07 ноя 2011, 03:10)
Рейтинг: 5.26%
 
akapaulo
Новичок
 
Сообщения: 8
Зарегистрирован: 19 июн 2011, 17:30
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение Papazol » 08 ноя 2011, 23:52

Возможно, я уже отстал от жизни, когда тестировал ggcozi, было именно так, как я написАл. Больше я её не пробовал, может, автор внёс изменения, улучшающие работу. Но ведь проверить это очень просто. Откройте в OziExplorer'е карту, привязанную с помощью ggcozi, и проверьте привязку. Если маркеры опорных точек стоЯт точно на углах карты (а не всего изображения!), привязка точная. В противном случае... Вообще-то почему-то не верится, что такая маленькая программа может автоматически находить углы карты.

Появилось время заняться картами ggc, и вот что обнаружилось. Есть где скачать листы (правда, в основном, однокилометровки и немного 500-метровок). Есть возможность их привязать (об этом чуть позже). И есть нужда их склеить в единое полотно, а затем порезать на тайлы, естественно, в Global Mapper'е. При склейке листы необходимо обрезать. Для этого раньше я использовал ту утилитку, что выложил недавно. Однако она работала в узком диапазоне возможных всяких значений, в частности, масштаб обрабатываемых карт был фиксированным и составлял 25k. И квадраты были ограничены. Решился я эту утилитку переделать, чтоб могла. И вот, теперь можно задавать любые квадраты, начиная с 1М и до 25k (только в северном полушарии, ну их нафиг!), а также пересылать обрезку прямо в Global Mapper. Последняя операция меня весьма напрягала, ибо при её выполнении требовалось внимательно набирать многия цифры. Теперь процесс автоматизирован, чему я весьма рад.
Конечно, не обошлось без ограничений. Поскольку набор горячих клавиш в Global Mapper'е не слишком обширен, многие вещи можно делать только мышью. А это накладывает ограничения при различных размерах экрана. У меня разрешение 1280х1024, с ним это и работает. Да, ещё мой Global Mapper русифицирован...
Итак, процесс следующий:
1. Скачиваем изображения квадратов (с привязками или без).
2. Если без привязок - привязываем, если с привязками - проверяем!
3. Открываем отобранные изображения в Global Mapper'е. Это может быть довольно долгий процесс в зависимости от количества квадратов.
4. Запускаем утилитку.
5. Далее в принципе всё интуитивно понятно. Цель работы - обрезать все загруженные квадраты, чтобы получилось цельное полотно. Рекомендую сначала выбирать квадрат в Global Mapper'е, и только потом в предлагаемой утилитке, в противном случае... ничего плохого не случится, но лучше так.

Теперь о привязке. Будучи приверженцем ручного способа как позволяющего полностью контролировать ход процесса, написАл ещё одну утилитку. Она пишет map-файлы для всех изображений, находящихся в указанной папке. Причём названия файлов этих изображений должны удовлетворять некоторому шаблону (чтобы правильно посчитать координаты углов). Созданные map-файлы называются так же, как соответствующие им изображения. В них правильно прописаны координаты опорных точек привязки (углов). А вот маркеры этих опорных точек поставлены во всех файлах одинаково, и они не совпадают с углами карт. Этот факт требует ручной коррекции привязки. Однако, по сравнению с привязкой "с нуля", не приходится вводить координаты, работа только с мышью.
Есть желание добить программу, чтобы стала универсальной. Так что пока её не выкладываю, как сделаю - сразу выложу.

Не прошло и года. Вот программа, которая пишет map-файлы для найденных в папке изображений. Условия:
1. Формат наименования всех файлов изображений должен быть либо P-40-035-D-c.png, либо P-40-035-G-v.png. То есть, буквы, которыми обозначаются квадраты 50k и 25k, могут быть либо abcd, либо abvg, но только один из вариантов для всех файлов. Расширение файлов значения не имеет, png - это по умолчанию.
2. Можно делать map-файлы для квадратов 1M, 100k, 50k, 25k. Теоретически можно в одной папке иметь разные масштабы, для них будут записаны правильные map-файлы, только это неудобно.
3. Можно добавлять в папку новые изображения, существующие файлы привязок не будут затронуты.
4. Необходима последующая ручная корректировка положений маркеров привязки!
Программа в архиве Program.zip.
Вложения
Program.zip
(286.02 KiB) Скачиваний: 244
.zip
(295.39 KiB) Скачиваний: 225
Последний раз редактировалось Papazol 09 ноя 2011, 11:36, всего редактировалось 1 раз.

За это сообщение автора Papazol поблагодарил:
igel72 (09 ноя 2011, 07:20)
Рейтинг: 5.26%
 
Аватара пользователя
Papazol
Гуру
 
Сообщения: 2069
Зарегистрирован: 04 дек 2009, 01:39
Откуда: Рязань
Благодарил (а): 74 раз.
Поблагодарили: 647 раз.

Re: Привязка карт с maps.ggc.ru

Сообщение DJ VK » 09 ноя 2011, 10:36

готов отдать в хорошие руки программу с исходным кодом на дельфи. пишите в личку. программа 2-мя алгоритмами сама ищет углы а потом предлагает вручную подвинуть точки привязки - нельзя же доверять компьютеру :D . На привязку 1 листа уходит несколько секунд, зато карты привязаны точно. программа создает corn файлы в папке с картой, что позволяет повторно не привязывать вручную те же карты. ;)
Есть причуды, например карта копируется в новую папку при обработке, но писалось под личные нужды. Инструмент мощный, привяка под ози и глобал маппер с автоматической маркировкой в последнем невидимой области. Позволяет автоматизировать все этапы, предваряющие превращение в мозайку google maps.
жду желающих, (присылайте e-mail)
p/s/ для работы с кодом требуется LMD VCL.

маски для поиска углов
скрытый текст: показать
const BYTE P1Mask[6][18]={{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};

const BYTE P2Mask[6][18]={{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};

const BYTE P3Mask[6][18]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};

const BYTE P4Mask[6][18]={{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};

const BYTE PL1Mask[3][9]={{0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00}};

const BYTE PL2Mask[3][9]={{0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF}};

const BYTE PL3Mask[3][9]={{0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF}};

const BYTE PL4Mask[3][9]={{0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0x00,0x00,0x00,0xFF,0xFF,0xFF}};

const BYTE PM1Mask[3][9]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00}};

const BYTE PM2Mask[3][9]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00},
{0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00}};

const BYTE PM3Mask[3][9]={{0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00},
{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};

const BYTE PM4Mask[3][9]={{0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00},
{0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
union TClr
{
TColor Color;
BYTE Byte[4];
};



поиск углов
скрытый текст: показать
//---------------------------------------------------------------------------
bool __fastcall MapThread::FindCorners(TImage* img)
{
int x,y,w,h;
w=img->Picture->Width;
h=img->Picture->Height;
x=-3;y=-3;
while(!Pattern11(img,x,y))
{
x++;
if(x>Marg) {x=-3;y++;}
if(y>Marg) return false;
}
x=w-3;y=-3;
while(!Pattern12(img,x,y))
{
x--;
if(x<w-Marg) {x=w-3;y++;}
if(y>Marg) return false;
}
x=w-3;y=h-3;
while(!Pattern13(img,x,y))
{
x--;
if(x<w-Marg) {x=w-3;y--;}
if(y<h-Marg) return false;
}
x=-3;y=h-3;
while(!Pattern14(img,x,y))
{
x++;
if(x>Marg) {x=-3;y--;}
if(y<h-Marg) return false;
}
Pattern21(img);
Pattern22(img);
Pattern23(img);
Pattern24(img);
return true;
}
//---------------------------------------------------------------------------
BYTE* __fastcall MapThread::PatGet(TImage* img,int Y)
{
BYTE* res=NULL;
int h=img->Picture->Height;
if(0<=Y && Y<h) res=(BYTE*)img->Picture->Bitmap->ScanLine[Y];
return res;
}
//---------------------------------------------------------------------------
BYTE __fastcall MapThread::ByteGet(TImage* img,BYTE* Patt,int X,int Bkg)
{
int w=img->Picture->Width;
BYTE res=Bkg;
if(Patt!=NULL) if(X>=0 && X<w*3) res=(BYTE)Patt[X];
return res;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern11(TImage* img,int imX,int imY)
{
BYTE Bkg=0xFA;
BYTE* Ptrs[6];
BYTE* PP;
int i,j,k;
for(i=0;i<6;i++) Ptrs[i]=PatGet(img,imY+i);
int Cnt=0;
for(i=0;i<3;i++)
if(ByteGet(img,Ptrs[3],(imX+3)*3+i,Bkg)==Bkg) Cnt++;
if(Cnt==3) return false;
for(i=0;i<3;i++) for(j=0;j<imX;j++)
if(ByteGet(img,Ptrs[3],j*3+i,Bkg)!=Bkg) return false;
for(j=0;j<imY;j++)
{
PP=PatGet(img,j);
for(i=0;i<3;i++)
if(ByteGet(img,PP,(imX+3)*3+i,Bkg)!=Bkg) return false;
}
PP=PatGet(img,imY+20);
for(i=0;i<3;i++) for(j=0;j<imX-10;j++)
if(ByteGet(img,PP,j*3+i,Bkg)!=Bkg) return false;
for(i=0;i<6;i++) for(j=0;j<18;j++)
if((ByteGet(img,Ptrs[i],imX*3+j,Bkg)&P1Mask[i][j])!=(Bkg&P1Mask[i][j])) return false;
Corn1X=imX+3;
Corn1Y=imY+3;
for(i=3;i<6;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[2],(imX+i)*3+j,Bkg)!=Bkg) Corn1Y=imY+2;
for(i=3;i<6;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[i],(imX+2)*3+j,Bkg)!=Bkg) Corn1X=imX+2;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern12(TImage* img,int imX,int imY)
{
BYTE Bkg=0xFA;
BYTE* Ptrs[6];
BYTE* PP;
int w=img->Picture->Width;
int i,j,k;
for(i=0;i<6;i++) Ptrs[i]=PatGet(img,imY+i);
int Cnt=0;
for(i=0;i<3;i++)
if(ByteGet(img,Ptrs[3],(imX+2)*3+i,Bkg)==Bkg) Cnt++;
if(Cnt==3) return false;
for(i=0;i<3;i++) for(j=imX+6;j<w;j++)
if(ByteGet(img,Ptrs[3],j*3+i,Bkg)!=Bkg) return false;
for(j=0;j<imY;j++)
{
PP=PatGet(img,j);
for(i=0;i<3;i++)
if(ByteGet(img,PP,(imX+2)*3+i,Bkg)!=Bkg) return false;
}
PP=PatGet(img,imY+20);
for(i=0;i<3;i++) for(j=imX+16;j<w;j++)
if(ByteGet(img,PP,j*3+i,Bkg)!=Bkg) return false;
for(i=0;i<6;i++) for(j=0;j<18;j++)
if((ByteGet(img,Ptrs[i],imX*3+j,Bkg)&P2Mask[i][j])!=(Bkg&P2Mask[i][j])) return false;
Corn2X=imX+2;
Corn2Y=imY+3;
for(i=0;i<3;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[2],(imX+i)*3+j,Bkg)!=Bkg) Corn2Y=imY+2;
for(i=3;i<6;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[i],(imX+3)*3+j,Bkg)!=Bkg) Corn2X=imX+3;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern13(TImage* img,int imX,int imY)
{
BYTE Bkg=0xFA;
BYTE* Ptrs[6];
BYTE* PP;
int w=img->Picture->Width;
int h=img->Picture->Height;
int i,j,k;
for(i=0;i<6;i++) Ptrs[i]=PatGet(img,imY+i);
int Cnt=0;
for(i=0;i<3;i++)
if(ByteGet(img,Ptrs[2],(imX+2)*3+i,Bkg)==Bkg) Cnt++;
if(Cnt==3) return false;
for(i=0;i<3;i++) for(j=imX+6;j<w;j++)
if(ByteGet(img,Ptrs[2],j*3+i,Bkg)!=Bkg) return false;
for(j=imY+6;j<h;j++)
{
PP=PatGet(img,j);
for(i=0;i<3;i++)
if(ByteGet(img,PP,(imX+2)*3+i,Bkg)!=Bkg) return false;
}
PP=PatGet(img,imY-14);
for(i=0;i<3;i++) for(j=imX+16;j<w;j++)
if(ByteGet(img,PP,j*3+i,Bkg)!=Bkg) return false;
for(i=0;i<6;i++) for(j=0;j<18;j++)
if((ByteGet(img,Ptrs[i],imX*3+j,Bkg)&P3Mask[i][j])!=(Bkg&P3Mask[i][j])) return false;
Corn3X=imX+2;
Corn3Y=imY+2;
for(i=0;i<3;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[3],(imX+i)*3+j,Bkg)!=Bkg) Corn3Y=imY+3;
for(i=0;i<3;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[i],(imX+3)*3+j,Bkg)!=Bkg) Corn3X=imX+3;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern14(TImage* img,int imX,int imY)
{
BYTE Bkg=0xFA;
BYTE* Ptrs[6];
BYTE* PP;
int h=img->Picture->Height;
int i,j,k;
for(i=0;i<6;i++) Ptrs[i]=PatGet(img,imY+i);
int Cnt=0;
for(i=0;i<3;i++)
if(ByteGet(img,Ptrs[2],(imX+3)*3+i,Bkg)==Bkg) Cnt++;
if(Cnt==3) return false;
for(i=0;i<3;i++) for(j=0;j<imX;j++)
if(ByteGet(img,Ptrs[2],j*3+i,Bkg)!=Bkg) return false;
for(j=imY+6;j<h;j++)
{
PP=PatGet(img,j);
for(i=0;i<3;i++)
if(ByteGet(img,PP,(imX+3)*3+i,Bkg)!=Bkg) return false;
}
PP=PatGet(img,imY-14);
for(i=0;i<3;i++) for(j=0;j<imX-10;j++)
if(ByteGet(img,PP,j*3+i,Bkg)!=Bkg) return false;
for(i=0;i<6;i++) for(j=0;j<18;j++)
if((ByteGet(img,Ptrs[i],imX*3+j,Bkg)&P4Mask[i][j])!=(Bkg&P4Mask[i][j])) return false;
Corn4X=imX+3;
Corn4Y=imY+2;
for(i=3;i<6;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[3],(imX+i)*3+j,Bkg)!=Bkg) Corn4Y=imY+3;
for(i=0;i<3;i++) for(j=0;j<3;j++) if(ByteGet(img,Ptrs[i],(imX+2)*3+j,Bkg)!=Bkg) Corn4X=imX+2;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern21(TImage* img)
{
BYTE Bkg=0xFA;
int i,j,k,ii,jj;
int imX,imY;
int xp=0;
int yp=0;
int Max=-1;
int Sum=0;
BYTE* Ptrs[3];
for(i=0;i<3;i++) for(j=0;j<3;j++)
{
imX=Corn1X+i-1;
imY=Corn1Y+j-1;
for(k=0;k<3;k++) Ptrs[k]=PatGet(img,imY+k);
Sum=0;
for(ii=0;ii<3;ii++) for(jj=0;jj<9;jj++)
{
Sum=Sum+(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PL1Mask[ii][jj]);
Sum=Sum+(0xFF&PM1Mask[ii][jj])-(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PM1Mask[ii][jj]);
}
if(Sum>Max)
{
Max=Sum;
xp=i;
yp=j;
}
}
Corn1X=Corn1X+xp;
Corn1Y=Corn1Y+yp;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern22(TImage* img)
{
BYTE Bkg=0xFA;
int i,j,k,ii,jj;
int imX,imY;
int xp=0;
int yp=0;
int Max=-1;
int Sum=0;
BYTE* Ptrs[3];
for(i=0;i<3;i++) for(j=0;j<3;j++)
{
imX=Corn2X-i-1;
imY=Corn2Y+j-1;
for(k=0;k<3;k++) Ptrs[k]=PatGet(img,imY+k);
Sum=0;
for(ii=0;ii<3;ii++) for(jj=0;jj<9;jj++)
{
Sum=Sum+(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PL2Mask[ii][jj]);
Sum=Sum+(0xFF&PM2Mask[ii][jj])-(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PM2Mask[ii][jj]);
}
if(Sum>Max)
{
Max=Sum;
xp=i;
yp=j;
}
}
Corn2X=Corn2X-xp;
Corn2Y=Corn2Y+yp;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern23(TImage* img)
{
BYTE Bkg=0xFA;
int i,j,k,ii,jj;
int imX,imY;
int xp=0;
int yp=0;
int Max=-1;
int Sum=0;
BYTE* Ptrs[3];
for(i=0;i<3;i++) for(j=0;j<3;j++)
{
imX=Corn3X-i-1;
imY=Corn3Y-j-1;
for(k=0;k<3;k++) Ptrs[k]=PatGet(img,imY+k);
Sum=0;
for(ii=0;ii<3;ii++) for(jj=0;jj<9;jj++)
{
Sum=Sum+(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PL3Mask[ii][jj]);
Sum=Sum+(0xFF&PM3Mask[ii][jj])-(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PM3Mask[ii][jj]);
}
if(Sum>Max)
{
Max=Sum;
xp=i;
yp=j;
}
}
Corn3X=Corn3X-xp;
Corn3Y=Corn3Y-yp;
return true;
}
//---------------------------------------------------------------------------
bool __fastcall MapThread::Pattern24(TImage* img)
{
BYTE Bkg=0xFA;
int i,j,k,ii,jj;
int imX,imY;
int xp=0;
int yp=0;
int Max=-1;
int Sum=0;
BYTE* Ptrs[3];
for(i=0;i<3;i++) for(j=0;j<3;j++)
{
imX=Corn4X+i-1;
imY=Corn4Y-j-1;
for(k=0;k<3;k++) Ptrs[k]=PatGet(img,imY+k);
Sum=0;
for(ii=0;ii<3;ii++) for(jj=0;jj<9;jj++)
{
Sum=Sum+(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PL4Mask[ii][jj]);
Sum=Sum+(0xFF&PM4Mask[ii][jj])-(ByteGet(img,Ptrs[ii],imX*3+jj,Bkg)&PM4Mask[ii][jj]);
}
if(Sum>Max)
{
Max=Sum;
xp=i;
yp=j;
}
}
Corn4X=Corn4X+xp;
Corn4Y=Corn4Y-yp;
return true;
}


найденные углы потом надо отобразить и предложить пользователю подвинуть маркеры.

отрисовка увеличенных углов с маркером
скрытый текст: показать
//---------------------------------------------------------------------------
void __fastcall TForm1::CopyImage(TImage* img,TImage* Rimg,int CornX,int CornY)
{
int d=25;
int KR=4;
int x1=-d;
int x2=d;
int y1=-d;
int y2=d;
if(CornX<d) x1=-CornX;
if(CornY<d) y1=-CornY;
if(CornX>img->Picture->Width-d-1) x2=img->Picture->Width-CornX-1;
if(CornY>img->Picture->Height-d-1) y2=img->Picture->Height-CornY-1;
Rimg->Canvas->Brush->Color=0xD4D4FF;
Rimg->Canvas->Brush->Style = psSolid;
Rimg->Canvas->FillRect(Rect(0,0,202,202));
StretchBlt(Rimg->Canvas->Handle,KR*(d+x1),KR*(d+y1),KR*(x2-x1+1),KR*(y2-y1+1),img->Canvas->Handle,CornX+x1,CornY+y1,x2-x1+1,y2-y1+1,SRCCOPY);
Rimg->Canvas->Pen->Color=clRed;
Rimg->Canvas->Pen->Style=psSolid;
Rimg->Canvas->Rectangle(Rect(KR*d,KR*d,KR*(d+1),KR*(d+1)));
}


Функции перерисовки карты при передвижении маркеров
скрытый текст: показать
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
SetStretchBltMode(CI1->Canvas->Handle, STRETCH_DELETESCANS);
SetStretchBltMode(CI2->Canvas->Handle, STRETCH_DELETESCANS);
SetStretchBltMode(CI3->Canvas->Handle, STRETCH_DELETESCANS);
SetStretchBltMode(CI4->Canvas->Handle, STRETCH_DELETESCANS);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button5Click(TObject *Sender)
{
Form1->Corn1X--;
Form1->CopyImage(Form1->Img,CI1,Form1->Corn1X,Form1->Corn1Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button6Click(TObject *Sender)
{
Form1->Corn1X++;
Form1->CopyImage(Form1->Img,CI1,Form1->Corn1X,Form1->Corn1Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button3Click(TObject *Sender)
{
Form1->Corn1Y--;
Form1->CopyImage(Form1->Img,CI1,Form1->Corn1X,Form1->Corn1Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button4Click(TObject *Sender)
{
Form1->Corn1Y++;
Form1->CopyImage(Form1->Img,CI1,Form1->Corn1X,Form1->Corn1Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button7Click(TObject *Sender)
{
Form1->Corn2Y--;
Form1->CopyImage(Form1->Img,CI2,Form1->Corn2X,Form1->Corn2Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button9Click(TObject *Sender)
{
Form1->Corn2Y++;
Form1->CopyImage(Form1->Img,CI2,Form1->Corn2X,Form1->Corn2Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button8Click(TObject *Sender)
{
Form1->Corn2X--;
Form1->CopyImage(Form1->Img,CI2,Form1->Corn2X,Form1->Corn2Y);
}
//---------------------------------------------------------------------------

void __fastcall TForm3::Button10Click(TObject *Sender)
{
Form1->Corn2X++;
Form1->CopyImage(Form1->Img,CI2,Form1->Corn2X,Form1->Corn2Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button12Click(TObject *Sender)
{
Form1->Corn3X--;
Form1->CopyImage(Form1->Img,CI3,Form1->Corn3X,Form1->Corn3Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button14Click(TObject *Sender)
{
Form1->Corn3X++;
Form1->CopyImage(Form1->Img,CI3,Form1->Corn3X,Form1->Corn3Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button11Click(TObject *Sender)
{
Form1->Corn3Y--;
Form1->CopyImage(Form1->Img,CI3,Form1->Corn3X,Form1->Corn3Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button13Click(TObject *Sender)
{
Form1->Corn3Y++;
Form1->CopyImage(Form1->Img,CI3,Form1->Corn3X,Form1->Corn3Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button16Click(TObject *Sender)
{
Form1->Corn4X--;
Form1->CopyImage(Form1->Img,CI4,Form1->Corn4X,Form1->Corn4Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button18Click(TObject *Sender)
{
Form1->Corn4X++;
Form1->CopyImage(Form1->Img,CI4,Form1->Corn4X,Form1->Corn4Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button15Click(TObject *Sender)
{
Form1->Corn4Y--;
Form1->CopyImage(Form1->Img,CI4,Form1->Corn4X,Form1->Corn4Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button17Click(TObject *Sender)
{
Form1->Corn4Y++;
Form1->CopyImage(Form1->Img,CI4,Form1->Corn4X,Form1->Corn4Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::CI1MouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
Form1->Corn1X+=(X/4-25);
Form1->Corn1Y+=(Y/4-25);
Form1->CopyImage(Form1->Img,CI1,Form1->Corn1X,Form1->Corn1Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::CI2MouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
Form1->Corn2X+=(X/4-25);
Form1->Corn2Y+=(Y/4-25);
Form1->CopyImage(Form1->Img,CI2,Form1->Corn2X,Form1->Corn2Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::CI4MouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
Form1->Corn4X+=(X/4-25);
Form1->Corn4Y+=(Y/4-25);
Form1->CopyImage(Form1->Img,CI4,Form1->Corn4X,Form1->Corn4Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::CI3MouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
Form1->Corn3X+=(X/4-25);
Form1->Corn3Y+=(Y/4-25);
Form1->CopyImage(Form1->Img,CI3,Form1->Corn3X,Form1->Corn3Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::SVBClick(TObject *Sender)
{
Form1->Corners=true;
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::SKBClick(TObject *Sender)
{
Form1->Corners=false;
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormShow(TObject *Sender)
{
Form1->CopyImage(Form1->Img,CI1,Form1->Corn1X,Form1->Corn1Y);
Form1->CopyImage(Form1->Img,CI2,Form1->Corn2X,Form1->Corn2Y);
Form1->CopyImage(Form1->Img,CI3,Form1->Corn3X,Form1->Corn3Y);
Form1->CopyImage(Form1->Img,CI4,Form1->Corn4X,Form1->Corn4Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::LMDButton1Click(TObject *Sender)
{
if(Form1->Running)
{
Form1->t->Terminate();
Form1->t->WaitFor();
}
Close();
}

За это сообщение автора DJ VK поблагодарил:
igel72 (21 ноя 2011, 19:15)
Рейтинг: 5.26%
 
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 323 раз.

След.

Вернуться в SAS.Планета

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1