OpenCv C ++透视变换

时间:2011-05-16 00:51:45

标签: c++ opencv camera camera-calibration

我正在尝试使用OpenCv来校正图像的失真,然后在给定像素坐标的情况下计算真实世界坐标。我无法在线或在OpenCv书中找到任何有关如何执行此操作的示例。

我用国际象棋棋盘图像完成了相机校准。现在,我只需要一个基本功能,我可以给出像素坐标,它将根据相机矩阵,失真系数,旋转和平移向量给出真实世界坐标。

有谁知道怎么做?

4 个答案:

答案 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计算其位置。