Encontrando blocos de cor

Tutorial em vídeo 4 - Reconhecimento de cores: https://singtown.com/learn/49993/

Função find_blobs

Rastrear a bola é a função mais usada da OpenMV. No início rápido em 10 minutos,\ podemos encontrar o bloco de cor através da função find_blobs. Vamos discutir os detalhes do find_blobs.

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

Há muitos parâmetros aqui.

  • thresholds é o limiar de cor. Nota: este parâmetro é uma lista que pode conter várias cores. Se você precisar de apenas uma cor, então há apenas um valor de cor nessa lista. Se quiser vários limiares de cor, essa lista precisa de vários limiares de cor. Nota: o método code pode ser chamado no objeto blob retornado para determinar de que cor é o bloco de cor.
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)

img=csi0.snapshot()
red_blobs = img.find_blobs([red])

color_blobs = img.find_blobs([red,blue, yellow])
  • roi é a "região de interesse". Já foi apresentada no uso de estatísticas.

    left_roi = [0,0,160,240]\ blobs = img.find_blobs([red],roi=left_roi)

  • x_stride é a largura mínima em pixels, na direção x, do bloco de cor a ser pesquisado. O valor padrão é 2. Se você só quiser encontrar blocos de cor com largura maior que 10 pixels, defina esse parâmetro para 10:

    blobs = img.find_blobs([red],x_stride=10)

  • y_stride é a largura mínima em pixels, na direção y, do bloco de cor a ser pesquisado. O valor padrão é 1. Se você só quiser encontrar blocos de cor com largura maior que 5 pixels, defina esse parâmetro para 5:

    blobs = img.find_blobs([red],y_stride=5)

  • invert inverte o valor do limiar e usa a cor fora do limiar como o limiar para a busca

  • area_threshold limiar de área. Se a área do bloco de cor delimitado for menor que esse valor, ele será filtrado

  • pixels_threshold limiar de contagem de pixels; se o número de pixels em um bloco de cor for menor que esse valor, ele será filtrado

  • merge mesclagem; se definido como True, mescla todos os blobs sobrepostos em um só.\ Nota: isso mesclará todos os blobs, independentemente da cor. Se você quiser mesclar blobs de várias cores, basta chamar find_blobs com diferentes limiares de cor separadamente.

all_blobs = img.find_blobs([red,blue,yellow],merge=True)

red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)
  • margin margem; se definido como 1, então dois blobs serão mesclados se estiverem separados por 1 pixel.

limiar

A estrutura de um limiar de cor é a seguinte:

red = (minL, maxL, minA, maxA, minB, maxB)

Os valores na tupla são, respectivamente, os valores máximo e mínimo de L A B.

Se você quiser obter esse limiar na imagem da IDE, veja: início rápido em 10 minutos

Na nova versão da IDE, há uma ferramenta de seleção de limiar mais conveniente, veja abaixo.

Ferramenta de seleção de limiar de cor

A IDE da OpenMV adicionou uma ferramenta de seleção de limiar, que facilita muito a depuração dos limiares de cor.

Primeiro execute hello world.py para exibir o padrão no framebuffer na IDE.\ \ Em seguida, abra Tools → Mechine Vision → Threshold Editor\

Clique em Frame Buffer para obter a imagem na IDE, e em Image File você pode selecionar um arquivo de imagem por conta própria.

Arraste os seis controles deslizantes para ver os resultados do limiar em tempo real. O resultado que queremos é transformar nossa cor-alvo em branco e todas as outras cores em preto.

Blobs é uma lista

O objeto find_blobs retorna uma lista de vários blobs. (Note a diferença entre blobs e blob. É apenas um nome usado para distinguir vários blocos de cor de um único bloco de cor).\ Uma lista é semelhante a um array na linguagem C. Uma lista de blobs contém muitos objetos blob. Objetos blob são blocos de cor, e cada objeto blob contém informações sobre um bloco de cor.

blobs = img.find_blobs([red])

Blobs são vários blocos de cor.

Você pode usar um loop for para encontrar todos os blocos de cor.

for blob in blobs:
    print(blob.cx)

Para o uso de loops for, veja Conhecimentos básicos de Python

Objeto blob de bloco de cor

Blob tem vários métodos:

  • blob.rect retorna o quadro externo desse bloco de cor - uma tupla retangular (x, y, w, h), que pode ser usada diretamente em image.draw_rectangle.

  • blob.x retorna a coordenada x da borda do blob (int), também disponível em blob[0].

  • blob.y retorna a coordenada y da borda do blob (int), também disponível em blob[1].

  • blob.w retorna a largura w da borda do blob (int), também disponível em blob[2].

  • blob.h retorna a altura h da borda do blob (int), também disponível em blob[3].

  • blob.pixels retorna o número de pixels no blob (int), também disponível em blob[4].

  • blob.cx retorna a coordenada x do centro da borda do blob (int), também disponível em blob[5].

  • blob.cy retorna a coordenada y do centro da borda do blob (int), também disponível em blob[6].

  • blob.rotation retorna o ângulo de rotação do blob em radianos (float). Se o blob se parecer com um lápis, esse valor fica entre 0 e 180°. Se o blob for um círculo, esse valor é inútil. Se o blob não tiver nenhuma simetria, você obterá 0~360°. Você também pode obter esse valor de blob[7].

  • blob.code retorna um número de 16 bits, onde cada bit corresponde a um limiar. Por exemplo:

    blobs = img.find_blobs([red, blue, yellow], merge=True)

Se o blob for vermelho, seu código é 0001, e se for azul, seu código é

  1. Nota: um blob pode ser mesclado, então se for um blob vermelho e azul, o código do blob é 0011. Essa função pode ser usada para encontrar códigos de cor. Você também pode obter esse valor de blob[8].

  2. blob.count Se merge=True, vários blobs são mesclados em um único blob, e essa função retorna o número de blobs. Se merge=False, o valor de retorno é sempre 1. Você também pode obter esse valor de blob[9].

  3. blob.area retorna a área do quadro externo do blob. Deve ser igual a (w * h)

  4. blob.density retorna a densidade do blob. Isso é igual ao número de pixels no blob dividido pela área do quadro externo. Se a densidade for baixa, significa que o alvo não foi bem travado.\ Por exemplo, ao reconhecer um círculo vermelho, o blob.pixels retornado é o número de pixels do círculo-alvo, e blob.area é a área do quadrado circunscrito ao círculo.

results matching ""

    No results matching ""