int track(string videopath){ cout<<"start track "<<videopath<<endl; QString outpath=QString::fromStdString(videopath); int dotpos=outpath.indexOf('.'); int strlen=outpath.length(); outpath=outpath.replace(dotpos,strlen-dotpos,".infrared.track"); cout<<"outpath is "<<outpath.toStdString()<<endl; ofstream out(outpath.toStdString()); VideoCapture cap(videopath); if(!cap.isOpened()) // check if we succeeded return -1; Mat roi,fg,gray,bin; namedWindow("video input",CV_WINDOW_NORMAL); namedWindow("foreground mask",CV_WINDOW_NORMAL); int frameNum=0; BackgroundSubtractorSuBSENSE bgs; vector<vector<Point> > contours; vector<Vec4i> hierarchy; RNG rng(12345); for(;;frameNum++) { Mat frame; cap >> frame; // get a new frame from camera if(frame.empty()){ break; } resize(frame,frame,Size(0,0),1.0/sqrt(speedUp),1.0/sqrt(speedUp)); //init if(frameNum==0){ fg.create(frame.size(),CV_8UC1); roi.create(frame.size(),CV_8UC1); roi.setTo(255); bgs.initialize(frame,roi); bin.create(frame.size(),CV_8UC1); cvtColor(frame,gray,CV_BGR2GRAY); threshold(gray,bin,thresh,255,THRESH_BINARY); }//detect else{ // bgs(frame,fg,double(frameNum<=100)); cvtColor(frame,gray,CV_BGR2GRAY); threshold(gray,bin,thresh,255,THRESH_BINARY); cout<<"thresh="<<thresh<<endl; // fg=fg|bin; fg=bin; // vector<vector<Point> > contours0; Mat img=fg.clone(); Mat kernel=cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(minObjectSize,minObjectSize)); cv::morphologyEx(img,img,MORPH_OPEN,kernel); contours.clear(); findContours( img, contours, hierarchy, CV_RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // contours.resize(contours0.size()); // for( size_t k = 0; k < contours0.size(); k++ ) // approxPolyDP(Mat(contours0[k]), contours[k], 3, true); /// Get the moments vector<Moments> mu(contours.size() ); for( int i = 0; i < contours.size(); i++ ) { mu[i] = moments( contours[i], false ); } /// Get the mass centers: vector<Point2f> mc( contours.size() ); Measurements m; for( int i = 0; i < contours.size(); i++ ) { mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); // mc[i][0]=mc[i][0]/img.rows; // mc[i][1]=mc[i][1]/img.cols; m.emplace_back(Measurement(mc[i].x,mc[i].y)); } /// Draw contours Mat drawing = frame; for( int i = 0; i< contours.size(); i++ ) { Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) ); drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() ); circle( drawing, mc[i], 4, color, -1, 8, 0 ); } for ( const auto & x : m ) { const int r = 5; // draw measurement circle(drawing, Point(x(0), x(1)), 2*r, Scalar(0, 0, 0)); line(drawing, Point(x(0) - r, x(1) - r), Point(x(0) + r, x(1) + r), Scalar(0, 0, 0) ); line(drawing, Point(x(0) - r, x(1) + r), Point(x(0) + r, x(1) - r), Scalar(0, 0, 0) ); } tracker.track(m); tracklist.update(tracker,out,frameNum); for ( const auto & filter : tracker.filters() ) { const GNNTracker::StateSpaceVector s = filter.state(); const GNNTracker::StateSpaceVector p = filter.prediction(); // draw filter position circle(drawing, Point(s(0), s(1)), 5, Scalar(0, 0, 255)); // draw filter prediction circle(drawing, Point(p(0), p(1)), 5, Scalar(255, 0, 0)); // draw filter velocity (scaled) line(drawing, Point(s(0), s(1)), Point(s(0) + 5 * s(2), s(1) + 5 * s(3)), Scalar(0, 255, 0)); stringstream id; id << filter.id(); putText(drawing, id.str(), cv::Point2i(s(0) + 10, s(1)), cv::FONT_HERSHEY_PLAIN, 1, cv::Scalar(255, 0, 255)); } imshow("video input", drawing); imshow("foreground mask",fg); imshow("bin",bin); } if(frameNum<=100){ cout<<"init "<<videopath<<" frameNum="<<frameNum<<endl; } else{ cout<<"track "<<outpath.toStdString()<<" frameNum="<<frameNum<<endl; } if(waitKey(30) >= 0) break; } out.close(); return 0; }
int main(int argc, const char** argv) { if(argc<2) return 1; const char* file = argv[1]; //char file[] = "F:\\video\\CDnet2014\\badWeather\\badWeather\\skating\\input\\*.jpg"; vector<string> vec = FindAllFile(file,true); vector<string>::iterator iter = vec.begin(); string strPicNameOutput = file; vector<string> strPicNameInputSplit; split(strPicNameOutput,string("\\"),&strPicNameInputSplit); strPicNameInputSplit.erase(strPicNameInputSplit.end() - 1); strPicNameInputSplit.erase(strPicNameInputSplit.end() - 1); strPicNameInputSplit[strPicNameInputSplit.size() - 2] = "results"; strPicNameOutput=""; for (vector<string>::const_iterator iter = strPicNameInputSplit.begin(); iter != strPicNameInputSplit.end(); iter++){ strPicNameOutput += *iter; strPicNameOutput += "\\"; } cout<<strPicNameOutput<<endl; int num = 1; char picName[64] = {0}; strPicNameOutput = strPicNameOutput.append("bin%06d.png"); IplImage* frame = cvLoadImage((*iter).c_str(),0); if(frame == NULL) return 1; //******************************************************************** help(); cv::Mat oCurrSegmMask, oCurrReconstrBGImg,oCurrResizeInputFrame; oCurrSegmMask.create(cvGetSize(frame),CV_8UC1); oCurrReconstrBGImg.create(cvGetSize(frame),CV_8UC1); cv::Mat oSequenceROI(cvGetSize(frame),CV_8UC1,cv::Scalar_<uchar>(255)); // for optimal results, pass a constrained ROI to the algorithm (ex: for CDnet, use ROI.bmp) BackgroundSubtractorSuBSENSE oBGSAlg; cv::Mat oCurrInputFrame(frame); oBGSAlg.initialize(oCurrInputFrame,oSequenceROI); IplImage* writeImageFg,*writeImageBg; //******************************************************************** while(iter != vec.end()){ sprintf(picName,strPicNameOutput.c_str(),num); cout<<num<<" "<<*iter<<endl; num++; frame = cvLoadImage((*iter++).c_str(),0); if(frame == NULL) break; //******************************************************************** oCurrInputFrame = cv::Mat(frame); oBGSAlg(oCurrInputFrame,oCurrSegmMask,100.0/*,double(k<=100)*/); // lower rate in the early frames helps bootstrap the model when foreground is present oBGSAlg.getBackgroundImage(oCurrReconstrBGImg); /*imshow("input",oCurrInputFrame); imshow("segmentation mask",oCurrSegmMask); imshow("reconstructed background",oCurrReconstrBGImg);*/ writeImageFg = &oCurrSegmMask.operator IplImage(); //******************************************************************** cvSaveImage(picName,writeImageFg); if(frame) cvReleaseImage(&frame); cvWaitKey(1); } if(frame) cvReleaseImage(&frame); return 0; }
int main(int argc, char *argv[]) { if (argc < 5) { cout << currentDateTime() << "Usage: GTTagging.exe video_path flag_roi(1=true, 0=false) flag_load(1=true, 0=false) flag_saveROI(1=true, 0=false)\n"; return 1; } /*serialize_video();*/ string outFilename = "output_video.xml"; serializeVideo(outFilename); removeTrailingSpace(outFilename); path video_path (argv[1]); string video_name = video_path.filename().replace_extension("").string(); cout << "video_path filename: " << video_name << endl; string base_name = video_path.filename().replace_extension("").string(); cout << "base_name: " << base_name << endl; string base_path = video_path.remove_filename().string(); cout << "base_path: " << base_path << endl; ostringstream codebook_paramters_path; codebook_paramters_path << base_path << "\\" << base_name << "_cparameters.dat"; cout << "cparameters filename: " << codebook_paramters_path.str() << endl; ostringstream xml_path; xml_path << base_path << "\\" << base_name << ".xml"; cout << "xml filename: " << xml_path.str() << endl; path gt_xml_path (xml_path.str()); try { XMLPlatformUtils::Initialize(); XQillaPlatformUtils::initialize(); } catch (const XMLException& eXerces) { cerr << "Error during Xerces-C initialisation.\n" << "Xerces exception message: " << UTF8(eXerces.getMessage()) << endl; return 1; } try { if (!exists(gt_xml_path)) { cout << currentDateTime() << "File: " << gt_xml_path << " doesn't exist!" << endl; return 1; } if (!exists(video_path)) { cout << currentDateTime() << "File: " << video_path << " doesn't exist!" << endl; return 1; } cout << currentDateTime() << "Processing " << video_path << " ..." << endl; DOMImplementation* xqillaImplementation = DOMImplementationRegistry::getDOMImplementation(X("XPath2 3.0")); DOMLSParser* xmlParser = xqillaImplementation->createLSParser(DOMImplementationLS::MODE_SYNCHRONOUS, 0); DOMConfiguration* dc_parser = xmlParser->getDomConfig(); dc_parser->setParameter(XMLUni::fgDOMNamespaces, true); dc_parser->setParameter(XMLUni::fgXercesSchema, true); dc_parser->setParameter(XMLUni::fgDOMValidate, true); DOMDocument* document = xmlParser->parseURI(xml_path.str().c_str()); if(document == 0) { cerr << "Document not found: " << xml_path.str().c_str() << endl; return 1; } const DOMXPathNSResolver* resolver = document->createNSResolver(document->getDocumentElement()); XQillaNSResolver* xqillaResolver = (XQillaNSResolver*)resolver; xqillaResolver->addNamespaceBinding(X("xs"), X("http://www.w3.org/2001/XMLSchema")); xqillaResolver->addNamespaceBinding(X("fn"), X("http://www.w3.org/2005/xpath-functions")); // Initialize Subsense cv::VideoCapture oVideoInput; cv::Mat oCurrInputFrame, oCurrSegmMask, oCurrReconstrBGImg; oVideoInput.open(argv[1]); oVideoInput >> oCurrInputFrame; oVideoInput.set(CV_CAP_PROP_POS_FRAMES,0); // create BGS Subsense object BackgroundSubtractorSuBSENSE oBGSAlg; // copy loadvars flag if (strcmp(argv[3], "1") == 0) { oBGSAlg.loadvars = true; cout << currentDateTime() << "Pre-loading codebook ..." << endl; } else { oBGSAlg.loadvars = false; cout << currentDateTime() << "Building codebook ..." << endl; } // check if open if(!oVideoInput.isOpened() || oCurrInputFrame.empty()) { printf("Could not open video file at '%s'.\n", argv[1]); cv::waitKey(); return -1; } // Initialize Subsense variables oCurrSegmMask.create(oCurrInputFrame.size(),CV_8UC1); oCurrReconstrBGImg.create(oCurrInputFrame.size(),oCurrInputFrame.type()); // Depending on flag_roi load ROI or not cv::Mat R; if (strcmp(argv[2], "1") == 0) { R = cv::imread("ROI.png",CV_8UC1); } else { R = cv::Mat(oCurrInputFrame.size(),CV_8UC1,cv::Scalar_<uchar>(255)); } oBGSAlg.saveCodebookParametersPath(codebook_paramters_path.str()); oBGSAlg.initialize(oCurrInputFrame, R); // create visualization windows /*cv::namedWindow("input",cv::WINDOW_AUTOSIZE); cv::namedWindow("segmentation mask",cv::WINDOW_AUTOSIZE);*/ int xml_roi_counter = 0; int bgs_roi_counter = 0; int frame_counter = 0; //loop through video frames while(1) { try { std::cout << "frame counter = " << frame_counter << std::endl; oVideoInput >> oCurrInputFrame; if(oCurrInputFrame.empty()) break; //Process oBGSAlg(oCurrInputFrame,oCurrSegmMask); //oBGSAlg.getBackgroundImage(oCurrReconstrBGImg); std::vector<F_state_struct> F_states; // TODO Add function to static lib. getRegions(oCurrSegmMask, F_states, pminArea); std::ostringstream object_xpath_expression; object_xpath_expression << "//object[../@id=\""<< frame_counter++ << "\"]"; cout << currentDateTime() << "object_xpath_expression: " << object_xpath_expression.str() << endl; const DOMXPathExpression* parsedExpression = document->createExpression(X(object_xpath_expression.str().c_str()), resolver); DOMXPathResult* iteratorResult = (DOMXPathResult*)parsedExpression->evaluate(document->getDocumentElement(), DOMXPathResult::ITERATOR_RESULT_TYPE, 0); /*ostringstream xml_rois_path; xml_rois_path << base_path << "\\" << base_name << "_xml_rois"; cout << "xml_rois_path filename: " << xml_rois_path.str() << endl; path xml_rois_dir (xml_rois_path.str()); if(!exists(xml_rois_dir)) { if (create_directories(xml_rois_dir)) { cout << currentDateTime() << "xml_rois_dir created!" << endl; } else { cout << currentDateTime() << "Cannot create xml_rois_dir!" << endl; return 1; } }*/ ostringstream bgs_rois_path; bgs_rois_path << base_path << "\\" << base_name << "_bgs_rois"; cout << "bgs_rois_path filename: " << bgs_rois_path.str() << endl; path bgs_rois_dir (bgs_rois_path.str()); if(!exists(bgs_rois_dir)) { if (create_directories(bgs_rois_dir)) { cout << currentDateTime() << "bgs_rois_dir created!" << endl; } else { cout << currentDateTime() << "Cannot create bgs_rois_dir!" << endl; return 1; } } int i = 0; while(iteratorResult->iterateNext()) { if(iteratorResult->isNode()) { DOMNode* n (iteratorResult->getNodeValue ()); char * localName = XMLString::transcode(n->getLocalName()); //cout << currentDateTime() << "Localname: " << localName << endl; DOMElement* resultElement = dynamic_cast<DOMElement*>(n); if(strcmp( localName, "object") == 0) { object* o = new object (*resultElement); int w = o->w().get(); int h = o->h().get(); int x = o->x().get(); int y = o->y().get(); cout << currentDateTime() << "fish_species: " << o->fish_species().get() << endl; cout << currentDateTime() << "h: " << h << endl; cout << currentDateTime() << "w: " << w << endl; cout << currentDateTime() << "x: " << x << endl; cout << currentDateTime() << "y: " << y << endl; try { ostringstream fish_specie_path; fish_specie_path << base_path << "\\" << o->fish_species().get(); cout << "fish_specie_path filename: " << fish_specie_path.str() << endl; path fish_specie_dir (fish_specie_path.str()); if(!exists(fish_specie_dir)) { if (create_directories(fish_specie_dir)) { cout << currentDateTime() << "bgs_rois_dir created!" << endl; } else { cout << currentDateTime() << "Cannot create fish_specie_dir!" << endl; return 1; } } std::cout << "XML ROI: " << x << " , " << y << " , " << x+w << " , " << y+h << std::endl; Rect xml_roi_rectangle = Rect(Point(x, y), Point(x+w, y+h)); Mat xmlROI, xmlROI_bg; Mat xmlROIMask = oCurrSegmMask(xml_roi_rectangle); xml_roi_counter++; oCurrInputFrame(xml_roi_rectangle).copyTo(xmlROI_bg); sprintf(printf_buffer, "%s\\%s_roi%04d_bg.png", fish_specie_path.str().c_str(), base_name, xml_roi_counter); cout << currentDateTime() << "Saving to: " << printf_buffer << endl; imwrite(printf_buffer, xmlROI_bg); cout << currentDateTime() << "Saved..." << endl; oCurrInputFrame(xml_roi_rectangle).copyTo(xmlROI, xmlROIMask); sprintf(printf_buffer, "%s\\%s_roi%04d.png\0", fish_specie_path.str().c_str(), base_name, xml_roi_counter); cout << currentDateTime() << "Saving to: " << printf_buffer << endl; imwrite(printf_buffer, xmlROI); cout << currentDateTime() << "Saved..." << endl; //rectangle( oCurrInputFrame, Point(x, y), Point(x+w, y+h), Scalar( 255, 9, 0 ), +3, 4 ); } catch (exception& e) { cout << "Error: " << e.what() << '\n'; } } } } for(int i=0; i<F_states.size(); i++) { std::cout << "BGS ROI: " << F_states.at(i).min_x << " , " << F_states.at(i).min_y << " , " << F_states.at(i).max_x << " , " << F_states.at(i).max_y << std::endl; Rect bgs_roi_rectangle = Rect(Point(F_states.at(i).min_x, F_states.at(i).min_y), Point(F_states.at(i).max_x, F_states.at(i).max_y)); Mat bgsROI, bgsROI_bg; Mat bgsROIMask = oCurrSegmMask(bgs_roi_rectangle); bgs_roi_counter++; oCurrInputFrame(bgs_roi_rectangle).copyTo(bgsROI_bg); sprintf(printf_buffer, "%s\\roi%04d_bg.png", bgs_rois_path.str().c_str(), bgs_roi_counter); cout << currentDateTime() << "Saving to: " << printf_buffer << endl; imwrite(printf_buffer, bgsROI_bg); cout << currentDateTime() << "Saved..." << endl; oCurrInputFrame(bgs_roi_rectangle).copyTo(bgsROI, bgsROIMask); sprintf(printf_buffer, "%s\\roi%04d.png\0", bgs_rois_path.str().c_str(), bgs_roi_counter); cout << currentDateTime() << "Saving to: " << printf_buffer << endl; imwrite(printf_buffer, bgsROI); cout << currentDateTime() << "Saved..." << endl; //rectangle( oCurrInputFrame, Point(F_states.at(i).min_x, F_states.at(i).min_y), Point(F_states.at(i).max_x, F_states.at(i).max_y), Scalar( 0, 55, 255 ), +3, 4 ); } //Background Subtraction Visualization /*imshow("input",oCurrInputFrame); imshow("segmentation mask",oCurrSegmMask);*/ //imshow("reconstructed background",oCurrReconstrBGImg); /*if(cv::waitKey(1)==27) break;*/ //Save subsense codebooks and parameters if (strcmp(argv[4], "1") == 0) { oBGSAlg.saveVariables(); } } catch(DOMXPathException &e) { cerr << "DOMXPathException: " << UTF8(e.msg) << endl; return 1; } catch(DOMException &e) { cerr << "DOMException: " << UTF8(e.getMessage()) << endl; return 1; } } } catch (const filesystem_error& ex) { cout << currentDateTime() << ex.what() << '\n'; } XQillaPlatformUtils::terminate(); XMLPlatformUtils::Terminate(); return 0; }