Расчет новых позиций ключевых точек
Может ли кто-нибудь помочь мне, как мы можем вычислить новые позиции ключевых точек в преобразованном изображении, ключевые точки были обнаружены в исходном изображении. Я использую матрицу гомографии opencv и warpPerspective, чтобы сделать преобразованное изображение.
Вот код..
...
std::vector< Point2f > points1,points2;
for( int i = 0; i < matches1.size(); i++ )
{
points1.push_back( keypoints_input1[matches1[i].queryIdx ].pt );
points2.push_back( keypoints_input2[matches1[i].trainIdx ].pt );
}
/* Find the Homography Matrix for current and next frame*/
Mat H1 = findHomography( points2, points1, CV_RANSAC );
/* Use the Homography Matrix to warp the images*/
cv::Mat result1;
warpPerspective(input2, result1, H1, Size(input2.cols+150, input2.rows+150),
INTER_CUBIC);
...
}
Теперь я хочу вычислить новые позиции точек2 в изображении результата1.
Например, в приведенном ниже преобразованном изображении Мы знаем угловые точки. Теперь я хочу вычислить новую позицию ключевых точек, скажем, перед преобразованием {(x1,y1),(x2,y2),(x3,y3)...}, как мы можем вычислить это?
Обновление: opencv 'pectiveTransform'делает то, что я пытаюсь сделать.
1 ответ
Давай позвоним I'
изображение, полученное деформацией изображения I
используя гомографию H
,
Если вы извлекли ключевые точки m i = (x i, y i, 1) в исходном изображении I
, вы можете получить ключевые точки в искаженном изображении I'
используя преобразование гомографии: S * m ' i = H * m i. Обратите внимание на масштабный коэффициент S, если вы хотите, чтобы координаты ключевых точек в пикселях, вы должны масштабировать m ' i так, чтобы третий элемент был 1.
Если вы хотите понять, откуда берется масштабный коэффициент, взгляните на Однородные координаты.
Также есть функция OpenCV для применения этого преобразования к массиву точек: perspectiveTransform
( документация).