我正试图在世界空间中找到相机的焦距,位置和方向.
因为我需要这是与分辨率无关的,我归我的图像坐标,以在范围[-1, 1]为x,和一个稍小范围y(取决于纵横比).(0, 0)图像的中心也是如此.我已经纠正了镜头失真(使用k1和k2系数),所以这不会进入图片,除了有时投掷x或y稍微超出[-1, 1]范围.
作为给定,我在已知尺寸的世界空间中具有平面的固定矩形(以毫米为单位).保证矩形的四个角可见,并在图像中手动标记.例如:
std::vector<cv::Point3f> worldPoints = {
cv::Point3f(0, 0, 0),
cv::Point3f(2000, 0, 0),
cv::Point3f(0, 3000, 0),
cv::Point3f(2000, 3000, 0),
};
std::vector<cv::Point2f> imagePoints = {
cv::Point2f(-0.958707, -0.219624),
cv::Point2f(-1.22234, 0.577061),
cv::Point2f(0.0837469, -0.1783),
cv::Point2f(0.205473, 0.428184),
};
Run Code Online (Sandbox Code Playgroud)
实际上,我认为我试图解决的等式是(参见OpenCV文档中的等价物):
/ xi \ / fx 0 \ / tx \ / Xi \
s | yi | = | …Run Code Online (Sandbox Code Playgroud) 我想使用 OpenCV 进行一些运动结构。到目前为止,我已经有了基本矩阵和基本矩阵。有了基本矩阵,我正在做 SVD 来获得 R 和 T。
我的问题是,我有 2 个可能的 R 解决方案和 2 个可能的 T 解决方案,这导致整体姿势有 4 个解决方案,其中 4 个解决方案中只有一个是正确的。我怎样才能找到正确的解决方案?
这是我的代码:
private void calculateRT(Mat E, Mat R, Mat T){
Mat w = new Mat();
Mat u = new Mat();
Mat vt = new Mat();
Mat diag = new Mat(3,3,CvType.CV_64FC1);
double[] diagVal = {1,0,0,0,1,0,0,0,1};
diag.put(0, 0, diagVal);
Mat newE = new Mat(3,3,CvType.CV_64FC1);
Core.SVDecomp(E, w, u, vt, Core.DECOMP_SVD);
Core.gemm(u, diag, 1, vt, 1, newE);
Core.SVDecomp(newE, w, u, vt, Core.DECOMP_SVD);
publishProgress("U: " …Run Code Online (Sandbox Code Playgroud)