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