我正在尝试使用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 中计算其位置。