cv::Mat flowToColor(const cv::Mat & flow, float max) { assert(flow.channels() == 2); 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]; } } CByteImage cImage; MotionToColor(cFlow, cImage, max); assert(cImage.Shape().height == rows); assert(cImage.Shape().width == cols); assert(cImage.Shape().nBands == 3); cv::Mat image(rows, cols, CV_8UC3, cv::Scalar(0, 0, 0)); for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { image.at<cv::Vec3b>(i, j)[0] = cImage.Pixel(j, i, 0); image.at<cv::Vec3b>(i, j)[1] = cImage.Pixel(j, i, 1); image.at<cv::Vec3b>(i, j)[2] = cImage.Pixel(j, i, 2); } } return image; }
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()); }