Modelo correspondente NCC
Tutorial em vídeo 8 - Correspondência de modelos NCC: https://singtown.com/learn/49598/
Algoritmo 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 time, sensor, image
from image import SEARCH_EX, SEARCH_DS
#从imgae模块引入SEARCH_EX和SEARCH_DS。使用from import仅仅引入SEARCH_EX,
#SEARCH_DS两个需要的部分,而不把image模块全部引入。
# Reset sensor
sensor.reset()
# Set sensor settings
sensor.set_contrast(1)
sensor.set_gainceiling(16)
# Max resolution for template matching with SEARCH_EX is QQVGA
sensor.set_framesize(sensor.QQVGA)
# You can set windowing to reduce the search image.
#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60))
sensor.set_pixformat(sensor.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 = sensor.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]),threshold中
#的0.7是相似度阈值,roi是进行匹配的区域(左上顶点为(10,0),长80宽60的矩形),
#注意roi的大小要比模板图片大,比frambuffer小。
#把匹配到的图像标记出来
if r:
img.draw_rectangle(r)
print(clock.fps())
Note que, como o tamanho da imagem do nosso modelo excede o flash integrado do openmv, precisamos de inserir o cartão SD e executar os passos seguintes. (Tenha cuidado ao inserir primeiro o cartão SD e depois ligar) E esta correspondência de modelo só pode ser utilizada para o firmware versão 1.6 e superior, caso contrário, será apresentado "não é possível encontrar SEARCH_EX" durante a execução
Primeiro, precisamos de criar ou importar um modelo. Note que este modelo deve estar no formato pgm e o tamanho é limitado e não pode exceder o tamanho do pixel do openmv. Podemos interceptar uma imagem de modelo directamente do openmv. Podemos primeiro executar a rotina helloworld.py, deixar o frambuffer apresentar a imagem e depois interceptá-la.
Selecione guardar seleção de imagem no pc. Note que a imagem guardada diretamente do openmv está no formato bmp. A conversão online pode ser realizada neste site https://convertio.co/zh/bmp-pgm/
De seguida, guardamos o modelo pgm convertido no cartão SD (existem 8 modelos neste cartão SD, e o modelo da imagem acima é guardado como ball0.pgm)
Assim abrimos a rotina de correspondência de modelos
Altere o nome do ficheiro de modelo template.pgm na linha 28 para ball0.pgm agora mesmo
Depois é só executá-lo!
Trata-se da utilização da função de correspondência de modelo find_template:
r = img.find_template(template, 0,7, roi=(10,0,80,60), step=4, search=SEARCH_EX) O limite de 0.7 é o limite de semelhança, roi É a área de correspondência (o vértice superior esquerdo é (10, 0), um rectângulo com um comprimento de 80 e uma largura de 60. Note-se que o tamanho do roi é maior que a imagem do modelo e menor que o frambuffer) .
Note que esta correspondência de modelo utiliza o algoritmo ncc, que só pode combinar áreas semelhantes em tamanho ao modelo.
Se ocorrerem os seguintes problemas após a execução do programa:
- A imagem do modelo é demasiado grande,recomenda-se que a imagem do modelo seja inferior a 80*60
2.o OpenMV2 não tem memória suficiente, pelo que é necessário alterar QQVGA para QQCIF
Comparação da correspondência de modelos e deteção de pontos característicos:
Model matching (find_temolate) utiliza o algoritmo ncc, que só pode corresponder a padrões que tenham basicamente o mesmo tamanho e ângulo da imagem do modelo. As limitações são relativamente grandes. Se o padrão alvo no campo de visão for ligeiramente maior ou menor do que a imagem do modelo, a correspondência poderá não ser bem-sucedida.
A correspondência de modelos é adequada para situações em que a distância entre a câmara e o objeto alvo é determinada e o movimento dinâmico não é necessário. Por exemplo, é adequado para a deteção de objetos específicos na linha de montagem, mas não é adequado para o automóvel seguir uma bola de voleibol em movimento (porque a distância entre a bola de voleibol em movimento e a câmara é dinâmica, o tamanho da bola de voleibol vista pelo a câmara irá mudar e não será exatamente igual à imagem do modelo).
Para a correspondência de vários ângulos e tamanhos, pode tentar guardar vários modelos e utilizar Correspondência de vários modelos.
Detecção do ponto de recurso (find_keypoint): Se tiver acabado de iniciar a execução do programa, a rotina extrai a primeira imagem como o recurso do objecto de destino e o kpts1 guarda o recurso do objecto de destino. Por predefinição, corresponderá a múltiplas proporções, tamanhos e ângulos do recurso de destino, e não apenas ao tamanho e ângulo ao guardar o recurso de destino. como a correspondência de vários modelos.
Para a deteção de pontos característicos, também pode guardar os recursos alvo antecipadamente. Isto não era recomendado antes porque a interferência da luz ambiente e outros motivos podem causar diferentes recursos de luzes diferentes cada vez que executa o programa, e o grau de correspondência será reduzido . No entanto, na versão mais recente do firmware, foram adicionados ajustes de exposição, equilíbrio de brancos e valores de ganho automático. Os valores de exposição e os valores de equilíbrio de brancos podem ser definidos artificialmente, o que enfraquecerá relativamente a interferência da luz. Também pode tentar guardar os recursos de destino antecipadamente.