点 :: (xy) 是已知的。
我在三角形区域内有点。
我知道初始位置和最终位置的顶点坐标。我知道三角形区域内所有点的初始坐标。
现在我想找出三角形区域内所有点的最终坐标。
下图显示了初始位置和最终位置的点。
谁能告诉我如何在 OpenCV 和 C++ 平台上做到这一点?
我也可以对任意形状的轮廓执行此操作吗?
点 :: (xy) 是已知的。
我在三角形区域内有点。
我知道初始位置和最终位置的顶点坐标。我知道三角形区域内所有点的初始坐标。
现在我想找出三角形区域内所有点的最终坐标。
下图显示了初始位置和最终位置的点。
谁能告诉我如何在 OpenCV 和 C++ 平台上做到这一点?
我也可以对任意形状的轮廓执行此操作吗?
我正在使用 3D 坐标来考虑
[u v]
整体变换矩阵将具有以下形式
[ a b u]
M = [ c d v]
[ 0 0 1]
A=[x1 y1 1]
和B=[x2 y2 1]
C=[x3 y3 1]
A' = [x1' y1' 1]
和B'=[x2' y2' 1]
和进行比较C'=[x3' y3' 1]
。Id est:做你的数学得到变换矩阵M
,这样A' = M A
和B' = M B
和C' = M C
x -> M x
于每个输入点编辑:M
使用转换矩阵中的转换将转换合并到矩阵中
编辑:您似乎不清楚“做你的数学”。
你会意识到这 3 个方程可以写成:
[x1' x2' x3'] [x1 x2 x3]
[y1' y2' y3'] = M [y1 y2 y3]
[1 1 1 ] [1 1 1 ]
或者
X' = M X
或者
M = X . X'^-1
是的,OpenCVinv()
在矩阵上有一个函数。
在数学上,您可以通过计算原始三角形中每个点的重心坐标并使用新坐标转换回位置来做到这一点:
given initial triangle vertices A, B, and C, and point p,
find barycentric coordinates (a,b,c) such that a+b+c=1 and p = a*A + b*B + c*C:
-> solve [A.x B.x C.x] [a] [p.x]
[A.y B.y C.y] * [b] = [p.y]
[ 1 1 1 ] [c] [ 1 ]
then, given new vertices D, E, and F,
resulting point q = a*D + b*E + c*F:
-> compute [q.x] = [D.x E.x F.x] * [a]
[q.y] [D.y E.y F.y] [b]
[c]
因此,在 OpenCV 中:
float p_data[3] =
{ p.x,
p.y,
1.0
};
Mat_<float> p(3, 1, p_data);
float m_data[9] =
{ A.x, B.x, C.x,
A.y, B.y, C.y,
1.0, 1.0, 1.0
};
Mat_<float> M(3, 3, m_data);
Mat_<float> bary(3,1);
cv::solve(M, p, bary, DECOMP_LU);
float n_data[6] =
{ D.x, E.x, F.x,
D.y, E.y, F.y
};
Mat_<float> N(2, 3, n_data);
Mat_<float> result(2,1) = N * bary;
要同时映射点,请将、和point_count
的列数设置为而不是(同时相应地增加 的大小等)p
bary
result
point_count
1
p_data
根据应用程序,首先显式计算仿射矩阵并直接应用它可能更方便/有效:
Mat_<float> Affine = N * M.inv();
Mat_<float> result = Affine * p;