Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV中的转换概念_C++_Opencv_Image Processing_Computer Vision - Fatal编程技术网

C++ OpenCV中的转换概念

C++ OpenCV中的转换概念,c++,opencv,image-processing,computer-vision,C++,Opencv,Image Processing,Computer Vision,我是opencv的新手。我现在正在学习OpenCV中图像转换的概念。所以我的问题是, 1) 为什么仿射变换使用2*3矩阵,透视变换使用3*3矩阵 2) 什么时候使用仿射变换和透视变换 有什么建议吗?1)这不是关于OpenCV的问题,而是关于数学的问题。对点(x,y)应用仿射变换意味着: x_new = a*x + b*y + c; y_new = d*x + e*y + f; 所以仿射变换有6个自由度:a,b,c,d,e,f。它们存储在2x3矩阵中:a、b、c在第一行,d、e、f在第二行。可以

我是opencv的新手。我现在正在学习OpenCV中图像转换的概念。所以我的问题是,

1) 为什么仿射变换使用2*3矩阵,透视变换使用3*3矩阵

2) 什么时候使用仿射变换和透视变换

有什么建议吗?

1)这不是关于OpenCV的问题,而是关于数学的问题。对点(x,y)应用仿射变换意味着:

x_new = a*x + b*y + c;
y_new = d*x + e*y + f;
所以仿射变换有6个自由度:a,b,c,d,e,f。它们存储在2x3矩阵中:a、b、c在第一行,d、e、f在第二行。可以通过矩阵和向量相乘将变换应用于点

(x,y)的透视变换为:

z = g*x + h*y + 1;
x_new = (a*x + b*y + c)/z;
y_new = (d*x + e*y + f)/z;
如您所见,它有8个自由度,存储在3x3矩阵中。第三排是g,h,1

有关此表示法为何如此方便的更多信息,请参见


2) 仿射变换也称为“弱透视”变换:如果您从不同的角度观察某个场景,但场景的大小相对于到摄影机的距离较小(即平行线保持或多或少的平行),则可以使用仿射变换。否则将需要透视变换。

最好考虑一个空洞的变换族-然后你真的记得什么是什么。让我们从简单到复杂: 1. 欧几里德-这是平面上的刚性旋转加上平移。基本上你能做的就是把一张纸放在桌子上。 2. 相似性-更通用的变换,您可以在其中旋转、平移和缩放(因此它是非刚性的); 3. 仿射-添加另一个操作-剪切-从矩形生成平行四边形。这种透明现象发生在正交投影过程中,或者当从远处观察对象时(与对象大小相比);平行线仍然保留。 4. 单应或透视变换-最常见的变换,它将矩形变成梯形(即每侧施加的剪切量不同)。从近距离投影平面对象时会发生这种情况。还记得火车卡车是如何在无穷远处汇聚到一个点的吗?这就是透视图的名称。这也意味着与其他变换不同,我们必须在某个点应用除法。这就是当我们从齐次坐标转换到笛卡尔坐标时第三行所做的,我们除以最后第三行中的值

这种转换是唯一一种不能用线性代数进行优化计算的转换,需要非线性优化(分割的coz)。在相机投影中,单应出现在三种情况下: 1.平面与其图像之间; 2.相机旋转但不平移时,3D场景的任意图像之间; 3.在缩放操作期间。 换言之,当平面相机传感器穿过相同的光线时,就会出现单应性。

你可以在本书中找到关于这一点和相关问题的很好的解释:类似的问题,有非常有用的书籍链接:这是imo最好的:Gary Bradsky的书《学习OpenCV》(第163页)