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;
}
Beispiel #3
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;
}