Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 EstimaterialGidTransform()_C++_Opencv_Math - Fatal编程技术网

C++ OpenCV EstimaterialGidTransform()

C++ OpenCV EstimaterialGidTransform(),c++,opencv,math,C++,Opencv,Math,在阅读了几篇关于从一幅图像到另一幅图像的二维点的二维变换的文章后,estimategidtransform()似乎是建议。我正在尝试使用它。我修改了源代码(为了更改RANSAC参数,因为它是硬编码的,并且硬编码的参数不是很好)(此函数的源代码位于lkpyramid.cpp)。我已经阅读了RANSAC的工作原理,并试图理解estimategidtransform()中的步骤 //从A&B中随机选择3个非平面点 ... //非平面向量的附加检查 a[0]=pA[idx[0]]; a[1]=pA[id

在阅读了几篇关于从一幅图像到另一幅图像的二维点的二维变换的文章后,
estimategidtransform()
似乎是建议。我正在尝试使用它。我修改了源代码(为了更改
RANSAC
参数,因为它是硬编码的,并且硬编码的参数不是很好)(此函数的源代码位于
lkpyramid.cpp
)。我已经阅读了
RANSAC
的工作原理,并试图理解
estimategidtransform()
中的步骤

//从A&B中随机选择3个非平面点
...
//非平面向量的附加检查
a[0]=pA[idx[0]];
a[1]=pA[idx[1]];
a[2]=pA[idx[2]];
b[0]=pB[idx[0]];
b[1]=pB[idx[1]];
b[2]=pB[idx[2]];
双dax1=a[1].x-a[0].x,day1=a[1].y-a[0].y;
双dax2=a[2].x-a[0].x,day2=a[2].y-a[0].y;
双dbx1=b[1].x-b[0].x,dby1=b[1].y-b[0].y;
双dbx2=b[2].x-b[0].x,dby2=b[2].y-b[0].y;
常数双eps=0.01;
if(晶圆厂(dax1*day2-day1*dax2)
它使用非共面向量是打字错误吗?我是说2D点都在同一个平面上,对吗


我的第二个问题是,如果
条件在做什么?我知道如果点是共线的,左手边(给出三角形乘以2的面积)将是零或接近零,右手边是三角形两条边长度的乘积。

共线性在仿射变换中保持不变(例如您可能正在估计的变换),但这种变换也会计算视点旋转的变化(就像在三维世界中旋转对象一样)。但是,这些点也将是共线的,因此对于算法来说,它可能没有唯一的解决方案。请看图片:

想象一下,在第一幅图像的第一行中选择每个黑色正方形的3个中心点。然后将其映射到下一幅图像中的相同中心。它可以生成到该解决方案的映射,但也可以生成到第一个解决方案的缩放版本的映射。第三个也可能发生同样的情况,只是这次可能映射到第一个的缩小版本(没有任何其他更改)。但是,如果点不是共线的,例如,3个角正方形中心,它将找到唯一的贴图


我希望这能帮助你澄清你的疑问。如果没有,请留下注释

图像中的2D点是3D点到图像平面的投影,因此它们可能表示非共面点。在这种情况下,可能它们的意思是共线?@api55但为什么共线点不可取?感谢您对这一部分的解释,您知道如果条件在做什么吗?@EugeneL我不是100%确定,它们位于不等式的左侧,
2*面积
,因为共线点的面积等于0,但不确定为什么他们将其与
eps*lengthSideA*lengthSideB
作为sideA和sideB,三角形的两条边进行比较,但不确定为什么,也许可以将其与根据问题缩放的合理ε值进行比较
// choose random 3 non-complanar points from A & B
...
// additional check for non-complanar vectors
a[0] = pA[idx[0]];
a[1] = pA[idx[1]];
a[2] = pA[idx[2]];

b[0] = pB[idx[0]];
b[1] = pB[idx[1]];
b[2] = pB[idx[2]];

double dax1 = a[1].x - a[0].x, day1 = a[1].y - a[0].y;
double dax2 = a[2].x - a[0].x, day2 = a[2].y - a[0].y;
double dbx1 = b[1].x - b[0].x, dby1 = b[1].y - b[0].y;
double dbx2 = b[2].x - b[0].x, dby2 = b[2].y - b[0].y;
const double eps = 0.01;

if( fabs(dax1*day2 - day1*dax2) < eps*std::sqrt(dax1*dax1+day1*day1)*std::sqrt(dax2*dax2+day2*day2) ||
    fabs(dbx1*dby2 - dby1*dbx2) < eps*std::sqrt(dbx1*dbx1+dby1*dby1)*std::sqrt(dbx2*dbx2+dby2*dby2) )
    continue;