From e90e9fcceed659355f5f27fccb30cac799fd250e Mon Sep 17 00:00:00 2001 From: ToFam Date: Mon, 13 Dec 2021 18:48:45 +0100 Subject: [PATCH] EdgeDrawing: Add getter for line edge segments --- .../ximgproc/include/opencv2/ximgproc/edge_drawing.hpp | 6 ++++++ modules/ximgproc/src/edge_drawing.cpp | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/modules/ximgproc/include/opencv2/ximgproc/edge_drawing.hpp b/modules/ximgproc/include/opencv2/ximgproc/edge_drawing.hpp index e33b23b08..1d198fe6f 100644 --- a/modules/ximgproc/include/opencv2/ximgproc/edge_drawing.hpp +++ b/modules/ximgproc/include/opencv2/ximgproc/edge_drawing.hpp @@ -67,8 +67,14 @@ public: CV_WRAP virtual void getEdgeImage(OutputArray dst) = 0; CV_WRAP virtual void getGradientImage(OutputArray dst) = 0; + /** @brief Returns std::vector> of detected edge segments, see detectEdges() + */ CV_WRAP virtual std::vector > getSegments() = 0; + /** @brief Returns for each line found in detectLines() its edge segment index in getSegments() + */ + CV_WRAP virtual std::vector getSegmentIndicesOfLines() const = 0; + /** @brief Detects lines. @param lines output Vec<4f> contains start point and end point of detected lines. diff --git a/modules/ximgproc/src/edge_drawing.cpp b/modules/ximgproc/src/edge_drawing.cpp index 62166f98c..7cb6b2754 100644 --- a/modules/ximgproc/src/edge_drawing.cpp +++ b/modules/ximgproc/src/edge_drawing.cpp @@ -109,6 +109,7 @@ public: void getGradientImage(OutputArray dst) CV_OVERRIDE; vector > getSegments() CV_OVERRIDE; + vector getSegmentIndicesOfLines() const CV_OVERRIDE; void detectLines(OutputArray lines) CV_OVERRIDE; void detectEllipses(OutputArray ellipses) CV_OVERRIDE; @@ -120,6 +121,7 @@ protected: int height; // height of source image uchar *srcImg; vector > segmentPoints; + vector segmentIndicesOfLines; Mat smoothImage; uchar *edgeImg; // pointer to edge image data uchar *smoothImg; // pointer to smoothed image data @@ -440,6 +442,11 @@ std::vector > EdgeDrawingImpl::getSegments() return segmentPoints; } +std::vector EdgeDrawingImpl::getSegmentIndicesOfLines() const +{ + return segmentIndicesOfLines; +} + void EdgeDrawingImpl::ComputeGradient() { for (int j = 0; j < width; j++) @@ -1312,12 +1319,15 @@ void EdgeDrawingImpl::detectLines(OutputArray _lines) for (int i = 1; i <= size - linesNo; i++) lines.pop_back(); + segmentIndicesOfLines.clear(); for (int i = 0; i < linesNo; i++) { Vec4f line((float)lines[i].sx, (float)lines[i].sy, (float)lines[i].ex, (float)lines[i].ey); linePoints.push_back(line); + segmentIndicesOfLines.push_back(lines[i].segmentNo); } Mat(linePoints).copyTo(_lines); + delete[] x; delete[] y; }