Учет и контроль реализации обработки информации на примере ООО "ЭККО-РОС"

Роль и место комплекса задач в экономической информационной системе, технико-экономическое обоснование автоматизации обработки информации. Характеристика и анализ существующей организации обработки информации по комплексу задач на объекте управления.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 29.06.2012
Размер файла 5,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

4. Повышение достоверности информации.

5. Повышение оперативности и эффективности управления, которое достигается благодаря своевременному представлению сведений, получаемых в результате решения задачи, в соответствующие подсистемы, использующие их для решения задач.

Однако, при этом оказывается влияние, как было сказано выше, на производственно-хозяйственную деятельность. Можно выделить следующие направления совершенствования производственно-хозяйственной деятельности:

1. Снижение издержек, связанных с использованием большого количества бумажных носителей для передачи информации.

2. Экономия трудовых ресурсов - появилась возможность создания электронного документооборота, что снижает количество ручных операций

Заключение

При разработке проекта была проанализирована предметная область, рассмотрен существующий вариант обработки информации.

Использование информационных систем для управления предприятием делает любую компанию более конкурентоспособной за счет повышения ее управляемости и адаптируемости к изменениям рыночной конъюнктуры. Подобная автоматизация позволяет:

• повысить эффективность управления компанией за счет обеспечения руководителей и специалистов максимально полной, оперативной и достоверной информацией на основе единого банка данных;

• улучшить делопроизводство при помощи оптимизации и стандартизации документооборота, автоматизации наиболее трудоемких его процедур;

• снизить расходы на ведение дел за счет автоматизации процессов обработки информации, регламентации и упрощения доступа сотрудников компании к нужной информации. Изменить характер труда сотрудников, избавляя их от выполнения рутинной работы и давая возможность сосредоточиться на профессионально важных обязанностях;

• руководителям среднего и нижнего звеньев анализировать деятельность своих подразделений и оперативно готовить сводные и аналитические отчеты для руководства и смежных отделов;

• повысить эффективность обмена данными между отдельными подразделениями и директором;

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

Произведенные расчеты позволяют признать проект эффективным, экономически выгодным. Срок окупаемости единовременных затрат на проектирование составляет, по подсчетам около десяти месяцев. Это достаточно большой период времени для современных быстроизменяющихся аппаратных и программных технологий, однако дальнейшая комплексная автоматизация предприятия позволит получить в разы большую экономию средств и уменьшит общий срок, необходимый для окупаемости проектов. Запланированное включение этого и других комплексов задач в единую автоматизированную управленческую систему предприятия явит собой качественно новый уровень управления, который максимально использует всю имеющуюся на предприятии информацию из различных подсистем, сливает ее воедино, дает мощнейший аналитический материал для принятия правильных и своевременных решений.

информация обработка экономический

Список литературы

1. Справочник разработчика АСУ/ Под ред. Н. П. Федоренко и В.В. Карибского. - М.: Экономика, 1978.

2. АСУ-Труд: Учеб. пособие для вузов / Под ред. Г.А. Титоренко. - М.: Экономика, 1991.

3. Экономика предприятия: Учебник/ под ред. проф. О.И. Волкова. - М.: ИНФРА-М, 2000.

4. Типовые проектные решения автоматизированных систем управления предприятиями. Подсистема технико-экономического планирования. М., Статистика, 1975, 312 с.

5. Автоматизированные информационные технологии в экономике: Учебник, под ред. Г.А. Титоренко. - М.: Компьютер, ЮНИТИ, 1998

6. Ковалев А.И Экономика предприятия, - М., 1999.

7. Сидоренко Ю. А. Система функциональных расчетов в АСУП: Монография. -Н. Новгород: Изд-во ННГУ, 1995.

8. Батищев Д. И., Макарова Л. Г., Горшкова Л. А. Теория проектирования систем машинной обработки экономической информации: Учебное пособие. - Горький: ГГУ, 1987.

9. Дудорин В. И., Соломатин Н. А. Автоматизированные системы управления предприятием и объединениями: разработка, внедрение, развитие. - М.: Финансы, 1989.

10. Сухотина М.Б. Определение экономической эффективности машинной обработки информации. - Горький: ГГУ, 1981.

11. Синица Л.М. Организация производства, Минск, 2003г.

12. Бабич Т.Н., Э.Н. Кузьбожев Планирование производства, М, Кнорус, 2005г.

Приложение 1. Организационная структура предприятия

Схема. 3. Организационная структура ООО «ЭККО-РОС»

Приложение 2. Схема материально-вещественных потоков

Схема. 4. Схема движения материально - вещественных потоков

Приложение 3. Формы входной и выходной информации

Графический отчет «О посещаемости»

Рис. 14 Графический отчет «О посещаемости»

Отчет «О посещаемости»

Запрос1

Год

Все

Месяц

Янв-Май, Дек

День

Все

День недели

Все

Час

Все

Время

(07.12.2011;28.05.2012)

ArgusShop-1Вход

ArgusShop-1Выход

0-00 - 1-00

11

41

1-00 - 2-00

4

20

2-00 - 3-00

2

10

3-00 - 4-00

0

0

4-00 - 5-00

0

0

5-00 - 6-00

1

3

6-00 - 7-00

78

40

7-00 - 8-00

351

261

8-00 - 9-00

547

351

9-00 - 10-00

1224

862

10-00 - 11-00

1624

1223

11-00 - 12-00

1872

1510

12-00 - 13-00

2027

1936

13-00 - 14-00

2377

2406

14-00 - 15-00

2928

2551

15-00 - 16-00

2236

2156

16-00 - 17-00

2584

1839

17-00 - 18-00

1560

1792

18-00 - 19-00

983

1354

19-00 - 20-00

587

932

20-00 - 21-00

434

644

21-00 - 22-00

278

480

22-00 - 23-00

66

150

23-00 - 24-00

26

69

Графический отчет « О выручке с каждого посетителя»

Рис. 15 Графический отчет « О выручке с каждого посетителя»

Графический отчет «Процент покупателей»

Рис. 16 Графический отчет «Процент покупателей»

Графический отчет «Сравнение посещаемости за периоды времени»

Рис. 17 Графический отчет «Сравнение посещаемости за периоды времени»

Файл «Статистика посещаемости»

Date_Time

+/-

20110520_07:40:30

+

20110520_07:40:30

+

20110520_07:40:30

-

20110520_07:40:30

+

20110520_07:40:31

-

20110520_07:40:32

+

20110520_07:40:33

+

20110520_07:40:34

-

20110520_07:40:35

-

20110520_07:40:36

-

20110520_07:40:37

+

20110520_07:40:38

+

20110520_07:40:39

+

20110520_07:40:40

+

20110520_07:40:41

+

20110520_07:40:42

-

20110520_07:40:43

+

20110520_07:40:44

-

20110520_07:40:45

-

20110520_07:40:46

-

20110520_07:40:47

-

20110520_07:40:48

+

20110520_07:40:49

+

20110520_07:40:50

-

20110520_07:40:51

-

20110520_07:40:52

+

20110520_07:40:53

+

20110520_07:40:54

+

20110520_07:40:55

-

20110520_07:40:56

-

20110520_07:40:57

+

Файл « Выручка»

Год

Месяц

Рубли

2011

01

753545

2011

02

1234789

2011

03

980650

2011

04

8405432

2011

05

1100235

2011

06

784563

2011

07

849310

2011

08

632490

2011

09

1054120

2011

10

1100329

2011

11

952450

2011

12

1232544

Файл «Чеки»

Год

Месяц

Кол-во чеков

2011

01

780

2011

02

895

2011

03

698

2011

04

954

2011

05

753

2011

06

649

2011

07

950

2011

08

712

2011

09

890

2011

10

932

2011

11

723

2011

12

989

Приложение 4. Реализация контрольного примера

Запускаем vCount 4.62 и заходим в меню Конфигуратора

Конфигуратор позволяет произвести полную настройку системы vCount. По окончании редактирования параметров программы не забудьте нажать кнопку «Сохранить и выйти».

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

Рис. 18 Аутентификация

Общие. Рассмотрим подробно имеющиеся параметры и их предназначение:

Рис. 19 Конфигуратор

Идентификатор магазина

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

Символ «-» является специальным, и, используя его, можно создать иерархическую структуру магазинов, которая будет отображаться в Графическом отчете. Например, чтобы получить иерархию, представленную на Рис. 38, нужно именовать магазины следующим образом:

? argus-moscow-shop1

? argus-nn-shop1

? argus-nn-shop2

? argus-nn-shop3

Рис. 20 Объекты

Время работы магазина

Предусмотрена возможность указывать интервал работы системы. Это сделано для того, чтобы не перегружать систему в нерабочее время или не производить подсчет персонала после закрытия магазина, который может сильно влиять на истинную статистику. Если подсчет должен производиться без перерыва, то нужно поставить галочку «Круглосуточно».

Административное логирование работы системы также производится только в выбранный временной интервал.

Настройка отчетов

Отчеты содержат информацию о времени каждого прохода. Отчеты могут автоматически отправляться по электронной почте на любое количество электронных адресов и копироваться в выбранную папку (в том числе, в сетевую папку - см. пункт «Копировать отчеты в выбранную папку» ниже). Более подробная информация о работе с отчетами может быть получена в разделе «Дешифратор отчетов».

Можно настроить следующие параметры отсылки отчетов:

1. Частота создания отчетов. Этот пункт позволяет указать, как часто система должна посылать отчет.

2. Указать моменты создания отчетов. Если поставить этот флаг, то пункт 1 станет неактивным, и можно будет через запятую перечислить моменты времени, в которые должна происходить отсылка в формате «ЧЧ:ММ, ЧЧ:ММ».

Несмотря на то, что можно указывать моменты времени с интервалом менее часа, отчеты будут создаваться только в начале текущего часа (т.е. в ЧЧ:00). Например, если указать такие моменты создания отчетов: “00:00, 17:34, 17:36, 18:59”, в течение суток будет создано 3 отчета:

1. за интервал 00:00-17:00, который будет отправлен в 17:34;

2. в 17:36 отчет создан не будет;

3. за интервал 17:00-18:00, который будет отправлен в 18:59;

4. за интервал 18:00-00:00, который будет отправлен в 00:00.

3. Отправлять все новые данные с прошлого успешного отчета. Пункт «Время отправления отчетов» задает время, когда отчеты будут отправляться по электронной почте или копироваться в выбранную папку. Если флаг установлен, то система отправит все имеющиеся данные с момента прошлого успешно отправленного отчета. Если флаг не установлен, то при достижении очередного момента отправки отчета, будут отправлены данные лишь за период с момента попытки отправки прошлого отчета (даже в том случае, если по каким-то причинам, например, проблемы в сети, прошлый отчет не был отправлен).

Способы доставки

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

1. Кому - список адресов-получателей отчета, адреса вводятся через запятую;

2. Отправить тестовое письмо - для проверки правильности ввода параметров электронной почты Вы можете нажать кнопку «Отправить тестовое письмо». Тестовое письмо будет отправлено на все адреса, указанные в поле «Кому». По окончании операции появится диалог с результатом тестовой отправки.

3. Копировать отчеты в выбранную папку. Установка этого флага и указание папки в поле ниже позволяют накапливать все отчеты в одном месте, на основе чего можно достаточно просто организовать резервное копирование. Папку можно выбрать в диалоге, кликнув на кнопку «» около поля ввода или ввести вручную. Можно указывать как локальную, так и сетевую папку. Сетевую папку следует указывать в формате: \\<имя узла>\<имя папки>.

Безопасность

Отчеты, посылаемые в центральный офис, зашифровываются с использованием пароля, введенного в поле «Пароль для отчета». Однако для повышения безопасности и предотвращения злонамеренного искажения данных работниками магазина пароль хранится в зашифрованном. Поэтому перед тем, как нажать кнопку «Сохранить и выйти» необходимо зашифровать пароль, нажав на кнопку «Зашифровать».

Администратор центрального офиса может попросить магазины сменить пароль, используемый для шифрования отчетов. При этом администратор просто рассылает в магазины содержимое поля «Зашифрованный пароль», которое в магазине должны будут ввести в аналогичное поле в локальных утилитах настройки. Таким образом, расшифровать отчеты может только тот, кому известен пароль, введенный администратором;

Также этот пароль используется для аутентификации при входе в Конфигуратор и в Калибратор.

Настройка электронной почты

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

1. От кого - адрес, который будет отображаться в поле «От кого» письма, полученного в головном офисе (электронный адрес, используемый для отправки писем);

2. SMTP сервер - адрес smtp-сервера, через который будет отправлено письмо;

3. Число попыток отправки отчета - максимальное число попыток отправки электронного письма с отчетом о числе посетителей. Пауза после неудачной попытки - 10 секунд;

4. Использовать аутентификацию - флажок должен быть поставлен в том случае, когда smtp-сервер требует указать имя пользователя и пароль для отправки писем;

5. Имя пользователя - имя пользователя электронного ящика;

6. Пароль - пароль электронного почтового ящика;

7. Использовать безопасное SSL соединение - флажок должен быть поставлен в том случае, когда smtp-сервер требует использовать безопасное ssl соединение.

Настройка камер

Проход

Система vCount поддерживает одновременный подсчет посетителей, проходящих через несколько входов. Для создания и удаления проходов используются кнопки «Добавить» и «Удалить». Для изменения параметров прохода необходимо в выпадающем списке «Выбор проходов» выбрать интересующий Вас проход, после чего установить параметры работы системы на нем.

Рис. 21 настройка камеры

Камера

Для каждого прохода необходимо выбрать камеру, с которой система будет получать видеосигнал. Для этого, во-первых, необходимо выбрать тип камеры. Система vCount поддерживает работу со следующими типами камер:

? DirectShow-камеры;

? IP-камеры, поддерживающие протокол MJPEG;

? Видеофайлы, содержащие запись видео с камер.

? ITV камера, осуществляющая интеграцию с системами ITV Intellect и VideoIQ7.

В случае DirectShow необходимо выбрать в выпадающем списке «DirectShow источники» необходимую камеру. Если вы подключили многоканальную плату, то в списке появится столько устройств, на сколько каналов рассчитана плата.

Рис. 22 Администрирование

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

Уведомления

1. Кому - список адресов-получателей административного отчета, адреса вводятся через запятую;

2. Отправить тестовое письмо - для проверки правильности ввода параметров электронной почты Вы можете нажать кнопку «Отправить тестовое письмо». Тестовое письмо будет отправлено на все адреса, указанные в поле «Кому». По окончании операции появится диалог с результатом тестовой отправки.

3. Немедленно посылать письмо после логируемого события. При установленной галочке система будет посылать сообщения по почте каждый раз, как происходит ошибка.

4. Посылать сводные административные отчеты. Установка галочки позволит получать сводный административный лог по почте через установленный промежуток времени.

5. Частота посылки сводных отчетов (в днях). Промежуток времени, через который будут посылаться сводные отчеты.

6. Включение/выключение сервиса подсчета. Посылать по почте сообщения о включении/выключении Сервиса подсчета посетителей.

7. Длительное отсутствие проходов людей. Уведомление о данной ситуации поможет детектировать ситуации, препятствующие подсчету, такие как поворот камеры в потолок.

8. Максимальный период отсутствия проходов. Значением этого параметра должно быть минимальное время, за которое происходит хотя бы один человек.

9. Проблемы с камерой. Если система обнаружит, что объектив камеры был чем-либо закрыт, или был потерян сигнал с камеры, то будет отправлено сообщение по почте.

10. Глубина хранения лога (в днях). Можно настроить число дней, в течение которых сообщения хранятся в логе. Это сделано для того, чтобы административный лог не занимал много места на диске.

Просмотр лога

Содержимое лога зашифровано, поэтому открытие файла лога в любом текстовом редакторе не даст возможности его просмотреть и редактировать. Для просмотра лога на форме Конфигуратора предусмотрено текстовое поле.

Калибратор

Калибратор (Calibrate.exe) предназначен для определения оптимальных параметров алгоритма подсчета vCount. Данное приложение позволяет подобрать параметры работы алгоритма подсчета людей, подходящие именно для Вашего помещения, поскольку все помещения уникальны, различаясь условиями освещенности прохода, отражательной способностью пола, положением видеокамеры и другими параметрами.

Система vCount распространяется с предустановленными параметрами (так называемые, пресеты, см. пункт «Пресеты» раздела «Конфигуратор»), которые хорошо подходят для многих случаев, однако для обеспечения наиболее высокого качества работы рекомендуется провести процедуру калибровки для условий Вашего конкретного помещения.

Процедура калибровки

Общая последовательность действий следующая:

1. Создание калибровочных видеофайлов.

При помощи функции видеонаблюдения (раздел «Использование функции видеонаблюдения») создается несколько роликов с записью реальной работы магазина. Рекомендуется создать видеозапись проходов за целый день.

2. Проверка качества подсчета с параметрами по умолчанию.

После сохранения достаточного количества видеороликов (рекомендуемое количество видео - один полный день работы) можно приступить к тестированию системы и ее обучению при необходимости. Для этого запускается приложение Calibrate, которое доступно через меню Пуск > Все программы > vCount > Калибратор, также приложение можно найти в директории, куда был установлен vCount.

Процедура калибровки запускается простым указанием одного или нескольких видеофайлов, для этого выберите пункт меню Файл > Открыть видео, либо можно нажать кнопку с изображением папки на панели инструментов. При этом если в Конфигураторе было создано несколько проходов, появится окно «Выбор прохода», в котором необходимо выбрать проход, который Вы собираетесь откалибровать.

Обращаем Ваше внимание, что существует возможность указать сразу несколько роликов, поскольку использование большего их числа позволяет повысить качество работы алгоритма распознавания. Сразу после выбора видеофайлов приложение начнет их анализ. По завершении система выведет на экран записи зарегистрированных проходов людей и свои варианты относительно того, сколько человек прошло в каждом эпизоде (Рис. 44).

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

Графический отчет

Функциональность системы

Приложение Графический отчет предназначено для создания разнообразных аналитических отчетов на основе данных о количестве посетителей, получаемых системой vCount. Основной задачей данного приложения является создание и анализ отчетов за различные временные интервалы. Отчеты содержат информацию о количестве покупателей, вошедших в помещение, вышедших из него, и находящихся в настоящий момент внутри. Для наглядности информация о динамике потока посетителей представляется в форме линейных графиков и гистограмм.

Кроме этого, приложение обладает рядом дополнительных возможностей:

1. Представление отчетов как в графическом, так и в табличном виде;

2. Вывод отчетов на печать;

3. Экспорт отчетов в Microsoft® Excel.

Приложение Графический отчет является многооконным. Главное окно системы представлено на Рис. 51.

Рис. 23 Главное окно Графических отчетов

С помощью элементов управления окна производятся следующие операции: создание отчета, редактирование, печать и так далее.

Указание источника данных

Приложение Графический отчет может использоваться как непосредственно на компьютере со счетчиком vCount, так и в центральном офисе. В первом случае приложение будет получать статистические данные из локальной папки с отчетами, которые создает Сервис подсчета посетителей, а во втором - из отчетов, присылаемых в офис по e-mail, которые помещаются в базу данных. Поэтому приложение Графический отчет поддерживает два типа источника данных. В зависимости от того где работает приложение, автоматически используется соответствующий тип источника, второй является недоступным.

1. Директория с отчетами. Этот режим используется в магазинной версии, то есть непосредственно на машине со счетчиком. Для того, чтобы установить необходимый путь, нужно выбрать пункт Настройки > Источник данных. При этом появится окно «Источник данных», в котором необходимо выбрать пункт «Папка с отчетами», указать папку, в которой находятся отчеты и нажать кнопку «Сохранить».

2. База данных Microsoft SQL Server. Этот режим используется в офисной версии на компьютере, куда посылаются отчеты со всех счетчиков сети. Для работы в этом режиме необходимо просто выбрать пункт «База данных» в окне «Источник данных».

Рис. 24 Выбор источника статистических данных

Загрузка отчетов в базу данных

Как правило, отчеты загружаются в базу данных автоматически, но иногда требуется поместить уже имеющуюся директорию с отчетами. Так, например, следует поступать для загрузки информации со счетчика, на котором нет подключения к Интернет.

При необходимости загрузить в базу данных информацию из набора отчетов, необходимо воспользоваться приложением «Загрузчик отчетов в БД vCount», которое входит в комплект поставки офисной версии vCount. Прежде всего, необходимо указать пароль для отчетов в Конфигураторе офисной версии. После этого нужно запустить приложение «Загрузчик отчетов в БД» (это можно сделать, кликнув на ярлык в меню Пуск) и указать ему папку с отчетами, информация автоматически будет загружена в базу данных.

Рис. 25 Приложение Загрузчик отчетов в БД

Анализ непрерывных промежутков времени

Для создания отчета за период выберите пункт Файл > Построить новый график главного меню. После чего откроется окно «Параметры», позволяющее указать временной интервал и другие характеристики отчета.

Рис. 26 Таблица

Работа с графиком

Вы можете увеличить какую-либо часть графика при необходимости. Для этого, удерживая нажатой левую клавишу мыши, выделите область на графике и отпустите клавишу. Чтобы отменить это действие выберите в контекстном меню один из пунктов «Отменить последнее масштабирование» или «Отменить все масштабирование».

При наведении курсора мыши на какой-либо столбец гистограммы на экране появляется подсказка, показанная на Рис. 57.

Рис. 27 Всплывающая подсказка при наведении мышью на столбец гистограммы

Для того чтобы отключить подсказку, снимите галочку напротив пункта «Отображать значения точек» контекстного меню.

Кроме того, можно отключить отображение числовых меток над столбиками. Для этого снимите галочку в пункте «Отображать метки» контекстного меню. При этом график примет вид, показанный на Рис. 58.

Рис. 28 Вид графика с выключенными метками

Для изменения параметров отчета выберите пункт Настройки > Установить параметры. При этом снова появится уже знакомое Вам окно выбора параметров (Рис. 54). Управление окнами осуществляется через пункт «Окно» главного меню.

Сравнение нескольких графиков

В одном окне может отображаться несколько графиков. Единственное ограничение при этом состоит в следующем: длины временных интервалов должны быть одинаковыми. Для того чтобы отобразить несколько графиков в одном окне, Вам необходимо построить их в разных окнах, после чего, используя механизм drag-n-drop (средней кнопкой мышки), переместить их в одно окно. Пример отображения нескольких гистограмм приведен на Рис. 59.

Рис. 29 Отображение нескольких отчетов в одном окне

Эту же операцию можно проделать с помощью пунктов контекстного меню «Копировать» и «Вставить».

Распечатка изображения

Для печати изображения выберите пункт «Печать» контекстного меню, а для сохранения Вы можете выбрать либо пункт «Сохранить рисунок как…» контекстного меню, либо Файл > Сохранить изображение.

Чтобы сохранить таблицу с данными Вы можете воспользоваться пунктом Файл > Сохранить данные. При этом данные отчета будут сохранены в табличном виде в файле *.csv. Кроме того, с помощью пунктов Правка > Копировать изображение и Правка > Копировать данные можно скопировать изображение либо табличные данные в буфер.

В меню «Правка» есть еще один пункт - «Настройки шрифтов». С его помощью можно выбрать шрифт и размер кегля для заголовка, подписей осей, легенды и так далее.

Анализ усредненной статистики за различные временные промежутки

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

Для создания нового запроса выберите пункт Файл > Новый запрос главного меню. После чего откроется окно «Редактор запросов», изображенное на Рис. 60.

Рис. 30 Редактор запросов

Окно «Редактор запросов» состоит из двух частей. В левой части окна расположены параметры запроса, а в правой графически отображается его результаты. Настройки отображения графика, как и в случае построения отчетов, задаются либо через контекстное, либо через главное меню.

При нажатии на кнопку, расположенную по центру окна и обозначенную символом «<», панель параметров сворачивается и окно «Редактор запросов» принимает вид, представленный на Рис. 61. Для того чтобы развернуть панель параметров, необходимо еще раз нажать на эту кнопку.

Рис. 31 Изменение размера панели параметров

Рассмотрим более подробно параметры запроса и порядок их выбора.

Основные параметры при создании запросов совпадают с параметрами при анализе непрерывных промежутков времени (см. «Указание параметров»). Во-первых, необходимо выбрать тип графика. Их, также как и в случае построения отчетов, четыре: «Вход», «Выход», «Вход и выход» и «Число посетителей».

Оси координат

После этого необходимо установить параметры осей X и Y. Рассмотрим несколько примеров. Допустим, Вам необходимо выбрать день недели для проведения некоторой маркетинговой акции. Хотелось бы, чтобы в этот день магазин посетило максимальное количество посетителей. Для определения такого дня, Вам необходимо построить распределение статистики о посетителях по дням недели. Это важно, потому что например летом в выходные поток посетителей существенно меньше чем в будни. Или, например, для определения расписания работы касс необходимо знать распределение числа посетителей по часам.

Ось Y определяется одним из четырех значений: «Среднее», «Сумма», «Минимум» и «Максимум». Допустим, Вы строите распределение по дням недели. В накопленной статистике за выбранный период может быть информация за несколько недель, то есть в данных содержится информация за несколько понедельников, вторников и так далее. Пусть Вас интересуют данные только за понедельники. Тогда, значение «Среднее» будет соответствовать среднему количеству посетителей по понедельникам, «Сумма» суммарному количеству посетителей за все понедельники, а «Минимум» и «Максимум» соответственно минимальному и максимальному количеству посетителей за этот день.

При построении распределения по годам необходимо учитывать, что изменение параметра оси Y не влияет на запрос. При любом значении этого параметра высота столбца будет соответствовать суммарному количеству посетителей за соответствующий год.

Указание интересующих периодов времени

Вы можете построить запрос на основе только некоторой части накопленной статистики. Так, например, можно использовать статистику только за какой-либо год или месяц. Для этого необходимо выбрать интересующие Вас года, месяцы, дни, дни недели и часы с помощью кнопок редактирования в нижней части панели параметров.

Рис. 32 Редактирование временного интервала

Например, при нажатии на кнопку редактирования, соответствующую выбору месяцев, откроется окно «Месяц», изображенное на Рис. 63. Используя это окно можно выбрать лишь интересующие Вас месяцы.

Рис. 33 Окно «Месяц»

Внизу панели параметров находится кнопка «Изменить временной интервал», позволяющая изменить границы используемого временного интервала. Изначально, границы соответствуют максимальному временному интервалу, за который имеется статистика. При нажатии на эту кнопку откроется окно «Изменить интервал», с помощью которого можно изменить границы временного интервала.

Рис. 34 Изменение границ временного интервала

После установки всех описанных выше параметров необходимо нажать на кнопку «Выполнить», после чего в правой части окна «Редактор запросов» будут графически отображены результаты выполненного запроса, как, например, на Рис. 65 среднее число посетителей по дням недели или на Рис. 66 среднее число посетителей по часам.

Рис. 35 Среднее число посетителей по дням недели

Рис. 36 Среднее число посетителей по часам

Результаты запроса можно сохранить в .csv файл для последующего просмотра и редактирования в программе Microsoft® Excel. Для этого необходимо выбрать пункт главного меню Файл > Сохранить данные.

Рис. 37 Пример сохранения данных запроса

Сравнение нескольких запросов

На одном графике могут отображаться результаты нескольких запросов, главным условием является лишь одинаковый тип оси X. Для добавления еще одного запроса, необходимо нажать кнопку «Добавить» в нижней части панели параметров, после чего установить параметры нового запроса и нажать на кнопку «Выполнить». При этом, однако, нельзя будет изменить тип оси X.

Рис. 38 Добавление нового запроса

Рис. 39 Выбор параметров построения графика

Указание параметров

· Тип графика. Существует три типа: «Вход», «Выход» и «Вход и выход». Каждый из них отвечает за отображение соответствующей информации: «Вход» - информации о вошедших посетителях, «Выход» - информация о вышедших посетителях, «Вход и выход» отвечает за отображение количества вошедших и вышедших посетителей на одном графике.

· Способ отображения объектов. Если выбрать сумма, то статистика со всех камер будет просуммирована, в противном случае каждой камере будет соответствовать свой график.

· Объекты. Необходимо отметить галочками

· Интересующий период

o Продолжительность. Этот параметр соответствует длине интересующего временного интервала. Можно выбрать один из пяти предоставляемых вариантов: «День», «Неделя», «Месяц», «Квартал» и «Год». Если ни один из этих вариантов Вам не подходит, выберите значение «Произвольный».

o Начало. Дата начала временного интервала.

o Окончание. Дата окончания временного интервала.

o Шаг. Единицы времени, по которым разбивается статистика.

После выбора параметров необходимо нажать кнопку «Нарисовать график», после чего появится окно, содержащее нужный график.

Рис. 40 Гистограмма количества вошедших посетителей

Щелкнув на вкладке «Таблица», можно переключиться к табличному предсталению информации о проходах (Рис. 56). Данные из этой таблицы могут быть частично или полностью скопированы в различные редакторы таблиц, например Microsoft Excel.

Приложение 5. Программная документация

Назначение

Программа обеспечивает решение задачи «Учет и анализ посещаемости торговых центров», а именно решение таких задач как:

Подсчет количества вошедших посетителей за период.

Подсчет количества вышедших посетителей за период.

Расчет процента покупателей от общего числа посетителей.

Расчет выручки на каждого посетителя.

Сравнение посещаемости за выбранные периоды.

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

Условия применения

При работе программы используются ПЭВМ (IBM совместимая) и принтер. Минимальные требуемые характеристики ПЭВМ:

* тактовая частота процессора - 1500Mhz;

* объем видеопамяти - 16 Mb;

* видеокамера подключенная к ПЭВМ;

* объем оперативной памяти - 512 Mb;

* объем свободного дискового пространства - 2000 Mb;

Требования к внешним программным средствам:

* 32-х или 64-х разрядная операционная среда - Microsoft Windows XP и выше;

Условия хранения программы:

* программа может храниться на магнитных и оптических носителях информации.

Описание задачи

Основной целью решения является автоматизация учета и анализа посещаемости торговых центров, а также организация своевременного обеспечения необходимой информацией сотрудников отдела маркетинга, что, в свою очередь ведет к снижению трудоемкости работ и увеличению достоверности информации.

Задача решается в оперативном режиме, по запросу пользователя.

Входные и выходные данные

Характер, организация и предварительная подготовка входных данных: в качестве входной информации используются входные сообщения, массивы нормативно - справочной информации. Массивы НСИ хранятся в БД и доступны пользователям. Входные сообщения генерируются автоматически при фиксации входа или выхода посетителя, предоставляются другими отделами.

Перечень входной информации:

- Файл «Статистика посещаемости

- Файл «Выручка»

- Файл «Чеки»

Перечень выходной информации:

- Отчет о посещаемости за период

- Отчет «Процент покупателей»

- Отчет «Выручка на каждого посетителя»

- Отчет «Сравнение посещаемости за выбранные периоды»

Программа «Учет и анализ посещаемости торговых центров»

#include "stdafx.h"

#include "cxcore.h"

#include "cv.h"

#include "highgui.h"

#include "CameraFactory.h"

#include "WorkingThread.h"

#include "..\\CoreDll\\pcount.h"

#include "Resources.h"

#include <time.h>

using namespace System;

using namespace System::Threading;

using namespace System::Drawing;

using namespace System::Drawing::Imaging;

using namespace System::Runtime::InteropServices;

using namespace System::IO;

using namespace System::Xml;

using namespace System::Windows::Forms;

using namespace PeopleCounterService;

using namespace PeopleCounterFunctions;

using namespace ClientLibrary;

#include "definitions.h"

#define INITIALCAMIDX 0

#define TrackBarName "Entrance"

#define WinName "Camera View"

int Value = INITIALCAMIDX;

int ValuePrev = INITIALCAMIDX;

int MaxEntrances = 0;

void OnMouse(int event, int x, int y, int flags, void* param)

{

if (event == CV_EVENT_LBUTTONDOWN)

{

if (Value != MaxEntrances-1)

Value++;

else

Value = 0;

cvDestroyWindow(WinName);

}

if (event == CV_EVENT_RBUTTONDOWN)

{

if (Value != 0)

Value--;

else

Value = MaxEntrances - 1;

cvDestroyWindow(WinName);

}

}

array<Byte> ^PackImage(const IplImage *_image, int width, int height, array<Byte> ^tmpArray, IplImage *tmpImg)

{

if (_image == NULL)

{

return nullptr;

}

IplImage *image = tmpImg;

if (image == NULL ||

image->width != width || image->height != height ||

image->depth != _image->depth || image->nChannels != _image->nChannels ||

image->origin != _image->origin)

{

image = cvCreateImage(cvSize(width, height), _image->depth, _image->nChannels);

image->origin = _image->origin;

}

cvResize(_image, image, CV_INTER_CUBIC );

if (image->nChannels * image->depth != 24)

{

//TODO: Write error log and exit

}

if (!strcmp(image->channelSeq, "RGB"))

{

cvCvtColor( image, image, CV_RGB2BGR );

}

if (image->origin)

{

cvFlip(image, image, 0);

image->origin = 0;

}

array<Byte>^ data = tmpArray;

if (data == nullptr || data->Length != image->imageSize)

{

data = gcnew array<Byte>(image->imageSize);

}

GCHandle handleOfArray = GCHandle::Alloc(data, GCHandleType::Pinned);

char *dstData = reinterpret_cast<char *>(Marshal::UnsafeAddrOfPinnedArrayElement(data, 0).ToPointer());

memcpy_s(dstData, image->imageSize, image->imageData, image->imageSize);

handleOfArray.Free();

if (image != tmpImg)

{

cvReleaseImage(&image);

image = NULL;

}

return data;

}

array <Byte>^ PackImage(const IplImage *_image, int width, int height)

{

return PackImage(_image, width, height, nullptr, NULL);

}

WorkingThread::WorkingThread(StatisticsServer ^_statisticsServer, int cameraIndex, bool isTest)

{

m_IsTest = isTest;

CultureManager::SetCurrentThreadCulture(Thread::CurrentThread);

m_isTimeToExit = false;

m_CamIdx = cameraIndex;

m_IplFrame = NULL;

StatisticsThread ^stat = gcnew StatisticsThread;

if (stat->LoadStatisticsMethod(cameraIndex))

{

dayReport = gcnew StringBuilder(stat->GetDayStatistics());

dayReportOut = gcnew StringBuilder(stat->GetDayStatisticsOut());

}

else

{

dayReport = gcnew StringBuilder("");

dayReportOut = gcnew StringBuilder("");

}

currentDay = DateTime::Now.Date;

statisticsServer = _statisticsServer;

statisticsServer->SetDayStatisticsDelegate(gcnew GetDayStatistics(this, &WorkingThread::GetDayStatisticsMethod), cameraIndex);

statisticsServer->RegisterGetCurrentCameraImageDelegate(gcnew GetCurrentCameraImageDelegate(this, &WorkingThread::GetCurrentCameraImage), m_CamIdx);

bool isSwitched = Convert::ToBoolean (XmlFunctions::GetCameraXML Parameter("/IsSwitched", m_CamIdx));

InitializeCounters(isSwitched);

m_params = new PCountModelParams;

if (Utilities::LoadPCountParameters((Int64)(m_params), cameraIndex))

{

m_counter = new PCount(*m_params, cameraIndex);

m_drawer = new PCountDrawer(*m_params, isSwitched);

}

else

{

m_counter = new PCount(cameraIndex);

m_drawer = new PCountDrawer(isSwitched);

}

m_IplFrame = NULL;

try

{

m_Camera = CameraFactory::Create(m_CamIdx);

m_VideoWriter.ReadParameters(m_CamIdx);

#if SONAR_ENABLED

m_SonarDataWriter.ReadParameters(m_CamIdx);

#endif

}

catch(Exception^ e)

{

Log::UpdateDevLog("Error: can't read parameters of cam. " + e->Message);

}

m_LastTimeClientUpdatted = DateTime::MinValue;

//TODO: better to load from settings

m_minUpdatePeriod = TimeSpan(0,0,0,0,200);

tmpImg = 0;

frameLock = gcnew Object;

}

WorkingThread::~WorkingThread()

{

if (m_params != NULL)

{

delete m_params;

m_params = NULL;

}

if (m_counter != NULL)

{

delete m_counter;

m_counter = NULL;

}

if (tmpImg != NULL)

{

delete tmpImg;

tmpImg = NULL;

}

}

void WorkingThread::SafeStartWorking()

{

try

{

StartWorking();

}

catch(Exception ^e)

{

Log::UpdateDevLog("Error in start working function. " + e->Message);

System::Diagnostics::Process::GetCurrentProcess()->Kill();

}

}

void WorkingThread::SendReportIfNeeded()

{

//Check date is the same as on the last iteration

DateTime^ startReportTime;

DateTime^ endReportTime;

DateTime^ curTime;

bool reportTime = false;

DateTime now = DateTime::Now;

//If it is time to send a report (IsItTimeToSendReport) OR

//save statistics to dat folder (currentDay->CompareTo(now->Date))

if ((reportTime = ReportWorker::IsItTimeToSendReport(startReportTime, endReportTime, curTime)) ||

currentDay->CompareTo(now.Date))

{

StatisticsThread^ stats = gcnew StatisticsThread;

//Block access to dayReport/Out

Monitor::Enter(this);

stats->SetDayStatistics(dayReport->ToString(), dayReportOut->ToString(), currentDay);

//save statistics to dat file every day

if (currentDay->CompareTo(now.Date))

{

stats->m_camIndex = m_CamIdx;

stats->SaveStatistics();

m_LastTimeReportSent = now;

//TODO: check the saving succeed

StatisticsThread ^stat = gcnew StatisticsThread;

if (stat->LoadStatisticsMethod(m_CamIdx))

{

dayReport = gcnew StringBuilder(stat->GetDayStatistics());

dayReportOut = gcnew StringBuilder(stat->GetDayStatisticsOut());

}

else

{

dayReport = gcnew StringBuilder("");

dayReportOut = gcnew StringBuilder("");

}

}

Monitor::Exit(this);

if (currentDay->CompareTo(now.Date))

{

currentDay = now.Date;

}

if (reportTime && endReportTime->CompareTo(startReportTime) > 0 && m_CamIdx == 0)

{

int number = Utilities::GetNumberOfEntrances();

array<String^>^ reportArchiveFiles = gcnew array<String^>(number);

array<String^>^ reportReadyToSendFiles = gcnew array<String^>(number);

array<String^>^ reportReadyToIndexFilse = gcnew array<String^>(number);

for (int i = 0; i < number; i++)

{

reportArchiveFiles[i] = ResourcesDepository::GetString("ArchiveFolderInProgramFiles") // User's backup folder

+ XmlFunctions::GetXMLParameter("/CounterParameters/ShopID")

+ "-"

+ (i+1).ToString()

+ "__"

+ DateStringConverter::GetCurrentFormattedTimeForFilename(startReportTime)

+ "__"

+ DateStringConverter::GetCurrentFormattedTimeForFilename(endReportTime)

+ ".dat";

reportReadyToSendFiles[i] = ResourcesDepository::GetString ("ReadyToSend FolderInProgramFiles") // This folder contains reports are going to send

+ XmlFunctions::GetXMLParameter("/CounterParameters/ShopID")

+ "-"

+ (i+1).ToString()

+ "__"

+ DateStringConverter::GetCurrentFormattedTimeForFilename(startReportTime)

+ "__"

+ DateStringConverter::GetCurrentFormattedTimeForFilename(endReportTime)

+ ".dat";

reportReadyToIndexFilse[i] = ResourcesDepository::GetString("Ready ToIndexFolderInProgramFiles") // This folder contains reports are going to index (cache)

+ XmlFunctions::GetXMLParameter("/CounterParameters/ShopID")

+ "-"

+ (i+1).ToString()

+ "__"

+ DateStringConverter::GetCurrentFormattedTimeForFilename(startReportTime)

+ "__"

+ DateStringConverter::GetCurrentFormattedTimeForFilename(endReportTime)

+ ".dat";

}

try

{

//Make sure the directories exist

Directory::CreateDirectory(ResourcesDepository::GetString("ArchiveFolderInProgramFiles"));

Directory::CreateDirectory(ResourcesDepository::GetString("ReadyToSendFolderInProgramFiles"));

Directory::CreateDirectory(ResourcesDepository::GetString("ReadyToIndexFolderInProgramFiles"));

stats->SetReportInterval(startReportTime, endReportTime);

stats->SetDaysStatisticsArray(statisticsServer->GetDayReportInArray(), statisticsServer->GetDayReportOutArray());

for (int i = 0; i < number; i++)

{

if (stats->GenerateReportMethod(true, (i+1).ToString()))

{

String ^report = stats->GetPeriodStatistics();

File::WriteAllText(reportArchiveFiles[i], report);

File::WriteAllText(reportReadyToSendFiles[i], report);

File::WriteAllText(reportReadyToIndexFilse[i], report);

}

}

ReportWorker::SendEmailAndCopyReport(reportReadyToSendFiles, curTime, endReportTime);

}

catch(Exception^ e)

{

Log::UpdateDevLog("Error: problems with reports saving. " + e->Message);

}

try

{

if (Convert::ToBoolean(XmlFunctions::GetXMLParameter("/CounterParameters/Reports/Server/Enabled")))

{

DateTime ^cur ;

for (cur = startReportTime; *cur <= *endReportTime; cur = cur->AddHours(1))

{

DateTime ^curNext = cur;

curNext = cur->AddHours(1);

int res = -1;

for (int camIdx = 0; camIdx < Utilities::GetNumberOfEntrances(); camIdx++)

{

ClientLib^ client = gcnew ClientLib( XmlFunctions::GetXMLParameter("/CounterParameters/Reports/Server/IP"),

XmlFunctions::GetXMLParameter("/CounterParameters/Reports/Server/Port"),

FileParameters^ _file = gcnew FileParameters();

_file->m_name = reportArchiveFiles[camIdx];

int in, out;

stats->GetStatFromFile(_file,*(DateTime^)cur,*(DateTime^)curNext,in,out);

if (in != 0 || out != 0)

{

Log::UpdateDevLog("Try to send: " + XmlFunctions::GetXMLParameter("/CounterParameters/ShopID") + camIdx.ToString() +

(*cur).ToString() + in.ToString() + out.ToString());

res = client -> SendPassages( XmlFunctions::Get XMLParameter("/CounterParameters/ShopID"),

}

ReportWorker::SetLastReportTime(cur,true);

}

}

}

}

catch (Exception^ e)

{

Log::UpdateDevLog("Error: problems with reports sending to report service. " + e->Message + "\n" + e->Source + "\n" + e->StackTrace);

}

}

}

}

void WorkingThread::SendShopStatusIfNeeded

{

if (Convert::ToBoolean(XmlFunctions::GetXMLParameter("/CounterParameters/Reports/Server/Enabled")))

{

DateTime now = DateTime::Now;

TimeSpan savePeriod = now - m_LastTimeShopStatusSent;

if (savePeriod.TotalSeconds >= 2)

{

try

{

ClientLib^ client = gcnew ClientLib( XmlFunctions::GetXMLParameter("/CounterParameters/Reports/Server/IP"),

int res = client->SetShopStatus(XmlFunctions::Get XMLParameter("/CounterParameters/ShopID"), true);

if (res != 0)

Log::UpdateDevLog("Error: problems with setting shop status. ");

}

catch (Exception^ e)

{

Log::UpdateDevLog("Error: problems with setting shop status. " + e->Message);

}

m_LastTimeShopStatusSent = now;

}

}

}

void WorkingThread::SaveStatisticsIfNeeded()

{

DateTime now = DateTime::Now;

TimeSpan savePeriod = now - m_LastTimeStatisticsSaved;

//we have to save statistics periodically for the case of power failure

if (savePeriod.TotalMinutes >= 10)

{

//save the statistics to a file

StatisticsThread ^stats = gcnew StatisticsThread;

//Block access to dayReport

Monitor::Enter(this);

stats->SetDayStatistics(dayReport->ToString(), dayReportOut->ToString(), currentDay);

Monitor::Exit(this);

stats->m_camIndex = m_CamIdx;

Thread ^reportThread = gcnew Thread(gcnew ThreadStart(stats, &StatisticsThread::SaveStatistics));

CultureManager::SetCurrentThreadCulture(reportThread);

reportThread->Start();

//TODO: check the saving succeed

m_LastTimeStatisticsSaved = now;

}

}

void WorkingThread::SendFrameAndCountersToAllClients(IplImage* frame) // отсылает картинку и число посетителей в граф клиент

{

if (m_minUpdatePeriod.CompareTo(DateTime::Now - m_LastTimeClientUpdatted) > 0)

{

return;

}

Object ^lockObj = packedImage;

if (lockObj != nullptr)

{

if (!Monitor::TryEnter(lockObj, 5))

{

//No luck, another thread is sending this image, try on the next iteration

return;

}

}

m_LastTimeClientUpdatted = DateTime::Now;

DateTime ^now = DateTime::Now;

int imageWidth = statisticsServer->GetWidth();

int imageHeight = statisticsServer->GetHeight();

if (statisticsServer->HaveClients())

{

bool drawGrid = statisticsServer->GetDrawGrid();

bool showCounters = statisticsServer->GetShowCounters();

if (tmpImg == 0 ||

tmpImg->width != imageWidth || tmpImg->height != imageHeight ||

tmpImg->depth != frame->depth || tmpImg->nChannels != frame->nChannels ||

tmpImg->origin != frame->origin)

{

if (tmpImg != 0)

{

IplImage *p = tmpImg;

cvReleaseImage(&p);

tmpImg = 0;

}

tmpImg = cvCreateImage(cvSize(imageWidth, imageHeight), frame->depth, frame->nChannels);

tmpImg->origin = frame->origin;

}

if (drawGrid || showCounters)

{

CvSize size = cvSize(frame->width, frame->height);

IplImage *grid = cvCreateImage(size, frame->depth, frame->nChannels);

grid->origin = frame->origin;

cvCopy(frame, grid);

if (drawGrid)

{

m_drawer->DrawGrid(grid);

}

if (showCounters && !this->statisticsServer->GetIsAllEntrances())

{

m_drawer->ShowCounters(grid, *m_currentCount);

}

packedImage = PackImage(grid, imageWidth, imageHeight, packedImage, tmpImg);

cvReleaseImage(&grid);

}

else

{

packedImage = PackImage(frame, imageWidth, imageHeight, packedImage, tmpImg);

}

}

int samples1 = m_counter->GetNumberOfSamples(1);

int samples2 = m_counter->GetNumberOfSamples(2);

statisticsServer->UpdateFrameAndCounter(

packedImage,

*m_currentCount,

*m_currentCountOut,

imageWidth,

imageHeight,

samples1,

samples2, m_CamIdx);

*m_count1 = m_counter->GetCurrentCount();

*m_count2 = m_counter->GetCurrentCountOut();

if (m_lastCount != (*m_currentCount) || m_lastCountOut != (*m_currentCountOut))

{

//Add new users to the list

int user = 0;

int numberOfNewUsers = *m_currentCount - m_lastCount;

int numberOfOutgoing = *m_currentCountOut - m_lastCountOut;

Monitor::Enter(this);

for (user = 0; user < numberOfNewUsers; user++)

{

dayReport = dayReport->Append(DateStringConverter::GetCurrentFormattedTime(now)+"\r\n");

}

for (user = 0; user < numberOfOutgoing; user++)

{

dayReportOut = dayReportOut->Append(DateStringConverter::GetCurrentFormattedTime(now)+"-\r\n");

}

Monitor::Exit(this);

m_lastCount = *m_currentCount;

m_lastCountOut = *m_currentCountOut;

//statisticsServer->UpdateFrameAndCounter(

// packedImage,

// *m_currentCount,

// *m_currentCountOut,

// imageWidth,

// imageHeight,

// samples1,

// samples2, m_CamIdx);

}

if (lockObj != nullptr)

{

Monitor::Exit(lockObj);

}

}

void WorkingThread::ProcessFrame()

{

if (m_SystemStateObserver.IsShopOpenNow())

{

if (statisticsServer->GetIsCalc(m_CamIdx))

{

#if SONAR_ENABLED

if (m_counter->Process(m_IplFrame, -1) == -2)

#else

if (m_counter->Process(m_IplFrame) == -2)

#endif

{

Utilities::stopWorking = true;

}

}

}

}

bool WorkingThread::IsDieTime()

{

return m_isTimeToExit || Utilities::stopWorking;

}

void WorkingThread::StartWorking() // запуск сервиса подсчета

{

// Модуль проверки состояния камеры

m_SystemStateObserver.SystemStart(m_CamIdx);

int samples1 = m_counter->GetNumberOfSamples(1);


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.