在平面中变形点

时间:2013-02-27 10:02:44

标签: math opencv transformation polygons roi

Point ::(x y)已知。

我在三角区域内有分数 我知道顶点和最终位置的顶点坐标。我知道三角区域内所有点的初始坐标。

现在我想找出三角区域内所有点的最终坐标。

下图显示了初始和最终位置的点数。

enter image description here enter image description here

有谁能告诉我如何在OpenCV和C ++平台上做到这一点?

我也可以为任意形状的轮廓做这个吗?

2 个答案:

答案 0 :(得分:4)

我正在使用3D坐标来考虑

  • 按矢量[u v]
  • 翻译
  • 由matrixabcd制作的2D线性变换

整体转换矩阵的格式为

    [ a b u]
M = [ c d v]
    [ 0 0 1]
  1. 从三角形中取3分A=[x1 y1 1]B=[x2 y2 1]以及C=[x3 y3 1]
  2. 将它们与转化后的位置A' = [x1' y1' 1]以及B'=[x2' y2' 1]C'=[x3' y3' 1]进行比较。 Id est:用数学方法得到转换矩阵M,以便A' = M AB' = M B以及C' = M C
  3. x -> M x应用于每个输入点
  4. 修改:使用Translation in transformation matrix

    将翻译合并到矩阵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
    

    是的,OpenCV在矩阵上有一个函数inv()

答案 1 :(得分:2)

在数学上,您可以通过计算原始三角形中每个点的重心坐标,然后使用新坐标转换回位置来实现此目的:

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点,请将pbaryresult的列数设置为point_count,而不是{{{ 1}}(相应地增加1的大小等)。

根据应用程序的不同,首先明确计算仿射矩阵可能更方便/有效,并直接应用它:

p_data