Преобразование полученных координат в экранные координаты

К сожалению, большинство этих инструментов только возвращает запись NS в соответствии с самим сервером подлинного имени. Чтобы быть более точными в определении, какие серверы имен на самом деле ответственны за домен, необходимо было бы или использовать "whois" и проверить, что домены, перечисленные там ИЛИ использование ", роют [доменный] NS [корневой сервер имен]" и выполняют это рекурсивно, пока Вы не получаете списки серверов имен...

мне жаль, что не было простой командной строки, которую Вы могли выполнить для получения ТОГО результата надежно и в последовательном формате, не только результате, который дан от самого сервера имен. Цель этого для меня состоит в том, чтобы смочь запросить приблизительно 330 доменных имен, которыми я управляю так, я могу определить точно, на какой сервер имен каждый домен указывает (согласно их настройкам регистратора).

Кто-либо знает об использовании команды, "роют" или "размещают", или что-то еще на *отклоняет?

11
задан Glorfindel 6 May 2019 в 19:04
поделиться

4 ответа

Из-за эффектов перспективы линейные или даже билинейные преобразования могут быть недостаточно точными. Посмотрите на правильное отображение перспективы и многое другое в Google по этой фразе, может быть это то, что вам нужно ...

2
ответ дан 3 December 2019 в 05:34
поделиться

Для вычисления деформации вам необходимо вычислить гомографию между четырьмя углами входного прямоугольника и экраном.

Поскольку многоугольник веб-камеры кажется иметь произвольную форму, для преобразования его в прямоугольник можно использовать полную перспективную гомографию. Это не так сложно, и вы можете решить ее с помощью математической функции (которая должна быть легко доступной), известной как Разложение по сингулярным значениям или SVD .

Справочная информация:

Для подобных плоских преобразований вы можно легко описать их с помощью гомографии, которая представляет собой матрицу 3x3 H , так что если какая-либо точка на многоугольнике веб-камеры или в нем, скажем, x1 , умножается на H , т.е. H * x1 , мы бы получили точку на экране (прямоугольную), т.е. x2 .

Теперь обратите внимание, что эти точки представлены их однородными координатами, которые представляют собой не что иное, как добавление третьей координаты (причина, по которой выходит за рамки этого поста). Итак, предположим, что ваши координаты для X1 были, (100,100) , тогда однородным представлением будет вектор-столбец 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 = (120,230) , который равен (12 / 0,1,23 / 0,1) .

Это означает, что каждая точка многоугольника веб-камеры ( WP ) может быть умножена на H (а затем нормализовать), чтобы получить координаты экрана ( SC ), то есть

SC1 = H*WP1
SC2 = H*WP2
SC3 = H*WP3
SC4 = H*WP4
where SCi refers to the ith point in screen coordinates and 
      WPi means the same for the webcam polygon

Вычисление 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];
}

Как только у вас будет A , просто вычислите svd (A) , что даст разложить его на U, S, V T (так, что A = USV T ). Вектор, соответствующий наименьшему сингулярному значению, равен 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

Это дает нам много информации о преобразовании.

координаты местоположения маркера вашего виджета путем умножения его на 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

Это дает нам хорошее представление о преобразовании.

координаты местоположения маркера вашего виджета путем умножения его на 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

Это дает нам хорошее представление о преобразовании.

H =
    0.0272    2.2004 -191.9061
    1.2042   -0.0766 -111.4258
   -0.0000   -0.0002    1.0000

Это дает нам глубокое понимание трансформации.

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 ):

SC
   -0.0000  799.0000         0  799.0000
    0.0000   -0.0000  599.0000  599.0000
    1.0000    1.0000    1.0000    1.0000

Что и является желаемым результатом.

Координаты виджета:

Теперь координаты вашего виджета также могут быть преобразованы H * [452; 318; 1] , что (после нормализации это (561.4161,440.9433) .

Итак, вот как это будет выглядеть после деформации: Warped

Как видите, зеленый + представляет точку виджета после деформации.

Примечания:

  1. В этой статье есть несколько хороших картинок, объясняющих гомографии.
  2. Вы можете поиграть с матрицами преобразования здесь

Код MATLAB:

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);

A

       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
19
ответ дан 3 December 2019 в 05:34
поделиться

Поскольку ваша область ввода не является прямоугольником с тем же соотношением сторон, что и экран, вам придется применить какое-то преобразование, чтобы выполнить отображение.

Я бы взял пропорции внутренней точки по отношению к внешним сторонам и сопоставил их с теми же пропорциями экрана.

Для этого вычислите количество свободного пространства. вверху, внизу, слева,

0
ответ дан 3 December 2019 в 05:34
поделиться

Попробуйте сделать следующее: разделите исходный прямоугольник и эту фигуру двумя диагоналями. Их пересечение - (k, l). У вас есть 4 искаженных треугольника (ab-cd-kl, cd-ef-kl, ef-gh-kl, gh-ab-kl), и точка xy находится в одном из них.

(4 треугольника лучше, чем 2 , поскольку искажение не зависит от выбранной диагонали)

Вам нужно найти, в каком треугольнике находится точка XY. Для этого вам нужно всего 2 проверки:

  1. Проверить, находится ли он в ab-cd-ef. Если это правда, продолжайте с ab-cd-ef (в вашем случае это не так, поэтому мы продолжаем с cd-ef-gh).
  2. Мы не проверяем cd-ef-gh, но уже проверяем половину это: cd-gh-kl. Дело в том. (В противном случае это было бы ef-gh-kl)

Вот отличный алгоритм для проверки, находится ли точка в многоугольнике, используя только ее точки.

Теперь вам нужно только сопоставить точку с исходным треугольником cd-gh-kl. Точка xy представляет собой линейную комбинацию трех точек:

x = c * a1 + g * a2 + k * (1 - a1 - a2)
y = d * a1 + h * a2 + l * (1 - a1 - a2)
a1 + a2 <= 1

2 переменных (a1, a2) с 2 уравнениями. Думаю, вы можете вывести формулы решения самостоятельно.

Затем вы просто составляете линейные комбинации a1 и a2 с координатами соответствующих точек в исходном прямоугольнике. В данном случае с W (ширина) и H (высота) это

X = width * a1 + width * a2 + width / 2 * (1 - a1 - a2)
Y = 0 * a1 + height * a2 + height / 2 * (1 - a1 - a2)
0
ответ дан 3 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: