В прошлом месяце обратился к нам заказчик со следующей проблемой. На территории его складов работает много вилочных погрузчиков и еще больше грузчиков и другого персонала у которых напрочь отсутствует инстинкт самосохранения. Идут, не то что под ноги не смотрят, но даже не видят движущиеся погрузчики. Как минимум раз за смену кто-нибудь обязательно пободается с погрузчиком. Операторы погрузчиков — ребята вроде толковые, но надеется только на их внимание опасно. Надпись “не стой под стрелой” не всем понятна из-за того что не все умеют читать, тем более еще и по русски. Несчастных случаев пока не было, но дожидаться руководство их не собиралось.
Для решения вышеизложенной проблемы нами было предложено следующее:
- оборудовать вилочные погрузчики видеокамерами;
- по видеопотоку контролировать приближение пешеходов к погрузчику;
- при приближении пешехода к погрузчику ближе чем на 5 метров подавать оператору погрузчика свето-звуковой сигнал опасности.
- весь персонал прибывающий на складе снабдить жилетами с нанесением идентификационных данных в виде баркода. Это позволит не только информировать оператора погрузчика об опасном сближении с пешеходом но и хранить информацию о нарушителях.
Видеопоток с камер принимает одноплатный компьютер jetson nano. Алгоритм распознавания пешеходом в режиме реального времени отслеживает опасное сближение и подает свето-звуковой сигнал оператору погрузчика.
Ниже пример кода отслеживания пешеходов.
#include "opencv2\highgui.hpp" #include "opencv2\imgproc.hpp" #include "opencv2\objdetect\objdetect.hpp" #include "opencv2/video/tracking.hpp" #include "vector" #include "stdio.h" #include "Windows.h" #include "iostream" #include "time.h" #include "ctime" using namespace cv; using namespace std; int main(int argc, const char** argv) { VideoCapture cap("input.mov"); VideoWriter outputVideo; outputVideo.open("video4.wmv", CV_FOURCC('W', 'M', 'V', '2'), cap.get(CV_CAP_PROP_FPS), Size(640, 480), true); CascadeClassifier detectorBody; CascadeClassifier detectorUpper; string cascadeName1 = "cascadeName.xml"; string cascadeName2 = "cascadeName.xml"; bool loaded1 = detectorBody.load(cascadeName1); bool loaded3 = detectorUpper.load(cascadeName2); for (;;) { bool Is = cap.grab(); if (Is == false) { cout << "Ошибка захвата видео" << endl; break; } else { const clock_t begin_time = clock(); vector&amp;lt;Rect&amp;gt; human; vector&amp;lt;Rect&amp;gt; upperBody; Mat img; Mat original; cap.retrieve(img, CV_CAP_OPENNI_BGR_IMAGE); resize(img, img, Size(640, 480)); img.copyTo(original); cvtColor(img, img, CV_BGR2GRAY); detectorBody.detectMultiScale(img, human, 1.1, 2, 0 | 1, Size(40,70), Size(80, 300)); detectorUpper.detectMultiScale(img, upperBody, 1.1, 2, 0 | 1, Size(40, 70), Size(80, 300)); colored image if (human.size() &amp;gt; 0) { for (int gg = 0; gg &amp;lt; human.size(); gg++) { rectangle(original, human[gg].tl(), human[gg].br(), Scalar(0,0,255), 2, 8, 0); } } colored image if (upperBody.size() &amp;gt; 0) { for (int gg = 0; gg &amp;lt; upperBody.size(); gg++) { rectangle(original, upperBody[gg].tl(), upperBody[gg].br(), Scalar(255,0,0), 2, 8, 0); } } clock_t diff = clock() - begin_time; char buffer[126]; sprintf(buffer, "%d",diff); putText(original, buffer, Point(100, 20), 1, 2, Scalar(255, 255, 255), 2, 8, 0); putText(original, "ms" , Point(150, 20), 1, 2, Scalar(255, 255, 255), 2, 8, 0); namedWindow("prew", WINDOW_AUTOSIZE); imshow("prew", original); outputVideo &amp;lt;&amp;lt; original; int key1 = waitKey(20); } } }Несколько камер установленных в различных положениях на погрузчике, позволяет оператору контролировать пешеходную деятельность вокруг посредством сигнальных ламп и сирен установленных в кабине погрузчика. Это новый подход к обеспечению безопасности пешеходов вокруг транспортных средств.
Четкие звуковые сигналы тревоги и система предупредительных световых сигналов предупреждают оператора погрузчика и пешехода в находящихся в опасной близости от рабочего погрузчика.