Qt/C++. Object Recognition and Inter-Process Communication (IPC).

Статья продожает тему Object Recognition средствами Qt/C++ и Open/CV. Здесь описан пример межпроцессного взаимодействия с использованием классов QLocalServer и QLocalSocket. Изначально задача состояла в том, чтобы передавать на удаленный сервер изображения заданных пользователем классов и обнаруживаемых нейронной сетью в потоке данных, поступающих с камеры. При этом, было желательно, чтобы сама передача изображений с помощью протокола FTP, была выделена в отдельный подпроцесс. Создаваемые сокетами дочерние процессы будут потомками основного процесса приложения ObjectsDetection. При рассмотрении вариантов реализации этой задачи были выбраны классы QLocalServer и QLocalSocket. Эти классы имеют простой алгоритм взаимодействия как между собой, так и с вызывающим их приложением. Clent FTP реализован с использованием класса QNetworkAccessManager и помещен в обьект класса QLocalServer. Взаимодействие основного приложения с клиентом FTP выполняется через объект класса QLocalSocket.
Это четвертая статья из цикла "Real-Time Object Recognition". Первые три статьи обубликованы ранее здесь, здесь и здесь.
При разработке программы использовались:
  • операционная система macOS BigSur версия 11.2.3;
  • среда разработки Qt/C++ версия 5.15.2;
  • компилятор Apple Clang версия 12.0.0;
  • библиотека OpenCV версия 4.4.0
  • нейронная сеть из группы YOLO, обученная на наборе данных COCO.
  • СУБД (система управления базами данных) PostgreSQL 13.1
  • менеджер баз данных DBeaver Версия 7.3.3
1. Программа выполняет следующие функции:
  • принимает поток данных с видеокамеры в режиме реального времени;
  • детектирует объекты с помощью нейронной сети (Deep Neural Networks) yolov4-tiny;
  • принимает настройки пользователя для установки связи между объектами и действиями;
  • озвучивает (произносит) имена обнаруженных объектов и вероятности их распознавния;
  • принимает и устанавливает настройки пользователя для модуля голосовых данных (высоту тона, громкость, скорость речи);
  • сохраняет изображения обнаруженных объектов (images) в виде jpg файллов на SSD диске и в базе данных PostgreSQL;
  • отсылает файлы images по заданным в программе адресам e-mail;
  • отсылает файлы images по протоколу FTP на удаленный сервер;
  • записывает звук с микрофона на SSD диск в виде wav файлов;
  • отображает в Status Bar приложения уровень звукового сигнала, поступащего на вход микрофона.
  • выводит на экран сохраненные на диске images.
2. Передача файлов изображений по протоколу FTP.
Для передачи по протоколу FTP изображений, обнаруживаемых нейронной сетью, следует установить имена нужных вам классов в comboBox (функция void SelectName::on_comboBox_activated(int index)) и выбрать checkBoxFtp (форма SelectName). В этом случае все заданные пользователем и обнаруживаемые нейронной сетью изображения объектов будут в автоматическом режиме (без участия человека) передаваться на удаленный сервер. Имя сервера можно определить в функции void FtpServer::sendFileFtp(QString fileName).
Вот краткий перечень функций для FTP:
  • void SelectName::on_comboBox_activated(int index));
  • void SelectName::on_checkBoxFtp_stateChanged(int arg_ftp);
  • void NewThread::detectObjectsDNN(cv::Mat &frame);
  • void MainWindow::updateTimer();
  • void FtpClient::sendData(QString data);
  • void FtpServer::readyReadServer();
  • void FtpServer::sendFileFtp(QString fileName);
  • void FtpServer::uploadFinished(QNetworkReply *reply).
Строго говоря, это не полный перечень. Дело в том, что существует определенный алгоритм начального взаимодействия QLocalServer и QLocalSocket. Объекты этих классов дожны предварительно настроиться на взимную работу. Описан этот процесс в комментариях к файлам ftpclient.cpp и ftpserver.cpp. Пример работы программы показан на рис. 1.
Рис. 1
Полное описание программы предоставляется платно в файлах pdf или odt.
Проект можно загрузить.
Евгений Вересов.
24.06.2021 года.