没有K / PPY,PPX,Focal的翘曲 - OpenCV

时间:2016-08-30 08:44:14

标签: c++ opencv

我已经扫描OpenCV的库好几周了,还没找到任何解决我问题的解决方案。这让我觉得这可能是不可能的。

如果有人有任何意见,我将永远感激不尽。它不一定是一个彻底的答案,它可能只是一个评论说“它不可能” - 我接受:)。

无论如何,关于问题:

我从设备传入四元数并成功计算罗德里格斯角度< - 没问题。

问题是PPY,PPX,Focal领域对我来说真的没有意义。对于那些字段来说,实现精确值的唯一方法就是以前校准相机。

但校准在我的项目中甚至不是一个选项。

所以我的问题是:

除了我目前使用的旋转矩阵之外,还有什么我可以使用的,而不需要PPY,PPX,Focal?

简单地说,是否有任何我可以使用的功能只是根据旋转矩阵扭曲图像?

进一步说明:

我目前使用:

warper->warp(img, K, cameras[img_idx].R, INTER_LINEAR, BORDER_REFLECT, imgWarped);
warper->warp(mask, K, cameras[img_idx].R, INTER_LINEAR, BORDER_CONSTANT, maskWarped);

K使用PPY,PPX,Focal中的cameraParams。如果这些字段不正确 - 它将与结果相关。

根据我的理解,获得准确的PPY,PPX,Focal字段的唯一方法是校准相机。但是在我的项目中无法校准相机。

那么,有没有办法根据知道它们的宽度/高度和幅度来扭曲x个数量的图像。旋转矩阵?

我的问题图片:

problem

问题背后的参数:

cameras_global[imageCounter].ppx = 0.5 * image.size().width;
cameras_global[imageCounter].ppy = 0.5 * image.size().height;
cameras_global[imageCounter].focal = image.size().width * M_SQRT2;

计算Rodrigues:

double x = axisAngles[0];
double y = axisAngles[1];
double z = axisAngles[2];
double angle = axisAngles[3];

Mat input = (Mat_<float>(1,3) <<  x, y, z);

Mat cameraMatrix;
Rodrigues(input * angle, cameraMatrix);
input.release();
cameraMatrix.copyTo(cameras_global[imageCounter].R);

Axis Angles:

cv::Vec4f calculateAxisAnglesFromQuat(double qw, double qx, double qy, double qz){
    double angle = 2 * acos(qw);

    double x = qx / sqrt(1-qw*qw);
    double y = qy / sqrt(1-qw*qw);
    double z = qz / sqrt(1-qw*qw);

    return cv::Vec4f(x,y,z,angle);
}

感谢您阅读这篇冗长的解释。我希望它有意义!如果它没有,请随意删除评论,我会尝试重写它,直到它:)

1 个答案:

答案 0 :(得分:0)

ppx和ppy是图像尺寸的一半,所以它不会给出任何错误。焦距计算引入误差。如果您完全依赖设备旋转,则应使用设备焦点,而不是image.size()。width * M_SQRT2

焦距(以像素为单位)=图像宽度(以像素为单位)*焦距(以mm为单位)/传感器宽度(mm)

但这可能不会总是产生完美的结果。实际上,这取决于设备旋转信息的准确程度。 捆绑调整(如果有足够的分布式功能),将提供最佳输出。我建议使用捆绑调整。此外,我不认为该应用程序(您提供的youtube链接)仅使用设备旋转。