Python — Как симулировать короткое замыкание и в OpenCV

Я пытаюсь проверить, содержится ли двоичное изображение (шаблон) внутри другого изображения (источника). Для этого я сначала начал делать что-то вроде этого:

(это псевдокод, напоминающий python, но меня больше интересует правильная техника, чем языковая реализация)

#this code runs once at startup
template_nonzero = count_nonzero(template)

#this code is run inside a function
mask = bitwise_and(template, source)
is_contained = count_nonzero(mask) == template_nonzero

Тогда я понял, что могу ускорить процесс, избегая count_nonzero:

mask = bitwise_and(template, source)
mask_against_template = bitwise_xor(template, mask)
is_contained = not mask_against_template.any()

Этот код почти в 3 раза быстрее, чем первый. Теперь мне интересно, есть ли такая вещь, как короткое замыкание и оператор в opencv, которые возвращали бы true, если bitwise_and истинно для всех белых пикселей или false при нахождении первой ложной операции. Таким образом, мне не пришлось бы использовать xor или даже бегать по всему изображению в побитовом виде.

Есть идеи?

Редактировать:

Я забыл упомянуть, что я даже пробовал этот код, но использование xor немного быстрее, чем использование ==:

mask = bitwise_and(template, source)
mask_against_template = template == mask
is_contained = mask_against_template.all()

0

Решение

Я закончил тем, что нашел решение. Я реализовал короткое замыкание и работу в python, который оказался намного медленнее, чем cv2.bitwise_and, за которым следует cv2.bitwise_xor. Но затем я использовал numba для предварительной компиляции этой функции, и в итоге я получил функцию, которая работает в 4 раза быстрее, чем функция cv2. Вот код:

@numba.jit("b1(u1[:,:],u1[:,:])")
def is_template_in(template, image):
for y in range(0, template.shape[0]):
for x in range(0, template.shape[1]):
if template[y][x] and not image[y][x]:
return False
return True
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]