OpenCv C++透视转换



我正在尝试使用OpenCv来校正图像的失真,然后计算给定像素坐标的真实世界坐标。我在网上或OpenCv书中找不到任何关于如何做到这一点的例子。

我已经用棋盘图像完成了相机校准。现在,我只需要一个基本函数,我可以给出像素坐标,它将根据相机矩阵、失真系数、旋转和平移矢量为我提供真实世界的坐标。

有谁知道如何做到这一点?

看看findHomography()函数。如果您知道一组点在现实世界中的位置,则可以使用此函数创建可与函数一起使用的变换矩阵perspectiveTransform()

std::vector<Point2f> worldPoints;
std::vector<Point2f> cameraPoints;
//insert somepoints in both vectors
Mat perspectiveMat_= findHomography(cameraPoints, worldPoints, CV_RANSAC);
//use perspective transform to translate other points to real word coordinates
std::vector<Point2f> camera_corners;
//insert points from your camera image here
std::vector<Point2f> world_corners;
perspectiveTransform(camera_corners, world_corners, perspectiveMat_);

您可以在此处找到有关该功能的更多信息

据我正确理解,您需要从图像点开始的世界点。使用单眼相机,这个问题是无法解决的。您无法确定真实世界指向相机的深度(距离)。

有视觉同步定位和映射 (SLAM) 算法可以创建世界地图并从视频中计算相机的轨迹,但它们完全是另一回事。

给定单个图像和上面的一个点,以 2D 像素坐标表示,现实世界中有无限个 3D 点,它们都属于一条线,映射到图像中的点......不只是一点。

但是,如果您知道物体与相机的距离(以像素 (x,y) 为单位),那么您可以在 3D 中计算其位置。

相关内容

  • 没有找到相关文章

最新更新