/** Main function*/ int main(int argc, char** argv) { // Images cv::Mat inputImg, imgGRAY; cv::Mat outputImg; // Other variables char *videoFileName = 0; char *imageFileName = 0; cv::VideoCapture video; bool useCamera = true; int mode = MODE_NIETO; int numVps = 1; bool playMode = true; bool stillImage = false; bool verbose = false; int procWidth = -1; int procHeight = -1; cv::Size procSize; // Start showing help help(); // Parse arguments if(argc < 2) return -1; for(int i=1; i<argc; i++) { const char* s = argv[i]; if(strcmp(s, "-video" ) == 0) { // Input video is a video file videoFileName = argv[++i]; useCamera = false; } else if(strcmp(s,"-image") == 0) { // Input is a image file imageFileName = argv[++i]; stillImage = true; useCamera = false; } else if(strcmp(s, "-resizedWidth") == 0) { procWidth = atoi(argv[++i]); } else if(strcmp(s, "-verbose" ) == 0) { const char* ss = argv[++i]; if(strcmp(ss, "ON") == 0 || strcmp(ss, "on") == 0 || strcmp(ss, "TRUE") == 0 || strcmp(ss, "true") == 0 || strcmp(ss, "YES") == 0 || strcmp(ss, "yes") == 0 ) verbose = true; } else if(strcmp(s, "-play" ) == 0) { const char* ss = argv[++i]; if(strcmp(ss, "OFF") == 0 || strcmp(ss, "off") == 0 || strcmp(ss, "FALSE") == 0 || strcmp(ss, "false") == 0 || strcmp(ss, "NO") == 0 || strcmp(ss, "no") == 0 || strcmp(ss, "STEP") == 0 || strcmp(ss, "step") == 0) playMode = false; } else if(strcmp(s, "-mode" ) == 0) { const char* ss = argv[++i]; if(strcmp(ss, "LS") == 0) mode = MODE_LS; else if(strcmp(ss, "NIETO") == 0) mode = MODE_NIETO; else { perror("ERROR: Only LS or NIETO modes are supported\n"); } } else if(strcmp(s,"-numVps") == 0) { numVps = atoi(argv[++i]); } } // Open video input if( useCamera ) video.open(0); else { if(!stillImage) video.open(videoFileName); } // Check video input int width = 0, height = 0, fps = 0, fourcc = 0; if(!stillImage) { if( !video.isOpened() ) { printf("ERROR: can not open camera or video file\n"); return -1; } else { // Show video information width = (int) video.get(CV_CAP_PROP_FRAME_WIDTH); height = (int) video.get(CV_CAP_PROP_FRAME_HEIGHT); fps = (int) video.get(CV_CAP_PROP_FPS); fourcc = (int) video.get(CV_CAP_PROP_FOURCC); if(!useCamera) printf("Input video: (%d x %d) at %d fps, fourcc = %d\n", width, height, fps, fourcc); else printf("Input camera: (%d x %d) at %d fps\n", width, height, fps); } } else { inputImg = cv::imread(imageFileName); if(inputImg.empty()) return -1; width = inputImg.cols; height = inputImg.rows; printf("Input image: (%d x %d)\n", width, height); playMode = false; } // Resize if(procWidth != -1) { procHeight = height*((double)procWidth/width); procSize = cv::Size(procWidth, procHeight); printf("Resize to: (%d x %d)\n", procWidth, procHeight); } else procSize = cv::Size(width, height); // Create and init MSAC MSAC msac; msac.init(mode, procSize, verbose); int frameNum=0; for( ;; ) { if(!stillImage) { printf("\n-------------------------\nFRAME #%6d\n", frameNum); frameNum++; // Get current image video >> inputImg; } if( inputImg.empty() ) break; // Resize to processing size cv::resize(inputImg, inputImg, procSize); // Color Conversion if(inputImg.channels() == 3) { cv::cvtColor(inputImg, imgGRAY, CV_BGR2GRAY); inputImg.copyTo(outputImg); } else { inputImg.copyTo(imgGRAY); cv::cvtColor(inputImg, outputImg, CV_GRAY2BGR); } // ++++++++++++++++++++++++++++++++++++++++ // Process // ++++++++++++++++++++++++++++++++++++++++ processImage(msac, numVps, imgGRAY, outputImg); // View imshow("Output", outputImg); if(playMode) cv::waitKey(1); else cv::waitKey(0); char q = (char)waitKey(1); if( q == 27 ) { printf("\nStopped by user request\n"); break; } if(stillImage) break; }
/** Main function*/ int main(int argc, char** argv) { Vec2f Fu, Fv; // Images cv::Mat inputImg, imgGRAY; cv::Mat outputImg; // Other variables cv::VideoCapture video; cv::Size procSize; char *videoFileName = 0; char *imageFileName = 0; int procWidth = -1; int procHeight = -1; int numVps = 2; int numFramesCalib = 40; int houghThreshold = 140; bool useCamera = true; bool playMode = true; bool stillImage = false; bool stillVideo = false; bool manual = false; //variable to print a trajectory //vector<Vec2f> trajectories; //readPoitsFile("trajectories.txt", &trajectories); // Parse arguments for(int i=1; i<argc; i++){ const char* s = argv[i]; if(strcmp(s, "-video" ) == 0){ // Input video is a video file videoFileName = argv[++i]; useCamera = false; } else if(strcmp(s,"-image") == 0){ // Input is a image file imageFileName = argv[++i]; stillImage = true; useCamera = false; } else if(strcmp(s, "-resizedWidth") == 0){ procWidth = atoi(argv[++i]); } else if(strcmp(s, "-still" ) == 0){ const char* ss = argv[++i]; if(strcmp(ss, "ON") == 0 || strcmp(ss, "on") == 0 || strcmp(ss, "TRUE") == 0 || strcmp(ss, "true") == 0 || strcmp(ss, "YES") == 0 || strcmp(ss, "yes") == 0 ) stillVideo = true; } else if(strcmp(s, "-manual" ) == 0){ const char* ss = argv[++i]; if(strcmp(ss, "ON") == 0 || strcmp(ss, "on") == 0 || strcmp(ss, "TRUE") == 0 || strcmp(ss, "true") == 0 || strcmp(ss, "YES") == 0 || strcmp(ss, "yes") == 0 ) manual = true; } else if(strcmp(s, "-play" ) == 0){ const char* ss = argv[++i]; if(strcmp(ss, "OFF") == 0 || strcmp(ss, "off") == 0 || strcmp(ss, "FALSE") == 0 || strcmp(ss, "false") == 0 || strcmp(ss, "NO") == 0 || strcmp(ss, "no") == 0 || strcmp(ss, "STEP") == 0 || strcmp(ss, "step") == 0) playMode = false; } else if(strcmp(s, "-houghThreshold") == 0){ houghThreshold = atoi(argv[++i]); } else if(strcmp(s, "-help" ) == 0){ help(); } } // Open video input if(useCamera) video.open(0); else{ if(!stillImage) video.open(videoFileName); } // Check video input int width = 0, height = 0, fps = 0, fourcc = 0; if(!stillImage){ if( !video.isOpened() ){ printf("ERROR: can not open camera or video file\n"); return -1; } else{ // Show video information width = (int) video.get(CV_CAP_PROP_FRAME_WIDTH); height = (int) video.get(CV_CAP_PROP_FRAME_HEIGHT); fps = (int) video.get(CV_CAP_PROP_FPS); fourcc = (int) video.get(CV_CAP_PROP_FOURCC); if(!useCamera) printf("Input video: (%d x %d) at %d fps, fourcc = %d\n", width, height, fps, fourcc); else printf("Input camera: (%d x %d) at %d fps\n", width, height, fps); } } else{ inputImg = cv::imread(imageFileName); if(inputImg.empty()) return -1; width = inputImg.cols; height = inputImg.rows; printf("Input image: (%d x %d)\n", width, height); playMode = false; } // Resize if(procWidth != -1){ procHeight = height*((double)procWidth/width); procSize = cv::Size(procWidth, procHeight); printf("Resize to: (%d x %d)\n", procWidth, procHeight); } else procSize = cv::Size(width, height); // Create and init MSAC MSAC msac; msac.init(procSize); //create mouse structs mouseDataVP mdVP; mdVP.uDone = false; mdVP.clicked = false; mouseDataCrop mdCrop; Vec4f previousVP; Vec4f averageVP; Vec4f vp; vector<Vec4f> vpVector; vector<Vec4f> stillVPS; //Mat top(1000,1000,CV_8UC3); int frameNum=0; for(;;) { if(!stillImage) { frameNum++; // Get current image video >> inputImg; } if(inputImg.empty()) break; // Resize to processing size cv::resize(inputImg, inputImg, procSize); // Color Conversion if(inputImg.channels() == 3) { cv::cvtColor(inputImg, imgGRAY, CV_BGR2GRAY); inputImg.copyTo(outputImg); } else { inputImg.copyTo(imgGRAY); cv::cvtColor(inputImg, outputImg, CV_GRAY2BGR); } //////////////////////////// // Process //////////////////////////// //get third frame for manual calibration if(manual && frameNum == 3){ mdVP.image = inputImg.clone(); vp = manualCalibration(&mdVP); } //add frame to average vps if(!manual && stillVideo && frameNum < numFramesCalib){ vp = automaticCalibration(msac, numVps, imgGRAY, outputImg, houghThreshold); if (validVPS(vp)) stillVPS.push_back(vp); } //average vps if (!manual && stillVideo && frameNum == numFramesCalib) { for (int i = 0; i < stillVPS.size(); i++) { vp += stillVPS[i]; } vp /= (int)stillVPS.size(); if (!useCamera) { video.open(videoFileName); continue; } } //automatic calibration if (!manual && !stillVideo) vp = automaticCalibration(msac, numVps, imgGRAY, outputImg, houghThreshold); if (!stillVideo && vpVector.size() < 30) vpVector.push_back(vp); else if(!stillVideo){ vpVector.erase(vpVector.begin()); vpVector.push_back(vp); averageVP = Vec4f(0,0,0,0); for (int i = 0; i < 30; i++) { averageVP += vpVector[i]; } averageVP /= 30; vp = averageVP; } //avoid vp swap position if (frameNum != 0 && pointDistance(Vec2f(previousVP[0], previousVP[1]), Vec2f(vp[0],vp[1])) > pointDistance(Vec2f(previousVP[0], previousVP[1]), Vec2f(vp[2],vp[3])) && pointDistance(Vec2f(previousVP[2], previousVP[3]), Vec2f(vp[2],vp[3])) > pointDistance(Vec2f(previousVP[2], previousVP[3]), Vec2f(vp[0],vp[1]))){ Vec4f temp(vp); vp[0] = vp[2]; vp[1] = vp[3]; vp[2] = temp[0]; vp[3] = temp[1]; } previousVP = Vec4f(vp); //top view calculation if (validVPS(vp)){ Fu = Vec2f(vp[0], vp[1]); Fv = Vec2f(vp[2], vp[3]); TopView tv(inputImg, Fu, Fv, &mdCrop); tv.drawAxis(outputImg, Point(0,0)); tv.generateTopImage(); //allows to crop top view tv.cropTopView(); tv.setOrigin(Vec2f(444,325)); tv.setScaleFactor(Vec2f(444,325), Vec2f(505, 149), 5.0); //Vec2f point = tv.toGroundPlaneCoord(Vec2f(464, 268)); /*vector<Vec2f> b; b = tv.toTopViewCoordinates(trajectories); for (int k = 0; k < b.size(); k++) { circle(tv.topImage, Point(b[k][0], b[k][1]), 2, Scalar(255,0,0)); } for (int k = 0; k < trajectories.size(); k++) { Vec2f a = tv.toGroundPlaneCoord(trajectories[k]); circle(top, Point(a[0] * 100 + 100, a[1] * 100), 2, Scalar(255,0,0)); }*/ //imshow("Plane Coord", top); imshow( "Top View", tv.topImage); //top = Scalar(0,0,0); } imshow("Original", outputImg); if(playMode) cv::waitKey(1); else cv::waitKey(0); char q = (char)waitKey(1); if( q == 27 ){ printf("\nStopped by user request\n"); break; } if(stillImage) break; }
vector<vector<vector<Point> > > Nieto::vp(const Mat1b &inBinaryFrameFiltrado, Mat3b &inVanishingPointImage, const Rect &roi, const int maxNumLines, int houghThresholdInicial, int houghStep, double houghMinLineLength, double houghMaxLineGap) { double tempoInicio = static_cast<double>(getTickCount()); // pega somente a regi�o de interesse Mat1b mascaraRoi = Mat1b(inBinaryFrameFiltrado.size(), uchar(0)); mascaraRoi(Rect(roi.x, roi.y, roi.width, roi.height)).setTo(255); Mat1b binaryFrameFiltradoMasked; cv::bitwise_and(inBinaryFrameFiltrado, mascaraRoi, binaryFrameFiltradoMasked); if (display) cvtColor(inBinaryFrameFiltrado, inVanishingPointImage, CV_GRAY2BGR); // Hough vector<vector<Point> > lineSegments; vector<Point> aux; vector<Vec4i> lines; int houghThreshold = houghThresholdInicial; cv::HoughLinesP(binaryFrameFiltradoMasked, lines, 1, CV_PI / 180, houghThreshold, houghMinLineLength, houghMaxLineGap); while (lines.size() > maxNumLines) { lines.clear(); houghThreshold += houghStep; cv::HoughLinesP(binaryFrameFiltradoMasked, lines, 1, CV_PI / 180, houghThreshold, houghMinLineLength, houghMaxLineGap); } for (size_t i = 0; i<lines.size(); i++) { Point pt1, pt2; pt1.x = lines[i][0]; pt1.y = lines[i][1]; pt2.x = lines[i][2]; pt2.y = lines[i][3]; // modificado int dx = abs(pt2.x - pt1.x); int dy = abs(pt2.y - pt1.y); if (1.0*dx / 3.0 > dy) { if (display) line(inVanishingPointImage, pt1, pt2, CV_RGB(0, 0, 255), 1); // continue; } else{ if (display) line(inVanishingPointImage, pt1, pt2, CV_RGB(0, 255, 0), 1); } // Store into vector of pairs of Points for msac aux.clear(); aux.push_back(pt1); aux.push_back(pt2); lineSegments.push_back(aux); } // Multiple vanishing points vector<Mat> vps; // vector of vps: vps[vpNum], with vpNum=0...numDetectedVps vector<vector<int> > CS; // index of Consensus Set for all vps: CS[vpNum] is a vector containing indexes of lineSegments belonging to Consensus Set of vp numVp vector<int> numInliers; vector<vector<vector<Point> > > lineSegmentsClusters; MSAC msac; bool msac_verbose = false; int numVps = 1; msac.init(MODE_NIETO, inBinaryFrameFiltrado.size(), msac_verbose); msac.multipleVPEstimation(lineSegments, lineSegmentsClusters, numInliers, vps, numVps); // Call msac function for multiple vanishing point estimation msac.drawCS(inVanishingPointImage, lineSegmentsClusters, vps); // Draw line segments according to their cluster // sa�das this->houghLines = lineSegmentsClusters; this->vanishingPoint = vps; // calcula o tempo de execu��o double tempoFim = static_cast<double>(getTickCount()); double tempoExecutando = ((tempoFim - tempoInicio) / getTickFrequency()) * 1000; // exibe as sa�das definidas (texto e/ou imagem) if (verbose) cout << "- nieto.vp: " << tempoExecutando << " ms" << endl; if (display) imshow("Vanishing Point", inVanishingPointImage); return { lineSegments }; }