Ваша проблема сильно напоминает мне вычисления, которые необходимо выполнить для компенсации движения при сжатии видео. Может быть, вам стоит присмотреться к тому, что сделано в этой области.
Как уже указывал rlbond, подсчет количества точек в окне, где цвета точно совпадают, не является тем, что обычно делается при сравнении изображений. Концептуально более простой метод, чем использование дискретных косинусных или вейвлет-преобразований, состоит в добавлении квадратов разностей
diff = (m_color[x1 + xWindow][y1 + yWindow] - m_color[x2 + xWindow][y2 + yWindow]);
sum += diff*diff;
и используйте sum вместо match в качестве критерия сходства (теперь меньшее значение означает лучшее).
Вернемся к тому, что вы действительно спросили: я думаю, что можно сократить время работы на коэффициент 2 / sizeWindow (может быть в квадрате?), Но это немного грязно. Это основано на том факте, что определенные пары квадратов, которые вы сравниваете, остаются почти одинаковыми при увеличении y1 на 1. Если смещения xOff = x2-x1 и yOff = y2-y1 одинаковы, то только верхняя (rsp. Bottom) вертикальная полоса из квадратов больше не (rsp. сейчас, но не раньше) совпадают. Если вы сохраните значения, которые вы рассчитываете для совпадения, в двумерном массиве, индексированном смещениями xOff = x2-x1 и yOff = y2-y1, то вы можете вычислить новое значение для совпадения [xOff] [yOff] для y1, увеличенное на 1 и x1, оставаясь прежними, с помощью сравнения * sizeWindow:
for (int x = x1; x < x1 + sizeWindow; x++) {
if (m_color[x][y1] == m_color[x + xOff][y1 + yOff]) {
match[xOff][yOff]--; // top stripes no longer compared
}
if (m_color[x][y1+sizeWindow] == m_color[x + xOff][y1 + sizeWindow + yOff]) {
match[xOff][yOff]++; // bottom stripe compared not, but wasn't before
}
}
(поскольку возможные значения для yOff изменились - путем увеличения y1 - от интервала [y2 - y1, k_maxY - sizeWindow - y1 - 1] до интервала [y2 - y1 - 1, k_maxY - sizeWindow - y1 - 2] Вы можете отбросить совпадения со вторым индексом yOff = k_maxY - sizeWindow - y1 - 1 и по-разному рассчитать совпадения со вторым индексом yOff = y2 - y1 - 1). Возможно, вы также можете сохранить значения по мере увеличения / уменьшения соответствия [] [] во время цикла в массиве, чтобы получить еще одно ускорение 2 / sizeWindow.