Exemplo n.º 1
0
void Process::scrap(ProcessData const& data)
{
  std::ifstream file(data.getFile());
  NamedPipe     namedPipe("/tmp/the_plazzaRead");
  BruteForcer   forcer;
  ProcessData   newData;

  newData.setProcessNumber(this->_processNumber);
  newData.setThreadStatus(-1);
  newData.setFile(data.getFile());
  namedPipe.openPipe(WRITER);
  if (file.is_open())
  {
    forcer.setRaw(std::string(std::istreambuf_iterator<char>(file),
                              std::istreambuf_iterator<char>()));
    file.close();
  }
  else
  {
    std::cerr << "Can't open file " << data.getFile() << std::endl;
    return ;
  }
  for(std::pair<std::string, std::string> pair : this->_regex)
    {
      if (pair.first == data.getInfoToFind())
        {
          forcer.setExpr(pair.second);
          for(std::string str : forcer.forceRaw())
            {
              newData.setRslt(str.c_str());
              namedPipe << newData;
              std::cout << str.c_str() << std::endl;
            }
          return ;
        }
    }
  std::cerr << "Bad info type " << data.getInfoToFind() << std::endl;
}
Exemplo n.º 2
0
int main(const int argc, const char* argv[]) {
    // Ensure OpenCV is using optimized code
    cv::setUseOptimized(true);

    if(argc < 2) {
        std::cerr << "Named of named pipe required" << std::endl;
        return 1;
    }
    std::ofstream namedPipe(argv[1], std::ofstream::out);

    vision::Config config("config/config.xml");
    vision::Camera camera(0, config.getPitch(0));
    //vision::Camera camera("/home/euan/Downloads/pitch (1).avi", config.getPitch(0));

    cv::Point2f lastBallPos;
    bool seenBall = false;

    bool seenYellowGreen = false;
    cv::Point2f lastYGPos;
    double lastYGO = 0;
    bool seenYellowPink = false;
    cv::Point2f lastYPPos;
    double lastYPO = 0;
    bool seenBlueGreen = false;
    cv::Point2f lastBGPos;
    double lastBGO = 0;
    bool seenBluePink = false;
    cv::Point2f lastBPPos;
    double lastBPO = 0;

    // Main processing loop
    // Grabs, decodes and stores a frame from capture each iteration
    while(camera.update()) {
        cv::UMat frame = camera.getFrame();

        std::vector<std::vector<struct ColouredCircle> > circles = findColouredCirclesInFrame(frame, camera.getBackgroundImage());

        for(size_t r=0;r<circles[0].size();r++) {
            for(size_t c=1;c<circles.size();c++) {
                for(size_t i=0;i<circles[c].size();i++) {
                    double dist = euclidianDistance(circles[0][r].center, circles[c][i].center);
                    if(dist < 20) {
                        circles[0][r].radius = 0;
                        break;
                    }
                }
            }
        }

        cv::Point2f ball;
        double ballSize = 2;
        bool ballFound = false;
        for(size_t i = 0; i < circles[0].size(); i++) {
            if(circles[0][i].radius > ballSize) {
                ballFound = true;
                ball = circles[0][i].center;
                ballSize = circles[0][i].radius;
            }
        }

        std::vector<struct ColouredCircle> pinkAndGreen = circles[3];
        pinkAndGreen.insert(pinkAndGreen.end(), circles[4].begin(), circles[4].end());

        bool ygFound = false;
        bool ypFound = false;
        bool bgFound = false;
        bool bpFound = false;

        std::vector<struct Robot> robots;
        for(size_t blue = 0; blue < circles[1].size(); blue++) {
            sort(pinkAndGreen.begin(), pinkAndGreen.end(), [circles, blue](struct ColouredCircle x, struct ColouredCircle y) {
                double distX = euclidianDistance(circles[1][blue].center, x.center);
                double distY = euclidianDistance(circles[1][blue].center, y.center);
                return (distX < distY);
            });

            size_t len = 4;
            if(pinkAndGreen.size() < len) {
                continue;
            }

            std::vector<struct ColouredCircle> markers;
            int numG = 0, numP = 0;
            for(size_t i = 0; i < len; i++) {
                markers.push_back(pinkAndGreen[i]);
                if(pinkAndGreen[i].colour == 3) {
                    numP++;
                } else {
                    numG++;
                }
            }

            bool shouldContinue = true;

            for(size_t i = 0; i < markers.size(); i++) {
                double dist = euclidianDistance(circles[1][blue].center, markers[i].center);
                if(dist > 50) {
                    shouldContinue = false;
                    break;
                }
            }

            if(!shouldContinue) {
                continue;
            }

            struct Robot r;
            if(numP < numG) {
                r.pos = circles[1][blue].center;

                size_t pindex = 0;
                for(size_t i = 0; i < markers.size(); i++) {
                    if(markers[i].colour == 3) {
                        pindex = i;
                    }
                }

                cv::Point2f botLeftOrigin = markers[pindex].center - r.pos;
                r.orientation = -atan2(botLeftOrigin.x, botLeftOrigin.y) - 0.4;
                r.team = 0;
                r.colour = 0;
                r.markers = markers;

                bgFound = true;

            } else {
                r.pos = circles[1][blue].center;

                size_t pindex = 0;
                for(size_t i = 0; i < markers.size(); i++) {
                    if(markers[i].colour == 4) {
                        pindex = i;
                    }
                }

                cv::Point2f botLeftOrigin = markers[pindex].center - r.pos;
                r.orientation = -atan2(botLeftOrigin.x, botLeftOrigin.y) - 0.4;
                r.team = 0;
                r.colour = 1;
                r.markers = markers;

                bpFound = true;

            }
            robots.push_back(r);
        }

        for(size_t yellow = 0; yellow < circles[2].size(); yellow++) {
            sort(pinkAndGreen.begin(), pinkAndGreen.end(), [circles, yellow](struct ColouredCircle x, struct ColouredCircle y) {
                double distX = euclidianDistance(circles[2][yellow].center, x.center);
                double distY = euclidianDistance(circles[2][yellow].center, y.center);
                return (distX < distY);
            });

            size_t len = 4;
            if(pinkAndGreen.size() < len) {
                continue;
            }

            std::vector<struct ColouredCircle> markers;
            int numG = 0, numP = 0;
            for(size_t i = 0; i < len; i++) {
                markers.push_back(pinkAndGreen[i]);
                if(pinkAndGreen[i].colour == 3) {
                    numP++;
                } else {
                    numG++;
                }
            }

            bool shouldContinue = true;

            for(size_t i = 0; i < markers.size(); i++) {
                double dist = euclidianDistance(circles[2][yellow].center, markers[i].center);
                if(dist > 50) {
                    shouldContinue = false;
                    break;
                }
            }

            if(!shouldContinue) {
                continue;
            }

            struct Robot r;
            if(numP < numG) {
                r.pos = circles[2][yellow].center;

                size_t pindex = 0;
                for(size_t i = 0; i < markers.size(); i++) {
                    if(markers[i].colour == 3) {
                        pindex = i;
                    }
                }

                cv::Point2f botLeftOrigin = markers[pindex].center - r.pos;
                r.orientation = -atan2(botLeftOrigin.x, botLeftOrigin.y) - 0.4;
                r.team = 1;
                r.colour = 0;
                r.markers = markers;

                ygFound = true;

            } else {
                r.pos = circles[2][yellow].center;

                size_t pindex = 0;
                for(size_t i = 0; i < markers.size(); i++) {
                    if(markers[i].colour == 4) {
                        pindex = i;
                    }
                }

                cv::Point2f botLeftOrigin = markers[pindex].center - r.pos;
                r.orientation = -atan2(botLeftOrigin.x, botLeftOrigin.y) - 0.4;
                r.team = 1;
                r.colour = 1;
                r.markers = markers;

                ypFound = true;

            }
            robots.push_back(r);
        }

        std::vector<std::string> jsonKeyObjects;

        if(!ballFound) {
            ball = lastBallPos;
        } else {
            std::stringstream jsonBall;
            jsonBall << "\"b\":{\"x\":" << ball.x << ",\"y\":" << ball.y << "}";
            jsonKeyObjects.push_back(jsonBall.str());
        }

        cv::arrowedLine(frame, ball, ball + (ball-lastBallPos)*10, cv::Scalar(255,255,255), 3);
        cv::circle(frame, ball, 10, cv::Scalar(0, 0, 255), 3);
        lastBallPos = ball;

        for(size_t i = 0; i < robots.size(); i++) {
            if(robots[i].team == 0 && robots[i].colour == 0) {
                bgFound = true;
                lastBGPos = robots[i].pos;
                lastBGO = robots[i].orientation;
            } else if(robots[i].team == 0 && robots[i].colour == 1) {
                bpFound = true;
                lastBPPos = robots[i].pos;
                lastBPO = robots[i].orientation;
            } else if(robots[i].team == 1 && robots[i].colour == 0) {
                ygFound = true;
                lastYGPos = robots[i].pos;
                lastYGO = robots[i].orientation;
            } else if(robots[i].team == 1 && robots[i].colour == 1) {
                ypFound = true;
                lastYPPos = robots[i].pos;
                lastYPO = robots[i].orientation;
            }
        }

        if(bgFound) {
            seenBlueGreen = true;
        } else if(seenBlueGreen) {
            seenBlueGreen = false;
            cv::circle(frame, lastBGPos, 10,  cv::Scalar(255, 0, 0), 3);
            cv::circle(frame, lastBGPos, 50,  cv::Scalar(0, 255, 0), 3);
            cv::Point2f newPoint(
                float(0 * cos(lastBGO) - (-20 * sin(lastBGO))),
                float(0 * sin(lastBGO) + (-20 * cos(lastBGO)))
            );
            cv::line(frame, lastBGPos, lastBGPos + newPoint, cv::Scalar(0, 255, 0), 2);
        }

        if(bpFound) {
            seenBluePink = true;
        } else if(seenBluePink) {
            seenBluePink = false;
            cv::circle(frame, lastBPPos, 10,  cv::Scalar(255, 0, 0), 3);
            cv::circle(frame, lastBPPos, 50,  cv::Scalar(255, 0, 255), 3);
            cv::Point2f newPoint(
                float(0 * cos(lastBPO) - (-20 * sin(lastBPO))),
                float(0 * sin(lastBPO) + (-20 * cos(lastBPO)))
            );
            cv::line(frame, lastBPPos, lastBPPos + newPoint, cv::Scalar(0, 255, 0), 2);
        }

        if(ygFound) {
            seenYellowGreen = true;
        } else if(seenYellowGreen) {
            seenYellowGreen = false;
            cv::circle(frame, lastYGPos, 10,  cv::Scalar(0, 255, 255), 3);
            cv::circle(frame, lastYGPos, 50,  cv::Scalar(0, 255, 0), 3);
            cv::Point2f newPoint(
                float(0 * cos(lastYGO) - (-20 * sin(lastYGO))),
                float(0 * sin(lastYGO) + (-20 * cos(lastYGO)))
            );
            cv::line(frame, lastYGPos, lastYGPos + newPoint, cv::Scalar(0, 255, 0), 2);
        }

        if(ypFound) {
            seenYellowPink = true;
        } else if(seenYellowPink) {
            seenYellowPink = false;
            cv::circle(frame, lastYPPos, 10,  cv::Scalar(0, 255, 255), 3);
            cv::circle(frame, lastYPPos, 50,  cv::Scalar(255, 0, 255), 3);
            cv::Point2f newPoint(
                float(0 * cos(lastYPO) - (-20 * sin(lastYPO))),
                float(0 * sin(lastYPO) + (-20 * cos(lastYPO)))
            );
            cv::line(frame, lastYPPos, lastYPPos + newPoint, cv::Scalar(0, 255, 0), 2);
        }

        for(size_t i = 0; i < robots.size(); i++) {
            struct Robot r = robots[i];
            cv::circle(frame, r.pos, 10,  (r.team == 0 ? cv::Scalar(255, 0, 0) : cv::Scalar(0, 255, 255)), 3);
            cv::circle(frame, r.pos, 50,  (r.colour == 0 ? cv::Scalar(0, 255, 0) : cv::Scalar(255, 0, 255)), 3);
            cv::Point2f newPoint(
                float(0 * cos(r.orientation) - (-20 * sin(r.orientation))),
                float(0 * sin(r.orientation) + (-20 * cos(r.orientation)))
            );
            cv::line(frame, r.pos, r.pos + newPoint, cv::Scalar(0, 255, 0), 2);

            std::stringstream jsonRobot;

            jsonRobot << '"';
            if(r.team == 0) {
                jsonRobot << 'b';
            } else {
                jsonRobot << 'y';
            }
            if(r.colour == 0) {
                jsonRobot << 'g';
            } else {
                jsonRobot << 'p';
            }
            jsonRobot << "\":{\"x\":" << r.pos.x << ",\"y\":" << r.pos.y << ",\"f\":" << r.orientation * 180 / M_PI << "}";
            jsonKeyObjects.push_back(jsonRobot.str());
        }

        namedPipe << '{';

        for(size_t j = 0; j < jsonKeyObjects.size(); j++) {
            namedPipe << jsonKeyObjects[j];
            if(j != jsonKeyObjects.size() - 1) {
                namedPipe << ',';
            }
        }

        namedPipe << "}\n";
        std::flush(namedPipe);

        cv::imshow("Frame", frame);

        // Update windows and check if a key has been pressed
        char key = char(cv::waitKey(1));

        // Check if user wants to quit
        if(key == 'q' || key == 'Q' || key == ESC_KEY) {
            break;
        }
    }
}