SASGIS

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

Автоматическая привязка растровых номенклатурных карт

Обсуждение различной информации связанной с картографией в САСе, а также сторонние программные продукты для связки с САСом

Модератор: Tolik

Автоматическая привязка растровых номенклатурных карт

Сообщение DJ VK » 21 апр 2011, 09:17

Алгоритмы поиска углов для автоматической привязки
Хочу расписать два метода поиска углов черного прямоугольника, вписанного в растровую карту.

Метод первый. поиск углов по несовпадению с фоном.
грубый метод, но можно использовать его для предварительной оценки, а затем более точный метод.

используем паттерн предполагающий не сильный наклон сторон прямоугольника.
Код: Выделить всё
фон фон фон фон фон фон
фон фон фон фон фон фон
фон фон фон ... ... ...
фон фон ... ЦВТ ... ...
фон фон ... ... ... ...
фон фон ... ... ... ...

при совпадении с паттерном считаем точку с надписью ЦВТ углом. ЦВЕТ в этой точке должен отличаться от фонового, а при грязном фоне желательно еще задать порог

Создаем маски для трех каналов цвета и 4х углов
Код: Выделить всё
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}};


искать будем в пределах 500 пикселов от углов изображения на примере фона 0xFF в каждом цветовом канале

Код: Выделить всё
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>500) {x=-3;y++;}
    if(y>500) return false;
  }
  x=w-3;y=-3;
  while(!Pattern12(img,x,y))
  {
    x--;
    if(x<w-500) {x=w-3;y++;}
    if(y>500) return false;
  }
  x=w-3;y=h-3;
  while(!Pattern13(img,x,y))
  {
    x--;
    if(x<w-500) {x=w-3;y--;}
    if(y<h-500) return false;
  }
  x=-3;y=h-3;
  while(!Pattern14(img,x,y))
  {
    x++;
    if(x>500) {x=-3;y--;}
    if(y<h-500) return false;
  }
  Mem->Lines->Add("("+IntToStr(Corn1X)+","+IntToStr(Corn1Y)+"),("
                  +IntToStr(Corn2X)+","+IntToStr(Corn2Y)+"),("
                  +IntToStr(Corn3X)+","+IntToStr(Corn3Y)+"),("
                  +IntToStr(Corn4X)+","+IntToStr(Corn4Y)+")");

  Pattern21(img);
  Pattern22(img);
  Pattern23(img);
  Pattern24(img);

   Mem->Lines->Add("("+IntToStr(Corn1X)+","+IntToStr(Corn1Y)+"),("
                  +IntToStr(Corn2X)+","+IntToStr(Corn2Y)+"),("
                  +IntToStr(Corn3X)+","+IntToStr(Corn3Y)+"),("
                  +IntToStr(Corn4X)+","+IntToStr(Corn4Y)+")");

  return true;

Придется залезть за пределы изображения, иначе мы не найдем углы в районе 1-3 пикселов от края. будем в этом случае принимать цвет за фон.
Код: Выделить всё
//---------------------------------------------------------------------------
BYTE* __fastcall TForm1::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 TForm1::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 TForm1::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 TForm1::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 TForm1::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 TForm1::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;
}


Здесь приведена последняя версия кода, убирающего большинство ошибок, когда изображение вылезает за рамки.

Если фон не однотонный, а грязный надо сравнивать не точно цвета а задавать доверительный интервал, но это уже другая история.
Последний раз редактировалось DJ VK 27 апр 2011, 13:56, всего редактировалось 3 раз(а).
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 323 раз.

Re: Автоматическая привязка растровых номенклатурных карт

Сообщение DJ VK » 21 апр 2011, 09:23

Метод 2. Поиск черного угла довольно хороший метод, но требует индивидуального подходка к исходной карте. Паттерн подстраивается под определенную толщину угла (в пикселях).

Попробуем следующий паттерн, для угла в 1 пиксел
Код: Выделить всё
свет .... свет
.... темн темн
свет темн ....

линии могут выезжать за пределы угла, поэтому 2 наружные точки не проверяем.
будем складывать цвета в точках СВЕТ, прибавлять (255-цвет) в точках ТЕМН, и искать максимальную сумму.
Воспользуемся для наведения первым методом, а воторой будем использовать в окрестностях.

Центр паттерна принимаем за угол.

Маски для плюсовки
Код: Выделить всё
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}};


Уточним уже найденные углы
Код: Выделить всё
//---------------------------------------------------------------------------
bool __fastcall TForm1::Pattern21(TImage* img)
{
  BYTE Bkg=0xFF;
  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 TForm1::Pattern22(TImage* img)
{
  BYTE Bkg=0xFF;
  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 TForm1::Pattern23(TImage* img)
{
  BYTE Bkg=0xFF;
  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 TForm1::Pattern24(TImage* img)
{
  BYTE Bkg=0xFF;
  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;
}


После выполнения кода позиции углов уточнились. :!:
На этой веселой ноте и завершим.
Последний раз редактировалось DJ VK 25 апр 2011, 22:06, всего редактировалось 1 раз.
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 323 раз.

Re: Автоматическая привязка растровых номенклатурных карт

Сообщение DJ VK » 25 апр 2011, 22:01

Создание привязки ozi

Код: Выделить всё
void __fastcall TForm1::CreateOZI(AnsiString File)
{
  int GrX1,GrX2,GrY1,GrY2;
  int MinX1,MinX2,MinY1,MinY2;
  AnsiString FN=ExtractFileName(File);

  GrX1= вычисляем любым из известных ВАМ методов градусы и минуты
  GrX2=
  GrY1=
  GrY2=
  MinX1=
  MinX2=
  MinY1=
  MinY2=

  также могут понадобиться функции
  GetXYstr() GetGRstr() GetMINstr() для перевода координат углов и номенклатуры в строки

  Mem->Text="OziExplorer Map Data File Version 2.2\r\n";
  Mem->Lines->Add(FN);
  Mem->Lines->Add(FN);
  Mem->Lines->Add("1 ,Map Code,");
  Mem->Lines->Add("Pulkovo 1942 (1),WGS 84, 0.0000, 0.0000,WGS 84");
  Mem->Lines->Add("Reserved 1");
  Mem->Lines->Add("Reserved 2");
  Mem->Lines->Add("Magnetic Variation,,,E");
  Mem->Lines->Add("Map Projection,Latitude/Longitude,PolyCal,No,AutoCalOnly,No,BSBUseWPX,No");
  Mem->Lines->Add("Point01,xy,"+GetXYstr(Corn1X)+","+GetXYstr(Corn1Y)+",in, deg,"+GetGRstr(GrY2)+","+GetMINstr(MinY2,true,false)+",N,"+GetGRstr(GrX1)+","+GetMINstr(MinX1,true,true)+",E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point02,xy,"+GetXYstr(Corn2X)+","+GetXYstr(Corn2Y)+",in, deg,"+GetGRstr(GrY2)+","+GetMINstr(MinY2,true,false)+",N,"+GetGRstr(GrX2)+","+GetMINstr(MinX2,true,true)+",E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point03,xy,"+GetXYstr(Corn3X)+","+GetXYstr(Corn3Y)+",in, deg,"+GetGRstr(GrY1)+","+GetMINstr(MinY1,true,false)+",N,"+GetGRstr(GrX2)+","+GetMINstr(MinX2,true,true)+",E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point04,xy,"+GetXYstr(Corn4X)+","+GetXYstr(Corn4Y)+",in, deg,"+GetGRstr(GrY1)+","+GetMINstr(MinY1,true,false)+",N,"+GetGRstr(GrX1)+","+GetMINstr(MinX1,true,true)+",E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point05,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point06,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point07,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point08,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point09,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point10,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point11,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point12,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point13,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point14,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point15,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point16,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point17,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point18,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point19,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point20,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point21,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point22,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point23,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point24,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point25,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point26,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point27,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point28,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point29,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Point30,xy,     ,     ,in, deg,    ,        ,N,    ,        ,E, grid,   ,           ,           ,N");
  Mem->Lines->Add("Projection Setup,,,,,,,,,,");
  Mem->Lines->Add("Map Feature = MF ; Map Comment = MC     These follow if they exist");
  Mem->Lines->Add("Track File = TF      These follow if they exist");
  Mem->Lines->Add("Moving Map Parameters = MM?    These follow if they exist");
  Mem->Lines->Add("MM0,No");
  Mem->Lines->Add("MMPNUM,4");
  Mem->Lines->Add("MMPXY,1,"+IntToStr(Corn1X)+","+IntToStr(Corn1Y));
  Mem->Lines->Add("MMPXY,2,"+IntToStr(Corn2X)+","+IntToStr(Corn2Y));
  Mem->Lines->Add("MMPXY,3,"+IntToStr(Corn3X)+","+IntToStr(Corn3Y));
  Mem->Lines->Add("MMPXY,4,"+IntToStr(Corn4X)+","+IntToStr(Corn4Y));
  Mem->Lines->Add("MMPLL,1,"+GetGRstr(GrX1)+"."+GetMINstr(MinX1,false,true)+","+GetGRstr(GrY2)+"."+GetMINstr(MinY2,false,false));
  Mem->Lines->Add("MMPLL,2,"+GetGRstr(GrX2)+"."+GetMINstr(MinX2,false,true)+","+GetGRstr(GrY2)+"."+GetMINstr(MinY2,false,false));
  Mem->Lines->Add("MMPLL,3,"+GetGRstr(GrX2)+"."+GetMINstr(MinX2,false,true)+","+GetGRstr(GrY1)+"."+GetMINstr(MinY1,false,false));
  Mem->Lines->Add("MMPLL,4,"+GetGRstr(GrX1)+"."+GetMINstr(MinX1,false,true)+","+GetGRstr(GrY1)+"."+GetMINstr(MinY1,false,false));
  Mem->Lines->Add("MM1B,2.265585");
  Mem->Lines->Add("MOP,Map Open Position,0,0");
  Mem->Lines->Add("IWH,Map Image Width/Height,4096,4096");
}


Создание привязки GlobalMapper

Код: Выделить всё
//---------------------------------------------------------------------------
void __fastcall TForm1::InitGM(AnsiString File)
{
//file=D:\ggc\Relic\ggcozi\111.gmw
  GM->Lines->Clear();
  GM->Lines->Add("GLOBAL_MAPPER_SCRIPT VERSION=\"1.00\" FILENAME=\""+File+"\"");
  GM->Lines->Add("UNLOAD_ALL");
  GM->Lines->Add("DEFINE_PROJ PROJ_NAME=\"GEO_S-42_PULKOVO_1942\"");
  GM->Lines->Add("Projection     GEOGRAPHIC");
  GM->Lines->Add("Datum          PULKOVO");
  GM->Lines->Add("Zunits         NO");
  GM->Lines->Add("Units          DD");
  GM->Lines->Add("Xshift         0.000000");
  GM->Lines->Add("Yshift         0.000000");
  GM->Lines->Add("Parameters");
  GM->Lines->Add("0 0 0.000 /* longitude of center of projection");
  GM->Lines->Add("");
  GM->Lines->Add("END_DEFINE_PROJ");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateGM(AnsiString File)
{
  char FNC[50];
  char Kv1,Kv4,Kv5;
  int Kv2,Kv3;
  int GrX1,GrX2,GrY1,GrY2;
  int MinX1,MinX2,MinY1,MinY2;
  int NumX,NumY;
  AnsiString C1X,C1Y,C2X,C2Y,C3X,C3Y,C4X,C4Y;
  AnsiString N1X,N1Y,N2X,N2Y;
  AnsiString M1X,M1Y,M2X,M2Y;
  AnsiString FN=ExtractFileName(File);
  NumX=   ! порядковый номер нашего квадрата (северная широта, восточная долгота)
  NumY=    ! с шагом в 1\8 градуса по горизонтали и 1\12 градуса по вертикали 
  GrX1=NumX/8;
  GrX2=(NumX+N)/8;  N - шаг, равен масштабу деленному на 25000
  GrY1=NumY/12;
  GrY2=(NumY+N)/12;
  MinX1=NumX % 8;
  MinX2=(NumX+N) % 8;
  MinY1=NumY % 12;
  MinY2=(NumY+N) % 12;
  C1X=IntToStr(Corn1X)+".0000000";
  C1Y=IntToStr(Corn1Y)+".0000000";
  C2X=IntToStr(Corn2X)+".0000000";
  C2Y=IntToStr(Corn2Y)+".0000000";
  C3X=IntToStr(Corn3X)+".0000000";
  C3Y=IntToStr(Corn3Y)+".0000000";
  C4X=IntToStr(Corn4X)+".0000000";
  C4Y=IntToStr(Corn4Y)+".0000000";
  N1X=IntToStr(GrX1)+"."+GetFracStr(MinX1,10,true);
  N2X=IntToStr(GrX2)+"."+GetFracStr(MinX2,10,true);
  N1Y=IntToStr(GrY1)+"."+GetFracStr(MinY1,10,false);
  N2Y=IntToStr(GrY2)+"."+GetFracStr(MinY2,10,false);
  M1X=IntToStr(GrX1)+"."+GetFracStr(MinX1,7,true);
  M2X=IntToStr(GrX2)+"."+GetFracStr(MinX2,7,true);
  M1Y=IntToStr(GrY1)+"."+GetFracStr(MinY1,7,false);
  M2Y=IntToStr(GrY2)+"."+GetFracStr(MinY2,7,false);
  GM->Lines->Add("DEFINE_SHAPE SHAPE_NAME=\"AUTO_CROP_POLY\"");
  GM->Lines->Add("   "+N1X+","+N2Y);
  GM->Lines->Add("   "+N2X+","+N2Y);
  GM->Lines->Add("   "+N2X+","+N1Y);
  GM->Lines->Add("   "+N1X+","+N1Y);
  GM->Lines->Add("END_DEFINE_SHAPE");
  GM->Lines->Add("IMPORT FILENAME=\""+File+"\" TYPE=\"PNG\" PROJ_NAME=\"GEO_S-42_PULKOVO_1942\" \\");
  GM->Lines->Add("    RECTIFY=\"Automatic\" GCP=\"POINT01,"+C1X+","+C1Y+","+M1X+","+M2Y+"\" GCP=\"POINT02,"+C2X+","+C2Y+","+M2X+","+M2Y+"\" \\");
  GM->Lines->Add("    GCP=\"POINT03,"+C3X+","+C3Y+","+M2X+","+M1Y+"\" GCP=\"POINT04,"+C4X+","+C4Y+","+M1X+","+M1Y+"\" \\");
  GM->Lines->Add("    LABEL_FIELD=\"\" SAMPLING_METHOD=\"NEAREST_NEIGHBOR\" AUTO_CONTRAST=\"NO\" CONTRAST_SHARED=\"YES\" \\");
  GM->Lines->Add("    CONTRAST_MODE=\"NONE\" CLIP_COLLAR=\"AUTO\" CLIP_COLLAR_POLY_AUTO=\"AUTO_CROP_POLY\" TEXTURE_MAP=\"NO\"");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SaveGM(AnsiString File)
{
  GM->Lines->Add("LOAD_PROJECTION PROJ_NAME=\"GEO_S-42_PULKOVO_1942\"");
  GM->Lines->Add("SET_VIEW GLOBAL_BOUNDS=\"36.0000000000,54.0000000000,50.0000000000,57.0000000000\"");
  GM->Lines->Add("");
  GM->Lines->Add("/************ DEFINE MAP LAYOUT *************/");
  GM->Lines->Add("");
  GM->Lines->Add("MAP_LAYOUT");
  GM->Lines->Add("ElevLegendBgColor=16777215");
  GM->Lines->Add("ElevLegendTranslucency=384");
  GM->Lines->Add("ElevLegendFont=~0~534799372~0.000~0~0");
  GM->Lines->Add("ElevLegendVisible=1");
  GM->Lines->Add("ElevLegendDisplayType=1");
  GM->Lines->Add("ElevLegendDisplayUnits=1");
  GM->Lines->Add("ElevLegendDisplayUnitsStr=");
  GM->Lines->Add("");
  GM->Lines->Add("DEFINE_PROJ_ELEV_LEGEND");
  GM->Lines->Add("Projection     Fixed Screen Position");
  GM->Lines->Add("Datum          D_ADINDAN");
  GM->Lines->Add("Zunits         NO");
  GM->Lines->Add("Units          RADIAN");
  GM->Lines->Add("Xshift         0.000000");
  GM->Lines->Add("Yshift         0.000000");
  GM->Lines->Add("Parameters");
  GM->Lines->Add("  0.000000000 /* horz offset");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* horz offset type (0 - left, 1 - right, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* horz offset value type (0 - inches, 1 - % width, 2 - deg lon)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset type (0 - top, 1 - bottom, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset value type (0 - inches, 1 - % width, 2 - deg lat)");
  GM->Lines->Add("");
  GM->Lines->Add("100.000000000 /* size value");
  GM->Lines->Add("");
  GM->Lines->Add("2.000000000 /* size value type (0 - % width, 1 - % height, 2 - pixel)");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* always on top");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* shrink to fit");
  GM->Lines->Add("");
  GM->Lines->Add("END_DEFINE_PROJ");
  GM->Lines->Add("");
  GM->Lines->Add("MapLegendType=0");
  GM->Lines->Add("MapLegendBgColor=16776959");
  GM->Lines->Add("MapLegendTranslucency=512");
  GM->Lines->Add("MapLegendFont=~0~534799368~0.000~0~0");
  GM->Lines->Add("MapLegendFooterFont=~0~534799372~0.000~0~0");
  GM->Lines->Add("MapLegendHeaderFont=~0~534799372~0.000~0~0");
  GM->Lines->Add("MapLegendHeader=");
  GM->Lines->Add("MapLegendFooter=");
  GM->Lines->Add("MapLegendNumColumns=1");
  GM->Lines->Add("MapLegendLabelAttr=");
  GM->Lines->Add("");
  GM->Lines->Add("DEFINE_PROJ_MAP_LEGEND");
  GM->Lines->Add("Projection     Fixed Screen Position");
  GM->Lines->Add("Datum          D_ADINDAN");
  GM->Lines->Add("Zunits         NO");
  GM->Lines->Add("Units          RADIAN");
  GM->Lines->Add("Xshift         0.000000");
  GM->Lines->Add("Yshift         0.000000");
  GM->Lines->Add("Parameters");
  GM->Lines->Add("0.000000000 /* horz offset");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* horz offset type (0 - left, 1 - right, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* horz offset value type (0 - inches, 1 - % width, 2 - deg lon)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* vert offset type (0 - top, 1 - bottom, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset value type (0 - inches, 1 - % width, 2 - deg lat)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* size value");
  GM->Lines->Add("");
  GM->Lines->Add("2.000000000 /* size value type (0 - % width, 1 - % height, 2 - pixel)");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* always on top");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* shrink to fit");
  GM->Lines->Add("");
  GM->Lines->Add("END_DEFINE_PROJ");
  GM->Lines->Add("");
  GM->Lines->Add("NorthArrowSymbol=");
  GM->Lines->Add("NorthArrowSymbolScale=1.000000");
  GM->Lines->Add("NorthArrowTranslucency=384");
  GM->Lines->Add("");
  GM->Lines->Add("DEFINE_PROJ_NORTH_ARROW");
  GM->Lines->Add("Projection     Fixed Screen Position");
  GM->Lines->Add("Datum          D_ADINDAN");
  GM->Lines->Add("Zunits         NO");
  GM->Lines->Add("Units          RADIAN");
  GM->Lines->Add("Xshift         0.000000");
  GM->Lines->Add("Yshift         0.000000");
  GM->Lines->Add("Parameters");
  GM->Lines->Add("0.000000000 /* horz offset");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* horz offset type (0 - left, 1 - right, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* horz offset value type (0 - inches, 1 - % width, 2 - deg lon)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset type (0 - top, 1 - bottom, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset value type (0 - inches, 1 - % width, 2 - deg lat)");
  GM->Lines->Add("");
  GM->Lines->Add("100.000000000 /* size value");
  GM->Lines->Add("");
  GM->Lines->Add("2.000000000 /* size value type (0 - % width, 1 - % height, 2 - pixel)");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* always on top");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* shrink to fit");
  GM->Lines->Add("");
  GM->Lines->Add("END_DEFINE_PROJ");
  GM->Lines->Add("");
  GM->Lines->Add("ScaleBarBgColor=16777215");
  GM->Lines->Add("ScaleBarTranslucency=384");
  GM->Lines->Add("ScaleBarFont=~0~534799372~0.000~0~0");
  GM->Lines->Add("ScaleVisible=1");
  GM->Lines->Add("");
  GM->Lines->Add("DEFINE_PROJ_SCALE");
  GM->Lines->Add("Projection     Fixed Screen Position");
  GM->Lines->Add("Datum          D_ADINDAN");
  GM->Lines->Add("Zunits         NO");
  GM->Lines->Add("Units          RADIAN");
  GM->Lines->Add("Xshift         0.000000");
  GM->Lines->Add("Yshift         0.000000");
  GM->Lines->Add("Parameters");
  GM->Lines->Add("0.000000000 /* horz offset");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* horz offset type (0 - left, 1 - right, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* horz offset value type (0 - inches, 1 - % width, 2 - deg lon)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* vert offset type (0 - top, 1 - bottom, 2 - center)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* vert offset value type (0 - inches, 1 - % width, 2 - deg lat)");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* size value");
  GM->Lines->Add("");
  GM->Lines->Add("2.000000000 /* size value type (0 - % width, 1 - % height, 2 - pixel)");
  GM->Lines->Add("");
  GM->Lines->Add("1.000000000 /* always on top");
  GM->Lines->Add("");
  GM->Lines->Add("0.000000000 /* shrink to fit");
  GM->Lines->Add("");
  GM->Lines->Add("END_DEFINE_PROJ");
  GM->Lines->Add("");
  GM->Lines->Add("MarginLeft=0.750000");
  GM->Lines->Add("MarginRight=0.750000");
  GM->Lines->Add("MarginTop=0.750000");
  GM->Lines->Add("MarginBottom=0.750000");
  GM->Lines->Add("MarginUnits=0");
  GM->Lines->Add("MarginEnabled=0");
  GM->Lines->Add("MarginColor=16777215");
  GM->Lines->Add("GridDisplayType=0");
  GM->Lines->Add("GridDisplayShowAll=0");
  GM->Lines->Add("GridSpacingLatLon=0.00000000000000000");
  GM->Lines->Add("GridSpacingProjected=0.00000000000000000");
  GM->Lines->Add("END_MAP_LAYOUT");
  GM->Lines->SaveToFile(File);
  GM->Lines->Clear();
}
//---------------------------------------------------------------------------
AnsiString __fastcall TForm1::GetFracStr(int Min,int Signs,bool Div8)
{
  AnsiString Str;
  if(Div8)
  {
    Str=IntToStr(125*Min);
    while(Str.Length()<Signs) Str=Str+"0";
  }
  else
  {
    Str=IntToStr(250*Min/3);
    while(Str.Length()<3) Str=Str+"0";
    while(Str.Length()<Signs-1) Str=Str+Str.SubString(3,1);
    if(Str.SubString(3,1)=="6") Str=Str+"7";
    else Str=Str+Str.SubString(3,1);
  }
  return Str;
}
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 323 раз.

Re: Автоматическая привязка растровых номенклатурных карт

Сообщение DJ VK » 27 апр 2011, 14:16

Ручная коррекция привязки
SetStretchBltMode(CI1->Canvas->Handle, STRETCH_DELETESCANS);
SetStretchBltMode(CI2->Canvas->Handle, STRETCH_DELETESCANS);
SetStretchBltMode(CI3->Canvas->Handle, STRETCH_DELETESCANS);
SetStretchBltMode(CI4->Canvas->Handle, STRETCH_DELETESCANS);

отрисовка 4х углов (увеличение 4х) в 4 объекта TImage
Код: Выделить всё
//---------------------------------------------------------------------------
void __fastcall TForm1::ShowCorners(TImage* img)
{
  CopyImage(img,CI1,Corn1X,Corn1Y);
  CopyImage(img,CI2,Corn2X,Corn2Y);
  CopyImage(img,CI3,Corn3X,Corn3Y);
  CopyImage(img,CI4,Corn4X,Corn4Y);
  SVB->Enabled=true; отобразить кнопки "применить" и "пропустить"
  SKB->Enabled=true;
  Form1->Refresh();
}
//---------------------------------------------------------------------------
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)));
}

Далее делаем кнопки для движения позиции угла и ставим на них примерно такие функции обработки.
Код: Выделить всё
Corn1X--;
  CopyImage(Img,CI1,Corn1X,Corn1Y);

Код: Выделить всё
  Corn1X++;
  CopyImage(Img,CI1,Corn1X,Corn1Y);
Вложения
Example.jpg
Аватара пользователя
DJ VK
Гуру
 
Сообщения: 1468
Зарегистрирован: 16 апр 2009, 13:57
Откуда: 8 км. от МКАД
Благодарил (а): 82 раз.
Поблагодарили: 323 раз.


Вернуться в Другие программы

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

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