Детектирование пешеходов с движущегося погрузчика

В прошлом месяце обратился к нам заказчик со следующей проблемой. На территории его складов работает много вилочных погрузчиков и еще больше грузчиков и другого персонала у которых напрочь отсутствует инстинкт самосохранения. Идут, не то что под ноги не смотрят, но даже не видят движущиеся погрузчики. Как минимум раз за смену кто-нибудь обязательно пободается с погрузчиком. Операторы погрузчиков — ребята вроде толковые, но надеется только на их внимание опасно.  Надпись “не стой под стрелой” не всем понятна из-за того что не все умеют читать, тем более еще и по русски. Несчастных случаев пока не было, но дожидаться руководство их не собиралось.

Для решения вышеизложенной проблемы нами было предложено следующее:

  • оборудовать вилочные погрузчики видеокамерами;
  • по видеопотоку контролировать приближение пешеходов к погрузчику;
  • при приближении пешехода к погрузчику ближе чем на 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<Rect> human;
   vector<Rect> 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() > 0) {
    for (int gg = 0; gg < human.size(); gg++) {

    rectangle(original, human[gg].tl(), human[gg].br(), Scalar(0,0,255), 2, 8, 0);

    }
   }

colored image
   if (upperBody.size() > 0) {
    for (int gg = 0; gg < 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 << original;
    int key1 = waitKey(20);
  }
 }
}

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

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