Uma nuvem de pontos é gerada usando a função aleatória uniforme para (x,y,z)
. Conforme mostrado na figura a seguir, está sendo investigado um plano de interseção plano ( perfil ) que corresponde ao melhor (mesmo que não exatamente) um perfil de destino, ou seja, dado no canto inferior esquerdo. Então a questão é:
1- Como encontrar um jogo de dado
target 2D point map
atravéspoint cloud
considerando as seguintes notas / condições?
2- Quais são então as coordenadas / orientações / grau de similaridade etc?
Nota 1: O perfil de interesse pode estar em qualquer lugar com qualquer rotação ao longo dos eixos e também pode ter uma forma diferente, por exemplo, um triângulo, retângulo, quadrilátero etc., dependendo de sua localização e orientação. Na demonstração a seguir, apenas um retângulo simples é mostrado.
Nota 2: Um valor de tolerância pode ser considerado como a distância dos pontos do perfil. Para demonstrar isso para a figura a seguir suponha que uma tolerância de 0.01
vezes a menor dimensão (~1)
assim tol=0.01
. Portanto, se removermos o restante e projetarmos todos os pontos restantes no plano do perfil que está sendo investigado, poderemos verificar sua semelhança com o perfil de destino.
Nota 3: Um tópico relacionado pode ser encontrado no reconhecimento de padrões de pontos .
fonte
Python
+MatPlotLib
para fazer minhas pesquisas e gerar os gráficos etc.P:{x,y,z}
. Eles são de fato pontos sem dimensão. No entanto, com alguma aproximação, eles podem ser discretizados para a dimensão de um pixel como matrizes 3D. Eles também podem incorporar outros atributos (como pesos, etc.) sobre as coordenadas.Respostas:
Isso sempre exigirá muita computação, especialmente se você quiser processar até 2000 pontos. Tenho certeza de que já existem soluções altamente otimizadas para esse tipo de correspondência de padrões, mas você precisa descobrir como é chamado para encontrá-las.
Como você está falando de uma nuvem de pontos (dados esparsos) em vez de uma imagem, meu método de correlação cruzada não se aplica realmente (e seria ainda pior em termos computacionais). Algo como o RANSAC provavelmente encontra uma correspondência rapidamente, mas eu não sei muito sobre isso.
Minha tentativa de uma solução:
Premissas:
Portanto, você deve conseguir vários atalhos desqualificando as coisas e diminuindo o tempo de computação. Em resumo:
Mais detalhado:
Qualquer configuração que tenha o erro mínimo ao quadrado para todos os outros pontos é a melhor correspondência
Como estamos trabalhando com três pontos de teste de vizinhos mais próximos, os pontos de destino correspondentes podem ser simplificados, verificando se estão dentro de um raio. Se procurarmos um raio de 1 a partir de (0, 0), por exemplo, podemos desqualificar (2, 0) com base em x1 - x2, sem calcular a distância euclidiana real, para acelerar um pouco. Isso pressupõe que a subtração é mais rápida que a multiplicação. Também existem pesquisas otimizadas baseadas em um raio fixo mais arbitrário .
O tempo mínimo de cálculo seria se nenhuma correspondência de 2 pontos fosse encontrada.
Se houver 2000 pontos no alvo, seriam cálculos de distância de 2000 * 2000, embora muitos fossem desqualificados por uma subtração, e os resultados dos cálculos anteriores pudessem ser armazenados, então você só precisa fazer = 1,999,000.( 20002) Na verdade, como você precisará calcular tudo isso de qualquer maneira, encontre ou não correspondências, e como você se importa apenas com os vizinhos mais próximos para esta etapa, se você tiver memória, provavelmente será melhor pré-calcular esses valores usando um algoritmo otimizado . Algo como uma triangulação de Delaunay ou Pitteway , em que todos os pontos do alvo estão conectados aos vizinhos mais próximos. Armazene-os em uma tabela e procure-os para cada ponto ao tentar ajustar o triângulo de origem a um dos triângulos de destino.
Há muitos cálculos envolvidos, mas deve ser relativamente rápido, uma vez que está apenas operando nos dados, o que é escasso, em vez de multiplicar muitos zeros sem sentido, como envolveria a correlação cruzada de dados volumétricos. Essa mesma idéia funcionaria para o caso 2D se você localizasse primeiro os centros dos pontos e os armazenasse como um conjunto de coordenadas.
fonte
Fortran
números maiores que500
pontos, será impossível ter experiências com o PC.Eu adicionaria a descrição @ mirror2image na solução alternativa ao lado do RANSAC; você pode considerar o algoritmo ICP (ponto mais próximo iterativo); uma descrição pode ser encontrada aqui !
Penso que o próximo desafio ao usar este ICP é definir sua própria função de custo e a posição inicial do plano de destino em relação aos dados do ponto da nuvem 3D. Uma abordagem prática é introduzir algum ruído aleatório nos dados durante a iteração para evitar a convergência para os mínimos falsos. Esta é a parte heurística que acho que você precisa criar.
Atualizar:
As etapas na forma simplificada são:
Itere a etapa 1-4.
Há uma biblioteca disponível que você pode considerar aqui ! (Ainda não tentei), há uma seção na parte de registro (incluindo outros métodos).
fonte