Привет форум Codeby.net. Во-первых, хочу всех поздравить с Новым годом. Желаю всего самого лучшего. А теперь, пожалуй, перейдем к рассмотрению, что же у нас должно получиться.
Введение
Начнем с того, что в прошлой статье(Пассивная слежка через WIFI с помощью Probequest) я рассказал и показал, что устройства отправляют Probe Frame(Пробные пакеты).
Основная цель этих пакетов — автоматическое подключение к известным сетям. Также было сказано, что эти пакеты можно использовать для получения информации об окружающих устройств. В каких целях эту информацию было рассказано, как раз в прошлый статье.
Слежение за участком экрана на C#
На днях написал небольшую программу на заказ. Суть приложения заключалась в слежении за определённым участком экрана. Необходимо было следить за выбранным участком, раз в секунду проверяя его изменения. Что-то типа бота, но гораздо проще.
Программа должна была реагировать в на любые изменения на экране, то есть если мы перейдём со страницы сайта, откроем другую вкладку, то сразу же выскакивает окно и звуковое оповещение. Программа получилась простая, но с парой интересных моментов, о которых я и расскажу ниже.
Самый простой скрытый доступ к смарту жены
Сначала алгоритм решения задачи – создания программы. Он прост:
- Выделяем кусок экрана и сохраняем его в битмап
- Запускаем таймер и сравниваем его раз в секунду с такими же кусками
- Если получилось расхождение – звук на полную громкость, окно на передний план
Первый момент – как выделить кусок экрана? Первое, что приходит в голову – это рисовать курсором рамку. Вообще, да, это можно сделать. Но потребуется высчитывать координаты курсора, рисовать линии на рабочем столе (или стороннем приложении) – это все реализуемо, но, честно говоря, довольно муторно и нестабильно. Благо заказчик попался нетребовательный, интерфейс я сам рисовал, так что упростил себе задачу.
Я просто сделал прозрачное окно (форму) и закинул на него picturebox (прозрачный, с рамкой) и кнопку (не прозрачную):
private void Form1_Load(object sender, EventArgs e)
Высчитать координаты и размеры внутри picturebox также несложно:
Point location = pictureBox1.PointToScreen(Point.Empty); x = location.X+5; y = location.Y+5; w = pictureBox1.Width — 5; h = pictureBox1.Height — 5; player.SoundLocation = «Sound_15750.wav»; Получаем скриншот данного куска экрана:
bmp1 = new Bitmap(w, h); using (Graphics g = Graphics.FromImage(bmp1)) < g.CopyFromScreen(x, y, 0, 0, new Size(w, h)); >bmp1.Save(«scrstart.png», System.Drawing.Imaging.ImageFormat.Png);
Дальше надо запустить таймер (не забыв кинуть на форму данный элемент) и свернуть окно на панель задач:
InitializeTimer(); this.WindowState = FormWindowState.Minimized;
А вот что делает таймер у нас? Он раз в секунду берет этот же кусок экрана и сравнивает его битмап с первым изображением:
Вычисляем по IP с помощью Python | Как определить местоположение по IP
private void Timer1_Tick(object Sender, EventArgs e) < bmp1 = new Bitmap(Image.FromFile(«scrstart.png»)); Bitmap bmp2 = new Bitmap(w, h); using (Graphics g = Graphics.FromImage(bmp2)) < g.CopyFromScreen(x, y, 0, 0, new Size(w, h)); >pt = GetMismatchPoint(bmp1, bmp2); if (pt != null) < timer1.Enabled = false; player.Play(); this.WindowState = FormWindowState.Normal; this.TopMost = true; >>
И если оно отличается, то останавливает таймер, запускает музыку, а окно выскаивает на передний план. Тут интересный момент: сравнивать попиксельно нерационально и ресурсоемко. Поэтому возьмем готовый класс оболочку ImageWrapper и используем вот такой метод:
Point? GetMismatchPoint(Bitmap bmp1, Bitmap bmp2)
Работает очень шустро и не напрягает процессор: загрузка процессора 0 процентов, а паямти — 7 МБ. Не так уж и много, не правда ли? Еще один момент. Заказчик попросил, чтобы программа воспроизводила звук на полную громкость. Я не придумал ничего лучшего, как просто воспользоваться аппаратными методами:
private const int APPCOMMAND_VOLUME_MUTE = 0x80000; private const int APPCOMMAND_VOLUME_UP = 0xA0000; private const int APPCOMMAND_VOLUME_DOWN = 0x90000; private const int WM_APPCOMMAND = 0x319; [DllImport(«user32.dll»)] public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); private void VolUp() < for (int i=0; i>
Работает? Ура, все работает. Задаем окном некий участок экрана и заставляем програму следить за ним. Отправляем заказчику приложение и . и не работает.
Оказывается, на компьютере заказчика программа сразу же выдавала алерт — как будто что-то на экране изменилось. Но не изменялось ничего. В чем может быть проблема?
На первый взгляд ничего не должно глючить — просто нечему. Никакой привязки к железу, системе или разрешению экрана нет. Первая мысль была такой: возможно, что программа не успевает прочитать и занести в битмап первое изображение и соответственно, сравнивает разные вещи. Однако, сделал задержку таймера до 10 секунд — когда точно уже все должно успеть обработаться даже на самых слабых машинах — результат был одинаковый. То есть не работает так, как надо.
Продолжаем копать дальше. Переносим программу на другой ноутбук – чтобы понять, почему все происходит – там тоже не работает! Срабатывание оповещения в программе происходит из-за того, что картинки кажутся её разными. Давайте попробуем сравнить их, то есть заставим сохранить и второе изображение на диск. Реализуем и…видим кое-что интересное:
Слева – первоначальный кусок экрана, справа – полученный через одну секунду. Как видим, тут есть тень от picturebox – вот поэтому и приложение не признает изображения одинаковыми. Как решить проблему? Все просто: убираем по 10 пикселей справа и снизу – чтобы не захватывать тень при скриншоте. И ура – все заработало!
Итак, если вам требуется написать программу на заказ для личного пользования, создать простого бота или что-то еще, то вы всегда можете написать мне. Мои расценки невысоки.
Автор этого материала — я — Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML — то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
заметки, си шарп, личное, услуги, программы
Источник: upread.ru
Бесплатный онлайн-интенсив «Пишем нейросеть для слежки и распознавания предметов»
С 14 по 16 декабря 2020 года пройдёт бесплатный онлайн-интенсив «Пишем нейросеть для слежки и распознавания предметов». Участники интенсива научатся работать с компьютерным зрением — программой, которая выделяет объекты на изображениях и видео и распознаёт их. Изучат азы Python, познакомятся с предобученными нейросетями и напишут приложение для анализа информации с камер видеонаблюдения. Мероприятие подойдёт новичкам, аналитикам и начинающим программистам.
Программа
- 1-ый день ‒ Изучаем основы Python для работы с нейросетями:
- Области применения компьютерного зрения. Задачи, которые можно решать с его помощью.
- Архитектура технологии Object Detection.
- Введение в Python. Для чего он нужен и чем отличается от других языков программирования.
- Работа в Colab. Запускаем код для работы с изображением в браузере.
- Как устроены изображения и видео изнутри.
- Применение фильтров. Добавление информации в медиафайлы.
- Домашнее задание.
- Разбор домашнего задания.
- Как создавать модели для распознавания объектов на изображениях.
- Использование нейросети для решения задачи Object Detection.
- Применение модели на датасете изображений и видеозаписей.
- Структурирование информации об объектах для последующей обработки.
- Измерение качества алгоритма выделения объектов.
- Конкурсное домашнее задание.
- Написание кода для определения количества объектов в кадре.
- Разработка программы для анализа свободного места в кадре.
- Подключение программы к публичному стриму.
- Разбор конкурсного домашнего задания, выбор лучших работ и подведение итогов.
Преподаватель
Никита Левашов — Технический директор в Lia:
- Более 7 лет опыта разработки на Python.
- Занимается разработкой виртуальных ассистентов и ПО для банков.
- Эксперт по машинному обучению и NLU.
Ссылка на сайт интенсива.
Источник: berza.ru