Optymalizacja programu

Odpowiedz Nowy wątek
2011-08-27 09:11
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();
 
                                                         }
                      }
  } 
edytowany 1x, ostatnio: madmike, 2011-08-27 10:33

Pozostało 580 znaków

2011-08-27 09:24
Rev
1

Słowa kluczowe: scanline wskaźnik google.


Pozostało 580 znaków

2011-08-27 10:00
0

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

Pozostało 580 znaków

2011-08-27 10:16
1

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


Pozostało 580 znaków

2011-08-27 10:35
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();

                                    }
                       }
                       }

Pozostało 580 znaków

2011-08-27 10:44
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.


Pozostało 580 znaków

2011-08-27 11:07
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();
 
                                                       }
                                                }
                                                }
 
edytowany 1x, ostatnio: Kemot81, 2011-08-27 11:10
ScanLine nie ma prawa być wolniejsze... - Patryk27 2011-08-27 11:19
"(INC(x) to w c x++)" -> Wiem, ale w Delphi taki kod: "Wskaźnik := Wskaźnik + 1" nie zadziała. Trzeba użyć Inc. W C++ nie wiem... - Patryk27 2011-08-27 11:20
A może by tak refresha poza pętlą, a tam tylko użyć boola? - Razi91 2011-08-27 11:50

Pozostało 580 znaków

2011-08-27 12:15
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??

edytowany 1x, ostatnio: Kemot81, 2011-08-27 12:17

Pozostało 580 znaków

2011-08-27 23:47
Kemot81
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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