void FlowIOOpenCVWrapper::write(std::string path, const cv::Mat & flow) {
    assert(flow.channels() == 2);
    assert(flow.type() == CV_32FC2);
    
    int rows = flow.rows;
    int cols = flow.cols;
    
    CFloatImage cFlow(cols, rows, 2);
    
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            cFlow.Pixel(j, i, 0) = flow.at<cv::Vec2f>(i, j)[0];
            cFlow.Pixel(j, i, 1) = flow.at<cv::Vec2f>(i, j)[1];
        }
    }
    
    WriteFlowFile(cFlow, path.c_str());
}
Ejemplo n.º 2
0
void opticalFlow::runFlowEstimator(const char* i1file, const char* i2file, const char* seqName, spm_bp_params* params)
{
	Mat in1 = imread(i1file);
	Mat in2 = imread(i2file);

	cv::GaussianBlur(in1,in1,cv::Size(0,0),0.9);
	cv::GaussianBlur(in2,in2,cv::Size(0,0),0.9);
	in1.copyTo(im1);
	in2.copyTo(im2);

	height1 = im1.rows;	width1 = im1.cols;
	height2 = im2.rows;	width2 = im2.cols;
	
	flow12.create(height1,width1); 
	flow21.create(height2,width2);
	occMap.create(height1,width1);

	//optical flow from frame 1 to frame 2
	opticalFlowEst( im1, im2, flow12, params);
	//optical flow from frame 2 to frame 1
	opticalFlowEst( im2, im1, flow21, params);
	
	//left-right consistancy check (occlusion estimation)
	occMap.create(height1,width1);
	occMatpEst( flow12, flow21, occMap);

	//post processing (occlusion region filling)
	opticalFlowRefine(flow12, occMap, im1, flow_refined);

	//write result
	Mat_<Vec3b> flow_color_t;
	MotionToColor(flow_refined, flow_color_t, -1);
	cv::imshow("Flow aft Post-processing",flow_color_t);
	cv::imwrite("flow_visualization.png",flow_color_t);
	flow_color_t.release();
	char flow_file_name[200];
	sprintf(flow_file_name,"%s.flo",seqName);
	WriteFlowFile(flow_file_name,flow_refined,height1,width1);
}