Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Math 将捕获的坐标转换为屏幕坐标_Math_Image Processing_Computer Vision_Linear Algebra - Fatal编程技术网

Math 将捕获的坐标转换为屏幕坐标

Math 将捕获的坐标转换为屏幕坐标,math,image-processing,computer-vision,linear-algebra,Math,Image Processing,Computer Vision,Linear Algebra,我想这可能是一个简单的数学问题,但我不知道现在发生了什么 我在网络摄像机上捕捉“标记”的位置,我有一个标记及其坐标的列表。其中四个标记是工作表面的外角,第五个(绿色)标记是小部件。像这样: 以下是一些示例数据: 左上标记(a=98,b=86) 右上标记(c=119,d=416) 左下标记(e=583,f=80) 右下标记(g=569,h=409) 小部件标记(x=452,y=318) 我想以某种方式将网络摄像头的小部件位置转换为坐标以显示在屏幕上,左上角是0,0而不是98,86,并以某种

我想这可能是一个简单的数学问题,但我不知道现在发生了什么

我在网络摄像机上捕捉“标记”的位置,我有一个标记及其坐标的列表。其中四个标记是工作表面的外角,第五个(绿色)标记是小部件。像这样:

以下是一些示例数据:

  • 左上标记(a=98,b=86)
  • 右上标记(c=119,d=416)
  • 左下标记(e=583,f=80)
  • 右下标记(g=569,h=409)
  • 小部件标记(x=452,y=318)
我想以某种方式将网络摄像头的小部件位置转换为坐标以显示在屏幕上,左上角是0,0而不是98,86,并以某种方式考虑网络摄像头捕获的扭曲角度


我从哪里开始呢?任何帮助都值得欣赏

因为您的输入区域不是与屏幕具有相同纵横比的矩形,所以您必须应用某种转换来进行映射

我要做的是,取内点相对于外侧面的比例,并将其映射到屏幕的相同比例

要执行此操作,请计算内部点上方、下方、左侧和右侧的可用空间量,并使用比率找出该点在屏幕中的位置

测量完成后,将内点放置在:

x = left / (left + right)
y = above / (above + below)

这样,无论网络摄像头框架有多倾斜,您仍然可以映射到屏幕上完整的规则矩形。

为了计算扭曲,您需要计算输入矩形的四个角与屏幕之间的距离

由于您的网络摄像头多边形似乎具有任意形状,因此可以使用全透视单纯形将其转换为矩形。它并没有那么复杂,你可以用一个数学函数(应该很容易得到)来求解它,这个函数叫做

背景信息:

对于这样的平面变换,您可以很容易地用单应矩阵来描述它们,这是一个3x3矩阵
H
,这样,如果网络摄像头多边形上或多边形中的任何点,例如
x1
乘以
H
,即
H*x1
,我们将在屏幕上得到一个点(矩形),即
x2

现在,请注意,这些点由它们的齐次坐标表示,这只是添加了第三个坐标(其原因超出了本文的范围)。因此,假设
X1
的坐标为,
(100100)
,则齐次表示将是列向量
X1=[100;100;1]
(其中
表示新行)

好的,现在我们有8个齐次向量,代表网络摄像头多边形上的4个点和屏幕的4个角-这就是我们计算单应性所需要的全部

计算单应:

一点数学: 我不打算讨论数学,但简单地说,这就是我们解决它的方法:

我们知道3x3矩阵
H

H = 

h11 h12 h13
h21 h22 h23
h31 h32 h33

where hij represents the element in H at the ith row and the jth column
可通过
x2=H*x1
获得新的屏幕坐标。此外,结果类似于
x2=[12;23;0.1]
,因此要在屏幕坐标中获得它,我们通过第三个元素或
x2=(120230)
对其进行规范化,即
(12/0.1,23/0.1)

因此,这意味着网络摄像头多边形中的每个点(
WP
)都可以乘以
H
(然后进行归一化)以获得屏幕坐标(
SC
),即

计算H:(快速而无痛的解释)

伪代码:

for n = 1 to 4
{
    // WP_n refers to the 4th point in the webcam polygon 
    X = WP_n;

    // SC_n refers to the nth point in the screen coordinates
    // corresponding to the nth point in the webcam polygon

    // For example, WP_1 and SC_1 is the top-left point for the webcam
    // polygon and the screen coordinates respectively.

    x = SC_n(1); y = SC_n(2);

    // A is the matrix which we'll solve to get H
    // A(i,:) is the ith row of A

    // Here we're stacking 2 rows per point correspondence on A
    // X(i) is the ith element of the vector X (the webcam polygon coordinates, e.g. (120,230)
    A(2*n-1,:) = [0 0 0 -X(1) -X(2) -1 y*X(1) y*X(2) y];    
    A(2*n,:)   = [X(1) X(2) 1 0 0 0 -x*X(1) -x*X(2) -x];
}
一旦你有了一个,只需计算svd(A),它将把它分解成U,S,VT(这样A=USVT)。与最小奇异值相对应的向量为
H
(一旦将其重塑为3x3矩阵)

使用
H
,您可以通过将小部件标记位置的“扭曲”坐标乘以
H
并进行规格化来检索该坐标

示例:

在您的特定示例中,如果我们假设您的屏幕大小为800x600

WP =

    98   119   583   569
    86   416    80   409
     1     1     1     1

SC =

     0   799     0   799
     0     0   599   599
     1     1     1     1

where each column corresponds to corresponding points.
然后我们得到:

H = 
   -0.0155   -1.2525  109.2306
   -0.6854    0.0436   63.4222
    0.0000    0.0001   -0.5692
同样,我不打算讨论数学问题,但是如果我们将
H
标准化为
h33
,即将
H
中的每个元素除以上例中的
-0.5692

H =
    0.0272    2.2004 -191.9061
    1.2042   -0.0766 -111.4258
   -0.0000   -0.0002    1.0000
这让我们对转型有了更多的了解

  • [-191.9061;-111.4258]
    定义点的平移(以像素为单位)
  • [0.0272 2.2004;1.2042-0.0766]
    定义了(基本上是缩放和旋转)
  • 最后一个
    1.0000
    之所以如此,是因为我们用它来缩放
    H
    ,然后
  • [-0.0000-0.0002]
    表示网络摄像头多边形的投影变换
此外,您还可以检查
H
是否准确,我将
SC=H*WP
相乘,并使用最后一个元素规范化每列:

SC = H*WP    

    0.0000 -413.6395         0 -411.8448
   -0.0000    0.0000 -332.7016 -308.7547
   -0.5580   -0.5177   -0.5554   -0.5155
将每列除以最后一个元素(例如,在第2列中,
-413.6395/-0.5177
0/-0.5177
):

这是理想的结果

小部件坐标:

现在,您的小部件坐标也可以转换为
H*[452;318;1]
,这(在标准化后是
(561.4161440.9433)

所以,这就是翘曲后的样子:

如您所见,绿色的
+
表示扭曲后的小部件点

注意事项:

  • 这本书中有一些很好的解释同音字的图片
  • 您可以使用转换矩阵
  • MATLAB代码: A.
    尝试以下操作:用两条对角线拆分原始矩形和此图形。它们的交叉点是(k,l)。您有4个扭曲的三角形(ab cd kl、cd ef kl、ef gh kl、gh ab kl),点xy位于其中一个三角形中

    (4)三角形更好
    SC = H*WP    
    
        0.0000 -413.6395         0 -411.8448
       -0.0000    0.0000 -332.7016 -308.7547
       -0.5580   -0.5177   -0.5554   -0.5155
    
    SC
       -0.0000  799.0000         0  799.0000
        0.0000   -0.0000  599.0000  599.0000
        1.0000    1.0000    1.0000    1.0000
    
    WP =[
        98   119   583   569
        86   416    80   409
         1     1     1     1
         ];
    
    SC =[
         0   799     0   799
         0     0   599   599
         1     1     1     1
         ];    
    
    A = zeros(8,9);  
    
    for i = 1 : 4     
        X = WP(:,i);    
        x = SC(1,i); y = SC(2,i);        
        A(2*i-1,:) = [0 0 0 -X(1) -X(2) -1 y*X(1) y*X(2) y];        
        A(2*i,:)   = [X(1) X(2) 1 0 0 0 -x*X(1) -x*X(2) -x];
    end
    
    [U S V] = svd(A);
    
    H = transpose(reshape(V(:,end),[3 3]));
    H = H/H(3,3);
    
           0           0           0         -98         -86          -1           0           0           0
          98          86           1           0           0           0           0           0           0
           0           0           0        -119        -416          -1           0           0           0
         119         416           1           0           0           0      -95081     -332384        -799
           0           0           0        -583         -80          -1      349217       47920         599
         583          80           1           0           0           0           0           0           0
           0           0           0        -569        -409          -1      340831      244991         599
         569         409           1           0           0           0     -454631     -326791        -799
    
    x = c * a1 + g * a2 + k * (1 - a1 - a2)
    y = d * a1 + h * a2 + l * (1 - a1 - a2)
    a1 + a2 <= 1
    
    X = width * a1 + width * a2 + width / 2 * (1 - a1 - a2)
    Y = 0 * a1 + height * a2 + height / 2 * (1 - a1 - a2)