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.