Eu capturei posições de carro em quadros diferentes do vídeo . Suponha que o centróide do carro (carro lateral esquerdo que está vindo em nossa direção nas imagens) no quadro de vídeo1 seja P (x1, y1) e Q (x2, y2) no quadro de vídeo4.
É possível representar pontos P e Q em 3D? para que eu possa calcular a distância correta do pixel d (PQ) e finalmente calcular a distância real
Nota: você pode assumir que a câmera está estacionária, localizada a uma altura de 10 m do nível do solo. Você também pode assumir quaisquer dados adequados, se desejar, também pode consultar a próxima figura.
Respostas:
[EDITADO] Veja como é feito.
Etapas: 1. Isole a peça do divisor de estrada.
Em seguida, usando as linhas de acesso, descubra as linhas mais longas na imagem. Descubra os pontos extremos que cruzam o limite da imagem. Você conseguiu os pontos Quadilaterais. Eu pulei esta parte escolhendo-os manualmente. No meu caso, a largura da estrada na parte superior da imagem é 10 e na parte inferior é 60.
Agora, para o Destino, precisamos criar uma imagem para que o Divisor Quadilateral tenha largura uniforme de 60, para salvar em outra matriz novos pontos, que têm os mesmos pontos inferiores, mas os pontos superiores são modificados à medida que formam um retângulo com a mesma altura da imagem. (ou maior, você pode ajustar como preferir depois de executá-lo e ver os resultados), mas com a largura 60. Lembre-se de que estamos transformando nossa imagem para que o divisor se encaixe nessa área retangular. A imagem mudará automaticamente.
Agora, usando
Mat TransformMat = getPerspectiveTransform(ipPts, opPts);
de opencv em pontos quadrilaterais iniciais e de destino, obtemos uma matriz de transformação, que aplicamos à nossa imagem de teste.
warpPerspective(ipImg, opImg, TransformMat, ipImg.size());
Você verá muita área cortada para ajustar a saída no tamanho da imagem de entrada. No entanto, você notará que a imagem é transformada para obter um divisor paralelo, como esperávamos. Ao realizar algumas traduções e outras coisas e obter uma imagem de tamanho maior, você obterá isso. Nunca podemos obter uma imagem de saída perfeitamente acondicionada, pois seu tamanho pode ser muito grande. Mas alcançaremos algumas restrições que cumprirão nossa tarefa. Aqui está a última imagem:
fonte
Parece um tipo de problema de rastreamento de raios . Se você conhece a posição e a orientação da sua câmera, deve poder calcular a matriz de projeção 3x4 e sua inversa.
Isso deve permitir a conversão dos pontos da imagem para a posição 3d (na estrada). Esta discussão http://opencv-users.1802565.n2.nabble.com/2D-to-3D-projection-with-given-plane-td7272428.html pode ter informações mais úteis.
Quanto à aplicação no matlab. Existe um affine3d que você pode usar para armazenar a transformação. Também pode haver coisas úteis para projeções / rastreamento de raios na troca de arquivos, como http://www.mathworks.com/matlabcentral/fileexchange/25974-raytracer, mas não procurei em detalhes o que é relevante para o que você quer.
fonte
Se você puder calibrar sua câmera e detectar alguns pontos de referência na superfície da estrada, poderá obter coordenadas 3D dos pontos de imagem que estão na estrada. Isso pressupõe que a estrada esteja em um avião. Em outras palavras, se você pode detectar um carro, pode calcular as coordenadas 3D da parte inferior do carro. Veja este exemplo no MATLAB usando a Caixa de ferramentas do sistema Computer Vision.
fonte