I am trying to get the strength of detected lines using the gradient magnitude referring to this post: https://stackoverflow.com/questions/33679738/measure-edge-strength-in-opencv-magnitude-of-gradient
I detect lines as vector<Vec4f>
with the Line Segment Detector (LSD) in an image and I calculate the magnitude of the same image. Now I want to calculate the strength of a single line using my magnitude Mat
.
How can I use one line as a mask for my magnitude and calculate for example the sum of all values.
My first approach would be to draw a line in the magnitude "image" and sum up all values the line hits. But I think there must be a better approach using the opencv libs?
Here is my code:
void findLines(cv::Mat inputimg, std::vector<cv::Vec4f> &lines, cv::Mat &outputimg) {
cv::equalizeHist(inputimg, inputimg);
cv::Mat reduced_noise;
cv::bilateralFilter(inputimg, reduced_noise, 5, 75, 75, 4);
cv::Ptr<cv::LineSegmentDetector> Line_detector = cv::createLineSegmentDetector();
Line_detector->detect(reduced_noise, lines);
Line_detector->drawSegments(outputimg, lines);
}
void computeMagnitude(Mat img, Mat magn) {
// Compute dx and dy deratives with Sobel
Mat dx, dy;
Sobel(img, dx, CV_32F, 1, 0);
Sobel(img, dy, CV_32F, 0, 1);
// Compute gradient
magnitude(dx, dy, magn);
}
int main(int argc, char** argv) {
// Load two images as grayscale images
Mat img_1, img_2;
img_1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
img_2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
// Test if images could be read
if (!img_1.data || !img_2.data) {
cout << "Error reading image" << endl;
return EXIT_FAILURE;
}
Mat magnitude_1;
vector<Vec4f> lines_1;
Mat drawing = img_1.clone();
computeMagnitude(img_1, magnitude_1);
findLines(img_1, lines_1, drawing);
// Draw a line in the magnitude image and calculate the sum of all cells it hits ?
}