1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| void cv_calcMagnitudesDirection(cv::Mat src, cv::Mat& G_xy, cv::Mat& G_theta, int aperture_size, bool L2gradient) { cv::Mat Gx = cv::Mat::zeros(src.rows, src.cols, CV_64FC1); cv::Mat Gy = cv::Mat::zeros(src.rows, src.cols, CV_64FC1); G_xy = cv::Mat::zeros(src.rows, src.cols, CV_64FC1); cv::Sobel(src, Gx, CV_64FC1, 1, 0, aperture_size, 1, 0, cv::BORDER_REPLICATE); cv::convertScaleAbs(Gx, Gx); cv::Sobel(src, Gy, CV_64FC1, 0, 1, aperture_size, 1, 0, cv::BORDER_REPLICATE); cv::convertScaleAbs(Gy, Gy);
if (L2gradient) { cv::sqrt(Gx.mul(Gx) + Gy.mul(Gy), G_xy); } else { G_xy = cv::abs(Gx) + cv::abs(Gy); } cv::normalize(G_xy, G_xy, 0, 0xFF, cv::NORM_MINMAX);
G_theta = cv::Mat::zeros(src.rows, src.cols, CV_64FC1); for (size_t y = 0; y < src.rows; y++) { for (size_t x = 0; x < src.cols; x++) { G_theta.at<double>(y, x) = std::atan2(Gy.at<uchar>(y, x), Gx.at<uchar>(y, x)) * 180.0 / CV_PI; } } }
|