Обычное объяснение-09-шаблон_соответствие шаблону
Видеоурок 8. Сопоставление шаблонов NCC: https://singtown.com/learn/49598/
Эта процедура 09-Feathre_detection-template_matching\ Целью этой процедуры является реализация сопоставления шаблонов с использованием NCC (алгоритма корреляции нормализованного продукта).
# NCC模板匹配示例-Normalized Cross Correlation (NCC)
#
# 这个例子展示了如何使用OpenMV的NCC功能将小部分图像与图像的各个部分
# 进行匹配...期望获得极其可控的环境 NCC并不总是有用的。
#
# 警告:NCC支持需要重做!到目前为止,这个功能需要做大量的工作才能有用。
# 这个脚本将重新表明功能的存在,但在目前的状态是不足的。
import time, sensor, image
from image import SEARCH_EX, SEARCH_DS
#从imgae模块引入SEARCH_EX和SEARCH_DS。使用from import仅仅引入SEARCH_EX,
#SEARCH_DS两个需要的部分,而不把image模块全部引入。
# 重置传感器
sensor.reset()
# 设置传感器
sensor.set_contrast(1)
sensor.set_gainceiling(16)
# Max resolution for template matching with SEARCH_EX is QQVGA
# 模板与SEARCH_EX匹配的最大分辨率是QQVGA
sensor.set_framesize(sensor.QQVGA)
# 你可以设置windowing窗口来减少搜索图片。
#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60))
sensor.set_pixformat(sensor.GRAYSCALE)
# 加载模板。
# 模板应该是一个小的(例如。32x32像素)灰度图像。
template = image.Image("/template.pgm")
clock = time.clock()
#运行模板匹配
while (True):
clock.tick()
img = sensor.snapshot()
# find_template(template, threshold, [roi, step, search])
# ROI: 感兴趣区域元组 (x, y, w, h).
# Step:使用的循环步长(y+= Step, x+= Step) 使用更大的步长使其更快。
# search 为image.SEARCH_EX进行详尽搜索,或者为image.SEARCH_DS进行菱形搜索
#
# Note1: ROI必须比图像小,比模板大。
# Note2:在菱形diamond搜索中,step和ROI都被忽略。
r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
# find_template(template, threshold, [roi, step, search]),
# threshold中的0.7是相似度阈值,roi是进行匹配的区域(左上顶点为(10,0),长80宽60的矩形),
# 注意roi的大小要比模板图片大,比frambuffer小。
# 把匹配到的图像标记出来
if r:
img.draw_rectangle(r)
print(clock.fps())
Обратите внимание: поскольку размер нашего образа-шаблона превышает встроенную флэш-память openmv, нам необходимо вставить SD-карту и выполнить следующие шаги. (Обязательно сначала вставьте SD-карту, а затем включите питание)
И это сопоставление шаблонов можно использовать только для прошивки версии 1.6 и выше, в противном случае при запуске будет выдано сообщение «невозможно найти ПОИСК_EX»
Во-первых, нам нужно создать или импортировать шаблон. Обратите внимание, что этот шаблон должен быть в формате pgm, а его размер ограничен и не может превышать размер openmv в пикселях. Мы можем перехватить изображение шаблона непосредственно из openmv. Мы можем сначала запустить процедуру helloworld.py, позволить фрамбуферу отобразить изображение, а затем перехватить его.
Выберите «Сохранить выбранное изображение на ПК». Обратите внимание, что изображение, сохраненное непосредственно из 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(шаблон, 0,7, roi=(10,0,80,60), шаг=4, search=SEARCH_EX) Порог 0,7 — это порог сходства, roi Это область для сопоставления (верхняя левая вершина — (10, 0), прямоугольник длиной 80 и шириной 60. Обратите внимание, что размер roi больше, чем изображение шаблона, и меньше, чем кадрбуфер).
Обратите внимание, что в этом сопоставлении шаблонов используется алгоритм ncc, который может сопоставлять только области, аналогичные по размеру шаблону. Если вы хотите сопоставить изображения разных размеров, вам необходимо сохранить несколько шаблонов разных размеров.
Если после запуска программы возникают следующие проблемы:
- Изображение шаблона слишком велико. Рекомендуется, чтобы изображение шаблона было меньше 80*60
- OpenMV2 не хватает памяти, поэтому нужно поменять QQVGA на QQCIF
Официальное объяснение функций документа Singtown Technology OpenMV на китайском языке:
Сравнение соответствия шаблону и обнаружения характерных точек:
Сопоставление шаблонов (find_temolate) использует алгоритм ncc, который может сопоставлять только шаблоны, которые в основном имеют тот же размер и угол, что и изображение шаблона. Ограничения относительно велики. Если целевой шаблон в поле зрения немного больше или меньше изображения-шаблона, сопоставление может оказаться неудачным.
Сопоставление шаблонов подходит для ситуаций, когда расстояние между камерой и целевым объектом определено и динамическое движение не требуется. Например, он подходит для обнаружения конкретных объектов на сборочной линии, но не подходит для отслеживания движущегося волейбольного мяча автомобилем (поскольку расстояние между движущимся волейбольным мячом и камерой является динамическим, размер волейбольного мяча, видимого камера изменится и не будет точно такой же, как на шаблонном изображении).
Для сопоставления нескольких углов и размеров можно попытаться сохранить несколько шаблонов и использовать Сопоставление нескольких шаблонов.
Обнаружение характерной точки (find_keypoint): если вы только что запустили программу, процедура извлекает первое изображение в качестве функции целевого объекта, а kpts1 сохраняет функцию целевого объекта. По умолчанию он будет соответствовать нескольким пропорциям, размерам и углам целевого объекта, а не только размеру и углу при сохранении целевого объекта. Это более гибко, чем сопоставление с шаблоном, и не требует сохранения нескольких изображений шаблона, как сопоставление с несколькими шаблонами.
Для обнаружения характерных точек вы также можете заранее сохранить целевые объекты. Раньше это не рекомендовалось, поскольку помехи от окружающего освещения и другие причины могут вызывать разные характеристики разных источников света при каждом запуске программы, и степень соответствия будет уменьшена. Однако в последней версии прошивки добавлены корректировки значений экспозиции, баланса белого и автоматического усиления. Значения экспозиции и значения баланса белого могут быть заданы искусственно, что относительно ослабит интерференцию света. . Вы также можете попытаться заранее сохранить целевые объекты.