Como usar o OpenMV para medição de distância

Tutorial em vídeo 10 - Medição de distância e medição do tamanho de objetos: https://singtown.com/learn/50001/
Tutorial em vídeo 33 - Medição de distância óptica ToF: https://singtown.com/learn/50539/
  • O primeiro método:\ Usando apriltag, o Apriltag consegue realizar posicionamento 3D. Para detalhes de implementação, consulte o nosso tutorial:\ http://book.openmv.cc/image/apriltag.html

  • O segundo método:\ O OpenMV utiliza uma câmara monocular. Se quiser realizar medição de distância, precisa de selecionar um objeto de referência e usar a proporção de tamanho do objeto de referência para calcular a distância.

Esta secção partilha o segundo método: como calcular a distância entre a câmara e a bola de pingue-pongue a partir do tamanho da bola de pingue-pongue na câmara.

Como todos sabemos, quanto mais longe a bola de pingue-pongue estiver da câmara, menor será o tamanho da bola de pingue-pongue na câmara, portanto a questão é?\ Qual é exatamente esta relação?\ (Nota: o problema de geometria matemática aqui envolve apenas a parte de trigonometria da matemática do ensino secundário. Se não quiser ler, pode simplesmente ver a conclusão diretamente)

Para simplificar o problema, vejamos a imagem:\

A partir da relação geométrica na câmara à esquerda, podemos saber:

Logo temos (Fórmula 1)

A partir da relação geométrica no ambiente real à direita, podemos saber:

Substituindo (Fórmula 1) obtemos (Fórmula de conclusão):

O que está acima é a relação que queríamos conhecer no final!\ O que significa isto?\ Lm do lado esquerdo do sinal de igual é o comprimento, e Bpix são os pixéis ocupados pela bola na câmara (pixéis de diâmetro). No lado direito do sinal de igual, Rm é o raio real da bola, Apix é um pixel fixo, e a é metade do ângulo de visão.\ Portanto! Portanto! Portanto! Portanto! Portanto! Portanto! Portanto!\ Esta fórmula diz-nos:

实际长度和摄像头里的像素成反比

Simplificando

距离 = 一个常数/直径的像素

Ok, já conhecemos a relação, e é tão elegante e simples!\ Os passos operacionais específicos são medir primeiro o valor desta constante. É claro, primeiro coloque a bola a 10 cm de distância da câmara, imprima o valor em pixéis do diâmetro na câmara e depois multiplique-o para obter o valor de k!

Depois distância = esta constante / pixéis na câmara, tão simples.

Aqui está o código do OpenMV:

# Measure the distance
#
# Este exemplo mostra como medir a distância através do tamanho na imagem.
# Este exemplo em particular procura uma bola de pingue-pongue amarela.

import csi, image, time
csi0 = csi.CSI()

# Para que o seguimento de cor funcione muito bem, o ideal é estar num
# ambiente muito, muito controlado, onde a iluminação é constante...
yellow_threshold   = ( 56,   83,    5,   57,   63,   80)
# Pode ser necessário ajustar as definições acima para seguir objetos verdes...
# Selecione uma área na Framebuffer para copiar as definições de cor.

csi0.reset() # Inicializa o sensor da câmara.
csi0.pixformat(csi.RGB565) # usa RGB565.
csi0.framesize(csi.QQVGA) # usa QQVGA para velocidade.
csi0.snapshot(frames=10) # Deixa as novas definições terem efeito.
csi0.auto_whitebal(False) # desliga isto.
clock = time.clock() # Monitoriza o FPS.

K=5000#o valor deve ser medido

while(True):
    clock.tick() # Monitoriza os milissegundos decorridos entre snapshots().
    img = csi0.snapshot() # Tira uma fotografia e devolve a imagem.

    blobs = img.find_blobs([yellow_threshold])
    if len(blobs) == 1:
        # Desenha um retângulo à volta do blob.
        b = blobs[0]
        img.draw_rectangle(b[0:4]) # rect
        img.draw_cross((b[5], b[6])) # cx, cy
        Lm = (b[2]+b[3])/2
        length = K/Lm
        print(length)

    #print(clock.fps()) # Nota: A sua OpenMV Cam corre cerca de metade da
    # velocidade quando ligada ao computador. O FPS deve aumentar depois de desligada.

O resultado é este, a distância é impressa através da porta série.

results matching ""

    No results matching ""