Tuesday, October 04, 2011

Мобильный караул


Представил себе приложение для мобильника, которое может сподручно и задешево послужить охранным средством, то есть, сторожем, подающим сигнал в случае беды, караулом, который никогда не устанет. 
Мобильник устанавливается напротив места или предмета, который нужно стеречь. Программа снимает статические снимки раз в секунду или в пол секунды, в зависимости от производительности процессора. Снимок сравнивается с предыдущим снимком и, в случае значимого отличия изображений, посылает СМС, возможно с картинкой, на ваш мобильный телефон. Снимки не копятся, имеем 3 картинки в памяти.
Следует учесть, что отличие не будет детектироваться по двум соседним снимкам, если изменение текущей картинки (№3) от предыдущей (№2) сравнимо со скоростью съемки. Должна работать теорема Котельникова - частота отсчетов (получения снимков) должна быть вдвое больше частоты сигнала (предполагаемых изменений картинки, зависящих от скорости передвижения вора, например). Для того, чтобы подстраховаться от смышленого вора, двигающегося очень медленно, текущий снимок может сравнивается с установочным снимком (№1), который делается в начале выполнения сторожевой программы. 
Множество способов может быть применено для обработки и сравнения снимков. Выбор зависит от производительности процессора (хорош, например, 2-х ядерный Apple A5, буквально только что упомянутый в презентации iPhone 4S), формата снимков (1600x1200 или 320х240), условий съемки (день сменяет ночь или постоянное освещение) и требуемой точности (могут украсть славянский шкаф или яйцо Фаберже). Простая из схем может быть такой - вычислить абсолютную разность изображений и произвести морфологическую операцию открытия (opening = erosion and dilation). Так как камера неподвижна, геометрические преобразования не нужны.  Если нужно определить объект (и выслать его картинку) , появившийся или исчезнувший, нужно сделать больше снимков и выбрать такой, чтобы отличие “тревожного” снимка от исходного снимка оказалось максимальным и затем применить упомянутую выше схему.
Ниже дан пример детектирования пропавшей ручки среди вещей на столе, сфотографированных iPhone (1600х1200). Исходный снимок

Снимок после “кражи”

Снимок с украденной вещью, полученный из первых двух изображений в результате обработки

Обработка произведена в матлабе. Текст срипта:

% to recognize a stolen thing  
clear;
b = imresize(imread('IMG_0413.jpg'),0.5);
a = imresize(imread('IMG_0414.jpg'),0.5);
[h, w, nc] = size(a);
shift = 15;
[xshift, yshift] = tuneposition(a, b, shift);

a = imcrop(a,[shift shift w-shift*2 h-shift*2]);
b = imcrop(b,[shift+xshift shift+yshift w-shift*2 h-shift*2]);
z = imabsdiff(a,b);

SE = strel('square', 11);
z = imerode(z,SE);
z = imdilate(z,SE);
imwrite(z,'img_0413_0414.jpg','jpg');
imshow(z)

Так как я в одной руке без опоры держал мобильник, а второй руке “крал” ручку, то изображения предметов смещены на втором снимке. Поэтому в скрипте есть вызов функции совмещения изображений tuneposition, которая работает просто: одно изображение смещается относительно другого в цикле и находит смещения (x and y), которые максимизируют коэффициент корреляции.
Если просто вычесть одно изображение из другого, то получим следы всех вещей на снимке, то есть, не то, что требуется

Ждем сообщение о краже.

No comments:

Post a Comment