我正在从tsai algo做相机校准.我有内在和外在矩阵,但我怎样才能从该信息中重建三维坐标?
1) 我可以使用高斯消元法找到X,Y,Z,W,然后将点作为齐次系统的X/W,Y/W,Z/W.
2)我可以使用
OpenCV文档方法:
因为我知道u
,v
,R
,t
,我可以计算X,Y,Z
.
然而,这两种方法最终都会产生不正确的结果.
我做错了什么?
c++ opencv homogenous-transformation camera-calibration pose-estimation
我想做一些2D绘图,因此想要实现一些矩阵变换.凭借我轻松的数学背景,我试图了解如何在C#中实现这一点(任何其他oop语言都可以做到这一点).
我读到的只是解释我们需要使用3x3矩阵来处理翻译.因为你不能用乘法进行翻译.但这是我们创建转换的矩阵的乘法.所以我们使用类似的东西:
{ x1, x2, tx }
{ y1, y2, ty }
{ 0, 0, 1 }
Run Code Online (Sandbox Code Playgroud)
我理解第三列的意思,但为什么我们需要第三列呢?在单位矩阵以及旋转,缩放或旋转中,最后一行是相同的.我还没有达到需要的操作吗?是因为某些语言(Java)使用"平方维度"数组表现更好吗?如果是这样的话,我可以在C#中使用3列和2行(因为锯齿状数组的效果也一样好或者更好).
例如,对于旋转+平移,我有一个像这样的矩阵
{ cos(rot)*x1, (-sin(rot))*x2, tx }
{ sin(rot)*y1, cos(rot)*y2, ty }
{ 0, 0, 1 }
Run Code Online (Sandbox Code Playgroud)
不需要最后一行.
我正在使用OpenCV计算的单应性.我目前使用此单应性来使用下面的函数转换点.这个函数执行我需要的任务但是我不知道它是如何工作的.
任何人都可以一行一行地解释最后3行代码背后的逻辑/理论,我知道这会改变点x,y但是我不清楚它为什么会起作用:
为什么Z
,px
并py
以这种方式计算,元素h
对应的是什么?
非常感谢您的评论:)
double h[9];
homography = cvMat(3, 3, CV_64F, h);
CvMat ps1 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points1);
CvMat ps2 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points2);
cvFindHomography(&ps1, &ps2, &homography, 0);
...
// This is the part I don't fully understand
double x = 10.0;
double y = 10.0;
double Z = 1./(h[6]*x + h[7]*y + h[8]);
px = (int)((h[0]*x + h[1]*y + h[2])*Z);
py = (int)((h[3]*x + h[4]*y + h[5])*Z);
Run Code Online (Sandbox Code Playgroud) 嗨,我是计算机视觉的初学者,我想知道单应性和仿射变换之间究竟有什么区别,如果你想找到两个图像之间的平移,你会使用哪个,为什么?从我在网上找到的论文和定义来看,我还没有找到它们之间的区别,而是使用了一个而不是另一个.
谢谢你的帮助.
opencv terminology computer-vision homography affinetransform
我有两个平面图像A和B我已经使用特征点计算了这两个图像之间的单应性,我的问题是,如果A和B都按比例放大到两倍大小,那么假设A'和B'。单应性会如何?谢谢。