Este trecho de código usa OpenCV para detectar a posição de um marcador em cada quadro capturado pelo dispositivo de vídeo. Com base nas dimensões físicas do marcador, ele também representa uma estimativa. Para cada marcador definido, os dados estão disponíveis através do UDP, na forma de texto simples. Ele retorna a translação da rotação do objeto em relação à câmera e as coordenadas XY do centróide 2D do objeto que aparece na imagem da câmera. Se um marcador não estiver visível, os números retornados serão NaN.
Observe que este código NÃO usa informações temporais para rastreamento.
Em vez disso, ele tenta detectar o marcador e estimar sua pose em cada quadro capturado.
.ini
padrão. Você precisa de um ambiente Python padrão com cv2
e módulos numpy
disponíveis. Embora o código tenha sido desenvolvido usando Python 2.7 e OpenCV 3.4.1 em um Mac, ele também deve funcionar com Python 3 e outras plataformas. Aqui estão alguns passos para criar um marcador: 1. Tire uma foto do seu objeto e recorte-o. O ideal é que a resolução seja compatível com a sua câmera. 2., Edite o arquivo de configuração e certifique-se de que ele tenha as seguintes linhas definidas:
[General]
Você pode deixar praticamente tudo igual na seção geral, mas precisará calibrar sua câmera! Leia sobre como calibrar aqui. Ao adicionar um novo marcador, você precisará ajustar as configurações, portanto, certifique-se de que a imagem da câmera estará visível.
camera_show_picture = 1
Caso contrário, um novo marcador será adicionado como uma nova seção no arquivo de configuração.
O cabeçalho é o nome amigável do marcador
[My custom marker]
Especifique o nome do arquivo e as dimensões físicas do marcador:
marker_file_name = <File name in the same directory or full path>
marker_width = <Units are in mm.>
marker_height = <Units are in mm.>
Ao configurar um novo marcador, você precisará alterar as seguintes configurações:
marker_minimum_matching_distance = <Decrease it from 50>
marker_minimum_number_of_matches = <Set this to at least 4>
pose_estimation_running_average = <more than 1>
O marker_minimum_matching_distance
é inversamente proporcional à qualidade da correspondência de recursos entre a imagem do marcador e a câmera. Se definido muito alto, os recursos fora do marcador serão correspondidos, e se definido muito baixo, nenhuma correspondência será feita.
O marker_minimum_number_of_matches
é necessário para a estimativa de pose. São necessários pelo menos 4 pontos correspondentes para calcular as coordenadas translation
e os ângulos rotation
. No entanto, quanto mais correspondências forem necessárias para a transformação, mais precisa será a estimativa. Se definido muito alto, a estimativa de pose só funcionará em alguns quadros.
Por último, o pose_estimation_running_average
define quantos dados de posição dos quadros devem ser calculados. Aumente este número se as posições retornadas forem muito 'irregulares'. No entanto, quanto mais quadros forem calculados em média, maior será o atraso.
Além disso, cada canal colour
pode ser qualquer número natural entre 0
e 255
. Os itens marker_feature_colour_*
servem para mostrar a localização das correspondências de boa qualidade entre a imagem do marcador e a imagem da câmera. As configurações marker_indicator_colour_*
determinam a cor de um único indicador, que mostra as coordenadas calculadas pelos valores médios das correspondências exibidas. Idealmente, esse indicador deve estar sempre dentro do marcador e é retornado no pacote UDP como centroid
.
marker_feature_colour_R = <0...255>
marker_feature_colour_G = <0...255>
marker_feature_colour_B = <0...255>
marker_indicator_colour_R = <0...255>
marker_indicator_colour_G = <0...255>
marker_indicator_colour_B = <0...255>
python tracker_main.py
Boa sorte!