Проецирование 2D-точки от маркера на изображение с помощью компьютерной гомографии

У меня есть плоский маркер, где я запустил алгоритм SIFT для извлечения функций. Затем я запускаю детектор, чтобы найти этот маркер на сцене и снова извлечь элементы. Я сопоставляю точки и извлекаю гомографию из сопоставленных пар с помощью OpenCV, используя findHomography(),

Теперь я хочу проецировать 2D-точки, обнаруженные в маркере, с помощью вычисленной гомографии, чтобы сравнить позиции с 3D-точками, измеренными на сцене, и рассчитать ошибку перепроецирования. Меня смущают координаты пикселей, сантиметры, калибровочные матрицы, я не знаю, какие преобразования мне следует сделать в первую очередь.

Кто-нибудь знает ссылку на это или может объяснить метод?

1 ответ

Решение

Если вы называете матрицу гомографии H, матрица камеры K (необходимая для преобразования в пиксели) будет выглядеть примерно так, в зависимости от вашего разрешения.

Mat K= Mat::zeros(3,3,CV_32FC1);
K.at<float>(0,0)=500.0f;        
K.at<float>(0,2)=320.0f;      // width/2    
K.at<float>(1,1)=500.0f;    
K.at<float>(1,2)=240.0f;      // height/2 
K.at<float>(2,2)=1.0f;

Если ваши точки маркера являются векторными точками 2D:

vector<Point2f> marker_point; //containing coordinates in centimeters

тогда проекция будет такой, в результате чего получится трехмерная точка в пиксельных координатах.

Mat point(3,1,CV_32FC1);        
point.at<float>(0) = marker_point.x;
point.at<float>(1) = marker_point.y;
point.at<float>(2) = 1.0f;
point = H* point;
point = point/point.at<float>(2);       //Normalize
point = K* point;                   //to pixels
Другие вопросы по тегам