我正在尝试使用OpenCv来校正图像的失真,然后在给定像素坐标的情况下计算真实世界坐标。我无法在线或在OpenCv书中找到任何有关如何执行此操作的示例。
我用国际象棋棋盘图像完成了相机校准。现在,我只需要一个基本功能,我可以给出像素坐标,它将根据相机矩阵,失真系数,旋转和平移向量给出真实世界坐标。
有谁知道怎么做?
答案 0 :(得分:6)
查看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_);
您可以找到有关函数here
的更多信息答案 1 :(得分:1)
据我所知,你需要一个从图像点开始的世界点。使用单目相机这个问题是无法解决的。您无法确定相机的真实世界点的深度(距离)。
有视觉同时定位和映射(SLAM)算法,可以创建世界地图并根据视频计算摄像机的轨迹,但它们是另一回事。
答案 2 :(得分:0)
根据2D像素坐标表示单个图像及其上的点,在现实世界中存在无限的3D点,所有3D点都属于一条线,它映射到图像中的点...不只是一点。
答案 3 :(得分:-1)
但是,如果您知道物体在像素(x,y)中与相机的距离,那么您可以用3D计算其位置。