【问题标题】:Obtain two dimensional linear space on trapezoid shape inside image frame获取图像帧内梯形上的二维线性空间
【发布时间】:2017-01-05 14:20:38
【问题描述】:

在这个图像中,黑框是图像的一帧,梯形是相机看到的矩形平面。

我知道 4 个角的像素坐标,并且可以遍历梯形内的每个像素。由于我不/不知道从相机到平面的变换/旋转矢量,我想根据梯形内部的位置将像素转换为 [0,0] [1,1] 坐标,以便我选择梯形内的一个点,获取[0, 0] [1, 1]范围内的一些坐标。

线性空间是指创建许多线性范围从 0 到 1 的值。因此,100 步从 0 到 1 的一维线性空间看起来像 [0, 0.01, 0.02, 0.03 ... 1]。在这种情况下,我想这样做,但在梯形的二维中。如果这是一个矩形,那将是微不足道的,我不确定是否有办法为梯形做到这一点。

例如,梯形左侧线上的每个点总是 X=0,并且当您“向上”移动时,y 从 0 线性变为 1(尽管 X 坐标实际上在图像帧中发生了变化)。

【问题讨论】:

标签: coordinates coordinate-transformation


【解决方案1】:

我在 Javascript here 中做了一个示例。下面是它背后的数学解释。

命名点,顺时针方向,从(0, 0)开始,A、B、C、D。然后我们可以将左侧的点 Q 定义为 A 和 B 的线性组合:

Qx = Ax * (1 - v) + Bx * v
Qy = Ay * (1 - v) + By * v

或者

Qx = Ax + dx1 * v
Qy = Ay + dy1 * v

dx1 = Bx - Axdy1 = By - Ay 在哪里

沿右侧的一点,R,作为 D 和 C 的线性组合:

Rx = Dx + dx2 * v
Ry = Dy + dy2 * v

dx2 = Cx - Dxdy2 = Cy - Dy 在哪里

然后我们可以画一条从 Q 到 R 的线。当 v = 0 时,我们有线 AD,当 v = 1 时,我们有线 BC。随着 v 从 0 变为 1,我们得到覆盖整个梯形的线(假设它是凸的)。

所以梯形内的任意一点P都可以是Q和R的线性组合:

Px = Qx * (1 - u) + Rx * u
Py = Qy * (1 - u) + Ry * u

所以可以写一个点(Px, Py)

Px = (Ax + dx1 * v) * (1 - u) + (Dx + dx2 * v) * u
Py = (Ay + dy1 * v) * (1 - u) + (Dy + dy2 * v) * u

现在我们有两个未知数的两个方程。

展开收集vs

v = (Px - Ax + u.Ax - u.Dx) / (dx1 - u.dx1 + u.dx2)
v = (Py - Ay + u.Ay - u.Dy) / (dy1 - u.dy1 + u.dy2)

更多的替换来简化计算:

dx3 = Ax - Dx
dy3 = Ay - Dy
dx4 = dx2 - dx1
dy4 = dy2 - dy1
dx5 = Px - Ax
dy5 = Py - Ay

获得:

v = (dx5 + u.dx3) / (dx1 + u.dx4)
v = (dy5 + u.dy3) / (dy1 + u.dy4)

设置它们相等

(dx5 + u.dx3) / (dx1 + u.dx4) = (dy5 + u.dy3) / (dy1 + u.dy4)

交叉乘法

(dx5 + u.dx3) * (dy1 + u.dy4) = (dy5 + u.dy3) * (dx1 + u.dx4)

展开

dx5 * dy1 + dx5 * dy4 * u + dx3 * dy1 * u + dx3 * dy4 * u^2 = dy5 * da1 + dy5 * dx4 * u + dy3 * dx1 * u + dy3 * dx4 * u^2

收集条款

(dx3 * dy4 - dy3 * dx4)u^2 + (dx5 * dy4 - dy5 * dx4 + dx3 * dy1 - dy3 * dx1)u + dx5 * dy1 - dy5 * dx1 = 0

这是ax^2 + bx + c = 0 形式的二次方 用二次公式求解

a = dx3 * dy4 - dy3 * dx4
b = dx5 * dy4 - dy5 * dx4 + dx3 * dy1 - dy3 * dx1
c = dx5 * dy1 - dy5 * dx1;
determinant = b * b - 4 * a * c

如果行列式 >= 0

u = (-B + sqrt(determinant)) / (2 * A)

然后将u 代入这个方程得到v

v = (dx5 + u.dx3) / (dx1 + u.dx4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多