几个星期以来,我一直在浏览OpenCV的库,没有找到任何解决方案来解决我的问题。这让我觉得这可能是不可能的。
如果有人有任何意见,我将永远感激。这不一定是一个彻底的答案,它可能只是一个评论,说“这是不可能的”-我会接受:)。
无论如何,关于问题::
我正在从一个设备中传递一个四元数,并成功地计算出罗德里格斯角<--这没有问题。
问题是PPY,PPX,焦点领域,对我来说没有绝对的意义。这似乎是唯一的方法,以获得准确的值,为这些领域,如果你校准相机之前。
但在我的项目中,校准甚至都不是一个选项。
,所以我的问题是:
除了我目前使用的东西之外,还有什么可以使用的吗?使用旋转矩阵而不需要PPY、PPX、焦距?
简单地说,有什么功能我可以使用,只是扭曲图像根据旋转矩阵?
进一步解释:
我目前使用:
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利用了来自cameraParams的PPY,PPX,Focal。如果这些字段不正确,则与结果相关。
据我所知,获得精确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;计算罗德里格斯:
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);轴角:
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);
}谢谢你阅读了这篇冗长的解释。我希望这是合理的!如果没有,请随意删除一个评论,我将尝试重写它,直到它:)
发布于 2016-08-30 10:02:17
ppx和ppy是图像维数的一半,所以不会产生任何错误。焦距计算带来误差。如果您完全依赖于设备旋转,则应该使用设备的焦点,而不是image.size().width * M_SQRT2
焦距(以像素为单位)=图像宽度(以像素为单位)*焦距(以毫米为单位)/sensor宽度(毫米)
但这可能不会产生完美的结果,always.Actually,这取决于您的设备旋转信息有多精确。束调整(如果有足够的分布式特性),将提供最好的输出。我建议使用捆绑调整。另外,我不认为这个应用程序(你给出的youtube链接)只是使用设备旋转。
https://stackoverflow.com/questions/39222725
复制相似问题