我正在尝试使用 OpenCv 来校正图像的失真,然后在给定像素坐标的情况下计算真实世界的坐标。我在网上或 OpenCv 书中找不到任何关于如何执行此操作的示例。
我已经用棋盘图像完成了相机校准。现在,我只需要一个基本函数,我可以为其提供像素坐标,它将根据相机矩阵、畸变系数、旋转和平移向量为我提供真实世界的坐标。
有谁知道如何做到这一点?
我正在尝试使用 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 中的位置。