К сожалению, большинство этих инструментов только возвращает запись NS в соответствии с самим сервером подлинного имени. Чтобы быть более точными в определении, какие серверы имен на самом деле ответственны за домен, необходимо было бы или использовать "whois" и проверить, что домены, перечисленные там ИЛИ использование ", роют [доменный] NS [корневой сервер имен]" и выполняют это рекурсивно, пока Вы не получаете списки серверов имен...
мне жаль, что не было простой командной строки, которую Вы могли выполнить для получения ТОГО результата надежно и в последовательном формате, не только результате, который дан от самого сервера имен. Цель этого для меня состоит в том, чтобы смочь запросить приблизительно 330 доменных имен, которыми я управляю так, я могу определить точно, на какой сервер имен каждый домен указывает (согласно их настройкам регистратора).
Кто-либо знает об использовании команды, "роют" или "размещают", или что-то еще на *отклоняет?
Из-за эффектов перспективы линейные или даже билинейные преобразования могут быть недостаточно точными. Посмотрите на правильное отображение перспективы и многое другое в Google по этой фразе, может быть это то, что вам нужно ...
Для вычисления деформации вам необходимо вычислить гомографию между четырьмя углами входного прямоугольника и экраном.
Поскольку многоугольник веб-камеры кажется иметь произвольную форму, для преобразования его в прямоугольник можно использовать полную перспективную гомографию. Это не так сложно, и вы можете решить ее с помощью математической функции (которая должна быть легко доступной), известной как Разложение по сингулярным значениям или 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)
.
Итак, вот как это будет выглядеть после деформации:
Как видите, зеленый +
представляет точку виджета после деформации.
Примечания:
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
Поскольку ваша область ввода не является прямоугольником с тем же соотношением сторон, что и экран, вам придется применить какое-то преобразование, чтобы выполнить отображение.
Я бы взял пропорции внутренней точки по отношению к внешним сторонам и сопоставил их с теми же пропорциями экрана.
Для этого вычислите количество свободного пространства. вверху, внизу, слева,
Попробуйте сделать следующее: разделите исходный прямоугольник и эту фигуру двумя диагоналями. Их пересечение - (k, l). У вас есть 4 искаженных треугольника (ab-cd-kl, cd-ef-kl, ef-gh-kl, gh-ab-kl), и точка xy находится в одном из них.
(4 треугольника лучше, чем 2 , поскольку искажение не зависит от выбранной диагонали)
Вам нужно найти, в каком треугольнике находится точка XY. Для этого вам нужно всего 2 проверки:
Вот отличный алгоритм для проверки, находится ли точка в многоугольнике, используя только ее точки.
Теперь вам нужно только сопоставить точку с исходным треугольником 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)