* Generate initial ETF * by taking perpendicular vectors(counter-clockwise) from gradient map */
| 28 | * by taking perpendicular vectors(counter-clockwise) from gradient map |
| 29 | */ |
| 30 | void ETF::initial_ETF(const std::string file, const cv::Size s) |
| 31 | { |
| 32 | // Resizing Mat |
| 33 | cv::resize(flowField, flowField, s, 0, 0, CV_INTER_LINEAR); |
| 34 | cv::resize(refinedETF, refinedETF, s, 0, 0, CV_INTER_LINEAR); |
| 35 | cv::resize(gradientMag, gradientMag, s, 0, 0, CV_INTER_LINEAR); |
| 36 | |
| 37 | cv::Mat src = cv::imread(file, 1); |
| 38 | cv::Mat src_n; |
| 39 | cv::Mat grad; |
| 40 | normalize(src, src_n, 0.0, 1.0, cv::NORM_MINMAX, CV_32FC1); |
| 41 | //GaussianBlur(src_n, src_n, cv::Size(51, 51), 0, 0); |
| 42 | |
| 43 | // Generate grad_x and grad_y |
| 44 | cv::Mat grad_x, grad_y, abs_grad_x, abs_grad_y; |
| 45 | Sobel(src_n, grad_x, CV_32FC1, 1, 0, 5); |
| 46 | Sobel(src_n, grad_y, CV_32FC1, 0, 1, 5); |
| 47 | |
| 48 | //Compute gradient |
| 49 | magnitude(grad_x, grad_y, gradientMag); |
| 50 | normalize(gradientMag, gradientMag, 0.0, 1.0, cv::NORM_MINMAX); |
| 51 | |
| 52 | flowField = cv::Mat::zeros(src.size(), CV_32FC3); |
| 53 | |
| 54 | #pragma omp parallel for |
| 55 | for (int i = 0; i < src.rows; ++i) { |
| 56 | for (int j = 0; j < src.cols; ++j) { |
| 57 | cv::Vec3f u = grad_x.at<cv::Vec3f>(i, j); |
| 58 | cv::Vec3f v = grad_y.at<cv::Vec3f>(i, j); |
| 59 | |
| 60 | flowField.at<cv::Vec3f>(i, j) = normalize(cv::Vec3f(v.val[0], u.val[0], 0)); |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | flowField = rotate(flowField, 90); |
| 65 | } |
| 66 | |
| 67 | |
| 68 | void ETF::refine_ETF(int kernel) |