Лінійне стеження

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Ліні́йне сте́ження — спосіб визначення зміщення об'єктів на кадрах з відеокамери.

Нехай ми маємо два суміжні кадри з відеокамери, які являють собою дві бітмапи однакової ширини та висоти. Якщо в полі зору відеокамери були лише нерухомі об'єкти, то (з деякою точністю) ці дві бітмапи (картинки) будуть збігатися попіксельно.

По-піксельне порівняння картинок є дуже простим алгоритмом, проте воно лише може служити індикатором, чи є рухомі об'єкти в полі зору відеокамери, і не може відповісти на такі прості і важливі питання: як і куди об'єкти рухаються. Якщо ускладнити по-піксельне підхід, і порівнювати один піксель одного кадру з різними пікселями наступного кадру (з різними координатами), то теоретично ми можемо розпізнати зміщення об'єкта на цілу кількість пікселів. Проте якщо об'єкт змістився на дробову кількість пікселів, скажімо на пів-пікселя — то такий ускладнений підхід не спрацює зовсім.

Пояснення принципу на прикладі ідеалізованого зображення[ред. | ред. код]

Є другий, аналітичний підхід для обчислення зміщення об'єктів. Як модель, розглянемо спочатку бітмапу, в якій величина пікселя (інтенсивність ) лінійно наростає по координаті абсцис (вісь ):

Якщо на другій бітмапі це саме зображення буде зміщено на величину , то інтенсивність змінюється за законом:

Маючи ці дві картинки, ми легко можемо обчислити зміщення об'єкта:

навіть якщо це зміщення відбулося на дробову кількість пікселів.

Коефіцієнт в формулі (1) є проекцією градієнта інтенсивності на вісь абсцис:

Очевидно, за формулою (3) ми можемо обчислити зміщення тільки вздовж градієнта , в ортогональному напрямку ми в принципі не можемо помітити переміщення нашого ідеалізованого об'єкта, оскільки при такому переміщенні бітмапа не змінюється. Така невизначеність існує при будь-якій орієнтації градієнта, оскільки ми маємо одне лінійне рівняння відносно двох невідомих переміщень і :

Підготовка рельного зображення для застосування лінійного стеження[ред. | ред. код]

Цей метоод добре працює для ідеальної модельної картинки, але як бути з реальними зображеннями об'єктів з чіткими контурами? На думку приходить така ідея: ми можемо згладити оригінальне зображення (розфокусувати програмно, усереднюючи сусідні пікселі). В результаті ми одержимо досить гладку функцію інтенсивності, яку методами математичного аналізу можна розкладати в степеневий ряд:

У цій формулі для простоти запису суми, координати позначено через .

Розглянемо неперервну модель. Функція інтенсивності змінюється неперервно всередині протяжних об'єктів, і скачком змінюється (розриви першого роду) на межі двох об'єктів. Нас цікавить згладжування саме таких скачків. Сума по сусідніх пікселях у неперервній моделі стає інтегралом згортки:

Якщо функція згладжування матиме неперервні перші похідні, то і результат згладжування буде неперервною функцією і теж матиме перші похідні (скрізь, бо розривів ми позбулись):

Функція , окрім неперервності і диференційовності, повинна бути додатньою в деякому невеликому околі нуля, і дорівнювти нулю за межами цього околу (інакше ми при усередненні можемо домішати пікселі сторонніх об'єктів, і взагалі вийти за рамки картинки). Одним із кандидатів є наступна функція, яку образно можна назвати «біквадратним капелюхом»:

Вона додатня всередині еліпса з півосями , , і її перші похідні неперервно перетворюються в нуль на межі. Ясно, що при згладжуванні функцією (9) чіткої вертикальної межі ми одержимо приблизно лінійну ділянку на інтервалі, що є часткою півосі , на більших відстанях ми не можемо користуватися лінійним наближенням. Як показують обчислення, при похибка при обчисленні за формулою (3) буде близько 23%.

Оптимальне використання кольору[ред. | ред. код]

Нехай наша відеокамера видає кольорову RGB-картинку. Тоді зміщення записується трьома формулами (по одній на кожен колір):

Якщо розглядати згладжену межу між двома кольоровими об'єктами, то очевидно при зміщенні об'єктів усі три формули повинні дати один і той же результат . Проте було б нераціонально обчислювати усі три формули (10), проводячи усереднення (7) за кожним із трьох кольорів (марнування процесорного часу). Краще вибрати в ролі інтенсивності деяку лінійну комбінацію кольорів:

і вже для неї проводити всі усереднення та обчислення. Але як підібрати коефіцієнти найкращим чином? Нехай ми маємо протяжний кольоровий об'єкт, колір якого задається числами , на кольоровому ж фоні . Кольори можна розглядати як вектори в просторі RGB. Тоді очевидно, найбільш інформативною зміною кольору на межі об'єкта буде проекція вектора різниці:

В аналітичній геометрії проекція вектора на вектор буде відношенням скалярного добутку до довжини вектора :

Повертаючись до формули (11), можна за аналогією з формулою (13) обчислити коефіцієнти:

Використання ітерації для підвищення точності лінійного стеження[ред. | ред. код]

Розглянемо застосування ітерації на прикладі задачі бінокулярного зору. Нехай ми сфотографували один вертикальний об'єкт (наприклад стовп) двома відеокамерами, які рознесені на деяку відстань по горизонталі. Ясно, що зображення цього стовпа буде зміщене по горизонталі на деяке зміщення при порівнянні двох фотографій. Зміщення по вертикалі не очікується: , тому ця задача трохи простіша аніж стеження за рухомими об'єктами. Оскільки нам потрібний тільки градієнт по осі , то функція згладжування (9) має бути сплюснутою. Коефіцієнт повинен щонайменше вдвічі перевищувати сподіване зміщення по іксу: . На коефіцієнт не накладено ніяких математичних умов; але якщо ми візьмемо його поменшим, то зменшимо кількість обчислень, з другого боку, краще щоб деяке згладжування по осі відбувалося, щоб позбутися шороховатостей. Тому припустимо, що дорівнює малому цілому числу (в пікселях), наприклад .

Тепер ми використаємо формули (3), (4) підставляючи в них згладжену інтенсивність (бажано також з врахуванням кольору за формулою 11). Одержимо результат першої ітерації:

Тут ми явно вказали, в яких точках по іксу беруться інтенсивності. Точність цієї формули зменшується зі зростанням зміщення . Але у випадку великого , по модулю більшого одиниці, ми можемо провести ще одну ітерацію, змістивши другу картинку на ціле число пікселів що є округленням:

Маємо приблизно:

а тому наступна формула буде точнішою:

оскільки другий доданок в цій сумі є малою поправкою.

Інші медоди стеження[ред. | ред. код]

Лінійне стеження дає змогу обчислити зміщення тільки в напрямку поперечному до контура об'єкта. У випадку наявності в полі зору відеокамери компактного яскравого об'єкта на тьмяному фоні, можна застосувати інший, простіший і швидший алгоритм яскравої цятки, який дає змогу обчислити обидві координати і яскравість.