Optymalizacja programu

0

Napisalem program który wyszukuje w obrazie odpowiednie kolory i ich pozycje lecz nie jestem zadowolony z szybkosci jego działania. Jeżeli ma ktoś jakies propozycje na przyspieszenie jego działania prosze o pomoc.

    TCanvas &PulpitCanvas = *new TCanvas();
    Graphics::TBitmap *Bmp = new Graphics::TBitmap;
    TColor color;
    Bmp->Width = StrToInt(Edit4->Text)-StrToInt(Edit3->Text);
    Bmp->Height = StrToInt(Edit6->Text)-StrToInt(Edit5->Text);
    Bmp->Canvas->CopyRect(Rect(0,0, Bmp->Width, Bmp->Height), &PulpitCanvas,
                          Rect(StrToInt(Edit3->Text), StrToInt(Edit5->Text), StrToInt(Edit4->Text), StrToInt(Edit6->Text)));

  oknoy=Bmp->Height;
  oknox=Bmp->Width;

  for(y=0;y<oknoy;y++)
  for(x=0;x<oknox;x++)
  {

        R=GetRValue(Bmp->Canvas->Pixels[x][y]);

             if (R==226){   

                            G=GetGValue(Bmp->Canvas->Pixels[x][y]); //pobieranie zielonego koloru do zmienne
                            B=GetBValue(Bmp->Canvas->Pixels[x][y]); //pobieranie niebieskiego koloru do zmiennej
                            if (G==235) if (B==247)
                                                            {

                                                             Label17->Caption="KOLOR 1";
                                                            Form1->Refresh();
                                                           }
                           }

          if (R==204){  
                           G=GetGValue(Bmp->Canvas->Pixels[x][y]); //pobieranie zielonego koloru do zmiennej
                           B=GetBValue(Bmp->Canvas->Pixels[x][y]); //pobieranie niebieskiego koloru do zmiennej
                           if (G==0) if (B==0)
                                                     {

                                                       Label17->Caption="KOLOR 2";
                                                       Form1->Refresh();

                                                     }
                       }

           if(R==252)
                        {  
                          G=GetGValue(Bmp->Canvas->Pixels[x][y]); //pobieranie zielonego koloru do zmiennej
                          B=GetBValue(Bmp->Canvas->Pixels[x][y]); //pobieranie niebieskiego koloru do zmiennej
                          if (G==253) if (B==255)
                                                         {

                                                          Label17->Caption="KOLOR3";
                                                         Form1->Refresh();

                                                         }
                      }
  } 
1

Słowa kluczowe: scanline wskaźnik google.

0

Czytalem o tym ale jakos nie moge sobie tego przetrawic moglbys mi napisac odpowiednik petli??

1

Please, masz tysiące przykładów w internecie.
Poszukaj!

0

Oto przerobka na scanline mysle ze bedzie dzialac.

RGBQUAD *wierszEfc;

for(int y = 0; y < oknoy; y++) {
wierszEfc = (RGBQUAD *) Bmp->ScanLine[y];
for(int x = 0; x < oknox; x++) {

                 if (wierszEfc[x].rgbRed==204) if (wierszEfc[x].rgbGreen==0) if (wierszEfc[x].rgbBlue ==0)
                                    {

                                    Label17->Caption="KOLOR1";
                                    Form1->Refresh();

                                    }
                       }
                       }
0

1.Dodawaj kod w odpowiednich znacznikach.
2.

RGBQUAD *wierszEfc;

 for(int y = 0; y < oknoy; y++) {
 wierszEfc = (RGBQUAD *) Bmp->ScanLine[y];
 for(int x = 0; x < oknox; x++) {

                      if (wierszEfc[x].rgbRed==204) if (wierszEfc[x].rgbGreen==0) if (wierszEfc[x].rgbBlue ==0)
                                         {

                                         Label17->Caption="KOLOR1";
                                         Form1->Refresh();

                                         }
                            }
                            }

ZTCW, ScanLine nie zwraca tablicy.
Spróbuj coś takiego:

RGBQUAD *wierszEfc;

 for(int y = 0; y < oknoy; y++) {
 wierszEfc = (RGBQUAD *) Bmp->ScanLine[y];
 for(int x = 0; x < oknox; x++) {

                      if (wierszEfc.rgbRed==204) if (wierszEfc.rgbGreen==0) if (wierszEfc.rgbBlue ==0)
                                         {

                                         Label17->Caption="KOLOR1";
                                         Form1->Refresh();

                                         }
                            }
Inc(X); //Nie wiem, jak to będzie w C++; może tak samo, może nie...
                            }

Mniej-więcej coś takiego.

0

Niestety scanline jest wolniejsze albo niepoprawnie to zrobilem: (INC(x) to w c x++)

  1. Pixels:

  for(y=0;y<oknoy;y=y+skok)
  for(x=0;x<oknox;x=x+skok)
  {

        R=GetRValue(Bmp->Canvas->Pixels[x][y]);

             if (R==226){   

                              G=GetGValue(Bmp->Canvas->Pixels[x][y]); //pobieranie zielonego koloru do zmienne
                              B=GetBValue(Bmp->Canvas->Pixels[x][y]); //pobieranie niebieskiego koloru do zmiennej
                              if (G==235) if (B==247)
                                                            {
                                                             Label17->Caption="KOLOR 1";
                                                             Form1->Refresh();
                                                             }
                             }
 }

2: SCANLINE

RGBQUAD *wierszEfc;

for(int y = 0; y < oknoy; y=y+skok) {
wierszEfc = (RGBQUAD *) Bmp->ScanLine[y];
for(int x = 0; x < oknox; x=x+skok) {

                                                   if (wierszEfc[x].rgbRed==226) if (wierszEfc[x].rgbGreen==235) if (wierszEfc[x].rgbBlue ==247)
                                                       {

                                                        Label17->Caption="KOLOR1";
                                                        Form1->Refresh();

                                                       }
                                                }
                                                }
0

Label17->Caption="KOLOR1";
Form1->Refresh();

W programie mam wyciagniete poz petle operacje wykonywane na Formie bo wiem jak one sa powolne.
Czym wiecej warunków IF szukajacych kolory w obrazie tym wolniejsza petla i czas proporcjonalnie do liczby szukanych kolorów wzrasta.
po prostu Zbyt wolno to działa czytam o tym scanline ale pierwszy test wykazal ze przegrywa myśle ze przez to ze szukany w metodzie Pixels jest
R=GetRValue(Bmp->Canvas->Pixels[x][y]);i potem warunki if. Moze zna ktos lepsza implementacje szukania kolorów za pomoca scanline??

0

Znalazlem bład brakowalo deklaracji
Bmp->PixelFormat = pf32bit;
teraz scanline działa pieknie dzieki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0