Estoy tratando de recuperar el movimiento de una cámara utilizando la matriz fundamental , y el algoritmo como figura en Wikipedia [1]. Para , necesito encontrar la matriz fundamental. Estoy usando OpenCV :: findFundamentalMat para esto.FindFundamentalMatrix no encuentra la matriz fundamental
Dos comportamientos inesperados: 1) El uso de diferentes algoritmos de ajuste produce resultados diferentes, especialmente FM_8POINT es diferente. 2) Dado un conjunto de pares de puntos (y, x), yFx = 0 no se cumple y es siempre mayor que 0.
¿No he entendido algo aquí? ¿Mi ejemplo es falso o qué está pasando? ¿Alguien puede sugerir un mejor ejemplo de prueba?
A continuación se muestra un ejemplo mínimo. Crea 12 puntos artificiales, cambia cada uno de esos puntos 10 píxeles a la derecha, encuentra la matriz fundamental de estos dos conjuntos de puntos e imprime yFx para cada punto.
Ejemplo:
int main(int argc, const char* argv[])
{
// Create two sets of points. Points in pts2 are moved 10pixel to the right of the points in pts1.
std::vector<cv::Point2f> pts1, pts2;
for(double y = 0; y < 460; y+=150)
{
for(double x= 0; x < 320; x += 150)
{
pts1.push_back(cv::Point2f(x, y));
pts2.push_back(cv::Point2f(x+10.0, y));
}
}
cv::Mat F = cv::findFundamentalMat(pts1, pts2);
for(int i = 0; i < pts1.size(); i++)
{
// Creating p1, p2, the two points. Please let me know if this can be done in fewer lines.
cv::Mat p1(3,1, CV_64FC1), p2(3,1, CV_64FC1);
p1.at<double>(0) = pts1.at(i).x;
p1.at<double>(1) = pts1.at(i).y;
p1.at<double>(2) = 1.0;
p2.at<double>(0) = pts2.at(i).x;
p2.at<double>(1) = pts2.at(i).y;
p2.at<double>(2) = 1.0;
// Print yFx for each pair of points. This should be 0 for all.
cout << p1.t() * F * p2 << endl;
}
}
Para FM_RANSAC llego [1.999], [2], [2], [1.599], [1.599], [1.599], [1.198], [1.198], [1.198], [0.798], [0.798], [0.798]
Para FM_8POINT, la matriz fundamental es ceros (3,3) y, por lo tanto, yFx es 0 para todos y, x.
Encontré solamente: T and R estimation from essential matrix pero eso no ayudó mucho.
EDITAR: yFx es el camino equivocado (p1/p2 conmutados en la línea de comandos). Este es un ejemplo que tampoco funciona porque todos los puntos se encuentran en un plano.
bien, tuve P2 y P1 al revés. Gracias por detectar eso. Echaré un vistazo al periódico ahora, y luego Hartley y Zisserman estarán a la vuelta de la esquina, tal vez puedan ayudar. – Unapiedra