Поиск шаблонных изображений внутри другого изображения

Вообщем программа делает скриншот другой программы и ищет на скрине заранее созданные мелкие изображения, результат работы, ответ найден мелкое изображение на скриншоте или же нет, я реализовал лобовой подход с перебором всех пикселей шаблона с проходом по всему изображению, но скорость очень низкая, как можно ускорить алгоритм?
bool CheckPixel(int pix1, int pix2) {
int R1 = 0, G1 = 0, B1 = 0, R2 = 0, G2 = 0, B2 = 0;
    R1 = GetRValue(pix1);
    G1 = GetGValue(pix1);
    B1 = GetBValue(pix1);
 
    R2 = GetRValue(pix2);
    G2 = GetGValue(pix2);
    B2 = GetBValue(pix2);
 
    ****** pixelDifference =
        sqrt((******)(R1 - R2) * (R1 - R2) + (******)(G1 - G2) * (G1 - G2) +
        (******)(B1 - B2) * (B1 - B2));
 
        if (pixelDifference > 36)
                return false;
 
    return true;
}
 
bool CheckImage(int h, int w) {
    int i = 0, j = 0, mh = 0, mw = 0;
    mh = h + Shablon->Height - 1;
    mw = w + Shablon->Width - 1;
 
 
    for (i = h; i < mh; i++)
        for (j = w; j < mw; j++) {
 
 
       if(!CheckPixel(Skrin->Canvas->Pixels[j][i],Shablon->Canvas->Pixels[j - w][i - h]))
        return false;
 
        }
 
    return true;
}
 
bool FindShablon(String name){
 
    try{
        HDC hdc = GetWindowDC(hWnd);
    std::auto_ptr<TCanvas>C(new TCanvas);
    C->Handle = hdc;
    TRect Rect;
    GetWindowRect(hWnd, &Rect);
    int w = Rect.Width();
    int h = Rect.Height();
    Skrin->Width = w;
    Skrin->Height = h;
    Skrin->Canvas->CopyMode = cmSrcCopy;
    Skrin->Canvas->CopyRect(TRect(0, 0, w, h), C.get(), TRect(0, 0, w, h));
    ReleaseDC(hWnd, hdc);
 
    //Shablon->LoadFromFile(name);
    if(name=="glob.bmp")
    {
    pms1->Position=0;
    Shablon->LoadFromStream(pms1);
    }
    if(name=="lup.bmp")
        {
    pms2->Position=0;
    Shablon->LoadFromStream(pms2);
    }
    if(name=="Mem.bmp")
        {
    pms3->Position=0;
    Shablon->LoadFromStream(pms3);
    }
    if(name=="mes.bmp")
        {
    pms4->Position=0;
    Shablon->LoadFromStream(pms4);
    }
 
    int sWidth = Shablon->Width;
    int sHeight = Shablon->Height;
    int skWidth = Skrin->Width;
    int skHeight = Skrin->Height;
 
 
         int pix0=Shablon->Canvas->Pixels[0][0];
    for (int i = 0; i < skHeight - sHeight; i++)
        for (int j = 0; j < skWidth - sWidth; j++)
            if (Skrin->Canvas->Pixels[j][i]!= -1 && CheckPixel(Skrin->Canvas->Pixels[j][i],pix0))
            {
                if (CheckImage(i, j))
                {
                    return true;
 
                }
            }
            }catch(...){;}
     return false;
 
 
 }
А да забыл иногда не срабатывает поиск вот что самое важное(
1 ответ

Для ускорения попробуй использовать ScanLine.