Pergunta

Hey geeks da matemática, eu tenho um problema que está me stumping por um tempo agora. É para um projeto pessoal.

Eu tenho três pontos: vermelho, verde e azul. Eles estão posicionados em um pedaço de papelão de tal forma que o ponto vermelho está no canto inferior esquerdo (0,0), o ponto azul está no canto inferior direito (1,0), e o ponto verde é no canto superior esquerdo. Imagine que recuar e tirar uma foto do cartão de um ângulo. Se você fosse para encontrar o centro de cada ponto na imagem (digamos que as unidades são pixels), como você encontrar o vetor normal da face do cartão na imagem (em relação à câmara)?

Agora, algumas coisas que eu peguei sobre este problema:

  1. Os pontos (na "vida real") são sempre em um ângulo direito. Na foto, eles são apenas em um ângulo direito, se a câmera foi girado em torno do ponto vermelho ao longo de um "eixo" (eixo sendo a linha criada pelos pontos vermelhos e azuis ou vermelhas e verdes).
  2. Existem pontos em apenas um lado do cartão. Assim, você sabe que você nunca vai estar a olhar para a parte de trás do mesmo.
  3. A distância do cartão para a câmera é irrelevante. Se eu soubesse a profundidade de cada ponto, isso seria muito mais fácil (apenas um produto cruz simples, não?).
  4. A rotação do cartão é irrelevante para o que eu estou procurando. Na ajustes que eu venho fazendo para tentar descobrir isso, a rotação pode ser encontrado com a ajuda do vetor normal no final. Quer ou não a rotação é uma parte (ou produto de) encontrar o vetor normal é desconhecido para mim.

Hope há alguém lá fora que está quer feito isso ou é um gênio da matemática. Eu tenho dois dos meus amigos aqui me ajudando nisso e nós've - até agora -. Sido vencida

Foi útil?

Solução

i trabalhou com isso na minha versão antiga do MathCAD:

text alt

Edit: errado redação do screenshot do MathCAD: "Conhecido: g e b perpendicular para o outro"

no Mathcad eu esqueci o passo final de fazer o produto cruzado, o que eu vou copiar e colar aqui da minha resposta anterior:

Agora nós resolvemos para o X-Y-Z do g traduzido pontos A e B, o seu pergunta original queria que o normal o avião.

Se cruz g x b , nós vamos chegar a vetor normal a ambos:

        | u1  u2  u3 |
g x b = | g1  g2  g3 |
        | b1  b2  b3 |  

      = (g2b3 - b2g3)u1 + (b1g3 - b3g1)u2 + (g1b2 - b1g2)u3

Todos os valores são conhecidos, ligá-los (Eu não vou escrever a versão com g3 e b3 substituído na, já que é apenas muito longo e feio para ser útil.

Mas em termos práticos, eu acho que você vai ter que resolvê-lo numericamente, ajustando g z e b z , de modo a melhor atender as condições:

g · b = 0

e

| g | = | b |

Uma vez que os pixels não são algebricamente aperfeiçoar.

Exemplo

Usando uma imagem dos Apollo 13 astronautas aparelhamento um dos quadrados hidróxido de lítio cannister do módulo de comando para trabalho no LEM, i localizados os cantos:

text alt

Usando os como minha base para um plano X-Y:

text alt

i registrou os locais de pixels usando o Photoshop, com X positivo para a direita, e Y positivo para baixo (para manter a regra da mão direita de Z vai " em " a imagem):

g = (79,5, -48,5, g z )

b = (-110,8, -62,8, b z )

perfuração a dois começando fórmulas em Excel, e usando o toolpack análise de " minimizar " o erro pelo ajuste g z e b z , ele veio com dois valores de Z:

g = (79,5, -48,5, 102,5)

b = (-110,8, -62,8, 56,2)

O que então me deixa calcuate outros valores interessantes.

O comprimento da g e b em pixels:

| g | = 138,5

| b | = 139,2

O vetor normal:

g x b = (3710, -15827, -10366)

A unidade normal (comprimento 1):

u N = (0,1925, -0,8209, -0,5377)

de escala normal mesmo comprimento (em pixels) como g e b (138,9):

= normal (26,7, -114,0, -74,7)

Agora que eu tenho o normal, que é o mesmo comprimento que g e b , i plotados-los no mesmo quadro:

text alt

eu acho que você vai ter um novo problema: distorção introduzida pela lente da câmera. Os três pontos não são perfeitamente projetada no plano fotográfica 2-dimensional. Há uma distorção esférica que faz com que linhas retas não em linha reta, faz comprimentos iguais não iguais, e faz com que as normais um pouco fora do normal.

Microsoft pesquisa tem um algoritmo para figure para fora como para corrigir a distorção da câmera:

Um flexível nova técnica para Camera Calibration

Mas é além de mim:

Nós propomos uma nova técnica flexível para facilmente calibrar uma câmera. Está bem apropriado para uso sem especializada conhecimento de geometria 3D ou computador visão. A técnica requer apenas a câmara a observar um padrão planar mostrado em algumas (pelo menos dois) diferentes orientações. Ou o câmara ou o padrão pode ser plana movido livremente. O movimento não precisa ser conhecido. distorção da lente Radial é modelado. O procedimento proposto consiste de uma solução de forma fechada, seguido de um refinamento não linear com base na probabilidade máxima critério. Ambos simulação de computador e os dados reais foram usados ??para teste a técnica proposta, e muito bom Foram obtidos resultados. comparado com técnicas clássicas que o uso equipamentos caros, tais como dois ou três planos ortogonais, o proposto técnica é fácil de usar e flexível. Ele avança visão de computador 3D de um passo a partir de ambientes de laboratório para uso no mundo real.

Eles têm uma imagem de amostra, onde você pode ver a distorção:

text alt
(fonte: microsoft.com )

Nota

  • você não sabe se você está vendo o "top" do cartão, ou o "fundo", de modo que o normal poderia ser espelhado na vertical (isto é, z = z)

Atualização

Guy encontrou um erro nas fórmulas algébricas derivadas. Corrigi-lo leva a fórmulas que i, não acho, tem uma forma fechada simples. Esta não é tão ruim, uma vez que não pode ser resolvido exatamente de qualquer maneira; mas numericamente.

Aqui está uma imagem do Excel onde eu começar com as duas regras Knowns:

g · b = 0

e

| g | = | b |

Escrevendo um 2 como uma diferença (um "erro" quantidade), pode então adicionar para cima e usar esse valor como um número de ter solucionador do excel minimizar a :

text alt

Isto significa que você terá que escrever o seu próprio solver iterativo numérico. eu estou olhando para a minha Métodos Numéricos para Engenheiros livro da universidade; eu sei que contém algoritmos para resolver equações recursivas sem forma fechada simples.

Outras dicas

A partir dos sons dele, você tem três pontos p 1 , p 2 e p 3 que define um plano, e você quer encontrar o vetor normal ao plano.

Representando os pontos como vetores da origem, um equação para um vetor normal seria
n = ( p 2 - p 1 ) x ( p 3
- p 1 )
(Em que x é o produto cruzado de dois vectores)

Se quiser que o vector para o exterior ponto do frente do cartão, em seguida, ala da regra da mão direita, Set Online p 1 = vermelho (inferior esquerdo) dot
p 2 = azul (inferior direito) dot
p 3 = verde (superior esquerdo) ponto

@ Ian Boyd ... Gostei da sua explicação, só que ficou preso no passo 2, quando você disse para resolver b z . Você ainda tinha b z na sua resposta, e eu não acho que você deve ter b z no seu resposta ...

b z deve ser de +/- raiz quadrada de g x 2 + g < sub> y 2 + g z 2 - b x 2 - b y 2

Depois que eu fiz isso mesmo, eu achei muito difícil de substituir b z na primeira equação quando você resolvido para g z , porque quando substituindo b z , você agora começar:

g z = - (g x b x + g y b y ) / sqrt (g x 2 + g y 2 + g z 2 - b x 2 - b y 2 )

A parte que faz este difícil é que não existe g z na raiz quadrada, então você tem que separá-lo e combinar o g z juntos, e resolver para g z o que eu fiz, só que eu não acho que a maneira como eu resolvi que era correto, porque quando Eu escrevi o meu programa para calcular g z para mim, eu usei o seu g x e g y valores para ver se a minha resposta compensada com a sua, e isso não aconteceu.

Então eu queria saber se você poderia me ajudar, porque eu realmente precisa para chegar a este trabalho para um dos meus projetos. Obrigado!

Apenas pensar nos meus pés aqui.

As suas entradas eficazes são a aparente relação de RB / RG [+], o BRG ângulo aparente, e o ângulo que faz com que (digamos) RB com sua tela coordenar eixo y (Eu perdi alguma coisa). Você precisa os componentes do (heh!) Vetor normalizado normal, que eu acredito que é apenas dois valores independentes (embora você é deixado com uma ambigüidade frente-back se o cartão é ver através). [++]

Então, eu estou supondo que isso é possível ...

A partir de agora eu trabalho no pressuposto de que a aparente ângulo de RB é sempre 0, e podemos girar a solução final ao redor do eixo z mais tarde.

Comece com o cartão posicionado paralelo ao plano de visualização e orientada no caminho "natural" (ou seja, você superior vs. inferior e deixou vs. atribuições corretas sejam respeitados). Nós podemos chegar a todas as posições interessantes do cartão através da rotação por \theta em torno do eixo x inicial (para -\pi/2 < \theta < \pi/2), em seguida, por rotação em torno \phi eixo y inicial (para -\pi/2 < \phi < \pi/2). Note que temos preservado a direção aparente do vetor RB.

O passo seguinte calcular o rácio aparente e ângulo aparente depois em termos de \theta e \phi e invertido o resultado. [+++]

O normal será R_y(\phi)R_x(\theta)(0, 0, 1) para R_i a matriz de rotação primitivo em torno do eixo i.

[+] Os comprimentos absolutos não contam, porque isso apenas diz-lhe a distância para o cartão.

[++] Um pressuposto mais:. Que a distância entre a placa de plano da vista é muito grande do que o tamanho do cartão

[+++] Aqui a projeção que você utilizar a partir de três d espaço aos assuntos plano de visualização. Esta é a parte mais difícil, mas não é algo que podemos fazer por você a menos que você diga o que projeção você está usando. Se você estiver usando uma câmera real, então esta é uma projeção em perspectiva e é coberto em praticamente qualquer livro sobre gráficos 3D.

direita, o vetor normal não muda com a distância, mas a projeção do papelão em uma imagem faz mudança pela distância (Simple: Se você tem um pequeno papelão, nada muda. Se você tem uma milha de papelão 1 de largura e alta de 1 milha e você girá-lo para que um lado está mais próximo e do outro lado mais distante, o lado mais próximo é ampliada e do outro lado encurtado na imagem. Você pode ver que imediatamente que um retângulo não permanece um retângulo, mas um trapézio)

A forma geralmente correcta para pequenos ângulos e a câmara centrado no meio é medir a relação entre a largura / altura entre imagem "normal" e imagem ângulo sobre as linhas médias (porque eles não são deformado).

Nós definimos x como esquerda para a direita, y como baixo para cima, z como de longe para perto.

Então
x = arcsin (measuredWidth / normWidth) vermelho-azul
y = arcsin (measuredHeight / normHeight) Vermelho-Verde
z = sqrt (1,0-x ^ 2-y ^ 2)

Vou calcular amanhã uma solução mais exata, mas eu estou muito cansado agora ...

Você pode usar U, V, n co-oridnates. Definir o seu ponto de vista para a posição do "olho" ou "câmara", em seguida, converter o seu x, y, z coordenadas de u, v, n. De lá, você pode determinar as normais, bem como perspectiva e visíveis superfícies se você quiser (u 'v', n '). Além disso, tenha em mente que 2D = 3D com z = 0. Finalmente, certifique-se de usar homogênea coordenadas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top