Сопоставление с шаблоном NCC
Видеоурок 8 - Сопоставление с шаблоном NCC: https://singtown.com/learn/49598/
Алгоритм NCC:
# Template Matching Example - Normalized Cross Correlation (NCC)
#
# This example shows off how to use the NCC feature of your OpenMV Cam to match
# image patches to parts of an image... expect for extremely controlled enviorments
# NCC is not all to useful.
#
# WARNING: NCC supports needs to be reworked! As of right now this feature needs
# a lot of work to be made into somethin useful. This script will reamin to show
# that the functionality exists, but, in its current state is inadequate.
import csi
import time, csi, image
csi0 = csi.CSI()
from image import SEARCH_EX, SEARCH_DS
#импортируем SEARCH_EX и SEARCH_DS из модуля image. Используя from import,
#мы импортируем только нужные нам части SEARCH_EX, SEARCH_DS, а не весь модуль image целиком.
# Reset sensor
csi0.reset()
# Set sensor settings
csi0.contrast(1)
csi0.gainceiling(16)
# Max resolution for template matching with SEARCH_EX is QQVGA
csi0.framesize(csi.QQVGA)
# You can set windowing to reduce the search image.
#csi0.window(((640-80)//2, (480-60)//2, 80, 60))
csi0.pixformat(csi.GRAYSCALE)
# Load template.
# Template should be a small (eg. 32x32 pixels) grayscale image.
template = image.Image("template.pgm")
#загружаем изображение шаблона
clock = time.clock()
# Run template matching
while (True):
clock.tick()
img = csi0.snapshot()
# find_template(template, threshold, [roi, step, search])
# ROI: The region of interest tuple (x, y, w, h).
# Step: The loop step used (y+=step, x+=step) use a bigger step to make it faster.
# Search is either image.SEARCH_EX for exhaustive search or image.SEARCH_DS for diamond search
#
# Note1: ROI has to be smaller than the image and bigger than the template.
# Note2: In diamond search, step and ROI are both ignored.
r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
#find_template(template, threshold, [roi, step, search]), 0.7 в threshold -
#это порог сходства, roi - область, в которой выполняется сопоставление
#(левый верхний угол в точке (10, 0), прямоугольник длиной 80 и шириной 60),
#обратите внимание, что размер roi должен быть больше изображения шаблона, но меньше framebuffer.
#отмечаем найденное изображение
if r:
img.draw_rectangle(r)
print(clock.fps())
Обратите внимание, что поскольку размер изображения нашего шаблона превышает встроенную флеш-память openmv, перед выполнением следующих шагов нужно вставить SD-карту (обратите внимание, что SD-карту нужно вставлять до включения питания). Кроме того, это сопоставление с шаблоном можно использовать только начиная с версии прошивки 1.6 и выше, иначе при запуске появится сообщение "can not find SEARCH_EX"
Сначала нужно создать или импортировать шаблон. Обратите внимание, что этот шаблон должен быть в формате pgm и иметь ограничение по размеру, не превышающее размер в пикселях openmv. Изображение шаблона можно захватить непосредственно с openmv. Сначала можно запустить пример helloworld.py, чтобы вывести изображение во framebuffer, а затем захватить его.

Выберите опцию сохранения изображения на ПК. Обратите внимание, что изображение, непосредственно захваченное и сохранённое с openmv, имеет формат bmp. Его нужно преобразовать в формат pgm. Онлайн-конвертацию можно выполнить на этом сайте https://convertio.co/zh/bmp-pgm/
Затем сохраняем преобразованный шаблон pgm на SD-карту (на этой SD-карте 8 шаблонов, и шаблон с изображения выше сохранён как ball0.pgm)

Затем открываем пример сопоставления с шаблоном

Меняем имя файла шаблона template.pgm в строке 28 на только что созданный ball0.pgm

И запускаем прямо так!

Вот использование функции сопоставления с шаблоном find_template:

r = img.find_template(template, 0,7, roi=(10,0,80,60), step=4, search=SEARCH_EX) 0.7 в threshold - это порог сходства, а roi - область сопоставления (левая верхняя вершина в точке (10, 0), длина 80 и ширина 60). Обратите внимание, что размер roi должен быть больше изображения шаблона и меньше framebuffer.
Обратите внимание, что это сопоставление с шаблоном использует алгоритм ncc, который может сопоставлять только области, похожие по размеру на шаблон. Если вы хотите сопоставлять изображения разных размеров, нужно сохранить несколько шаблонов разных размеров.
Если после запуска программы возникают следующие проблемы:
- Изображение шаблона слишком велико, рекомендуется, чтобы изображение шаблона было меньше 80*60

- На OpenMV2 не хватает памяти, поменяйте QQVGA на QQCIF

Сравнение сопоставления с шаблоном и обнаружения ключевых точек:
Сопоставление с шаблоном (find_temolate) использует алгоритм ncc, который может сопоставлять только шаблоны, практически совпадающие по размеру и углу с изображением-шаблоном. Ограничения здесь довольно существенные. Если целевой узор в поле зрения немного больше или меньше изображения-шаблона, сопоставление может оказаться неудачным.
Сопоставление с шаблоном подходит для ситуаций, когда расстояние между камерой и целевым объектом фиксировано и динамическое перемещение не требуется. Например, оно подходит для обнаружения конкретных объектов на сборочной линии, но не подходит для слежения движущейся тележки за волейбольным мячом (поскольку расстояние между движущимся мячом и камерой меняется, размер мяча в кадре камеры будет изменяться и не будет в точности совпадать с изображением-шаблоном).
Для сопоставления в нескольких ракурсах и масштабах можно попробовать сохранить несколько шаблонов и использовать Многошаблонное сопоставление.
Обнаружение ключевых точек (find_keypoint): если программа только что запущена, процедура извлекает первое изображение как признак целевого объекта, и kpts1 сохраняет признак целевого объекта. По умолчанию будет выполняться сопоставление в нескольких масштабах и углах целевого признака, а не только с тем размером и углом, которые были сохранены изначально. Это более гибко, чем сопоставление с шаблоном, и не требует сохранения нескольких изображений-шаблонов, как в многошаблонном сопоставлении.
При обнаружении ключевых точек также можно заранее сохранить целевые признаки. Раньше это не рекомендовалось, поскольку помехи от окружающего освещения и другие причины могли приводить к тому, что признаки различались при каждом запуске программы из-за разного освещения, и степень совпадения снижалась. Однако в последней версии прошивки была добавлена регулировка экспозиции, баланса белого и значения автоматического усиления. Значения экспозиции и баланса белого можно задать вручную, что относительно снижает влияние освещения. Вы также можете попробовать заранее сохранить целевые признаки.