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; }
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; } } }