我已经扫描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个数量的图像。旋转矩阵?
我的问题图片:
问题背后的参数:
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);
}
感谢您阅读这篇冗长的解释。我希望它有意义!如果它没有,请随意删除评论,我会尝试重写它,直到它:)
答案 0 :(得分:0)
ppx和ppy是图像尺寸的一半,所以它不会给出任何错误。焦距计算引入误差。如果您完全依赖设备旋转,则应使用设备焦点,而不是image.size()。width * M_SQRT2
焦距(以像素为单位)=图像宽度(以像素为单位)*焦距(以mm为单位)/传感器宽度(mm)
但这可能不会总是产生完美的结果。实际上,这取决于设备旋转信息的准确程度。 捆绑调整(如果有足够的分布式功能),将提供最佳输出。我建议使用捆绑调整。此外,我不认为该应用程序(您提供的youtube链接)仅使用设备旋转。