diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index 5f71c590d..2f447b9cd 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -899,7 +899,7 @@ public: * @param lines2 The second lines that need to be drawn. Color - Red. * @return The number of mismatching pixels between lines1 and lines2. */ - static int compareSegments(cv::Size& size, const std::vector& lines1, const std::vector lines2, cv::Mat* image = 0); + static int compareSegments(const cv::Size& size, const std::vector& lines1, const std::vector lines2, cv::Mat* image = 0); private: cv::Mat image; diff --git a/modules/imgproc/src/lsd.cpp b/modules/imgproc/src/lsd.cpp index f0098a8f2..e248ebbaf 100644 --- a/modules/imgproc/src/lsd.cpp +++ b/modules/imgproc/src/lsd.cpp @@ -957,13 +957,15 @@ void LSD::drawSegments(cv::Mat& image, const std::vector& lines) } } -int LSD::compareSegments(cv::Size& size, const std::vector& lines1, const std::vector lines2, cv::Mat* image) -{ - if (image && image->size() != size) size = image->size(); - CV_Assert(size.area()); - Mat_ I1 = Mat_::zeros(size); - Mat_ I2 = Mat_::zeros(size); +int LSD::compareSegments(const cv::Size& size, const std::vector& lines1, const std::vector lines2, cv::Mat* image) +{ + Size sz = size; + if (image && image->size() != size) sz = image->size(); + CV_Assert(sz.area()); + + Mat_ I1 = Mat_::zeros(sz); + Mat_ I2 = Mat_::zeros(sz); // Draw segments for(unsigned int i = 0; i < lines1.size(); ++i) diff --git a/samples/cpp/lsd_lines.cpp b/samples/cpp/lsd_lines.cpp new file mode 100644 index 000000000..03547dda8 --- /dev/null +++ b/samples/cpp/lsd_lines.cpp @@ -0,0 +1,50 @@ +#include +#include + +#include "opencv2/core/core.hpp" +#include "opencv2/imgproc/imgproc.hpp" +#include "opencv2/highgui/highgui.hpp" + +using namespace std; +using namespace cv; + +int main(int argc, char** argv) +{ + if (argc != 2) + { + std::cout << "lsd_lines [input image]" << std::endl; + return false; + } + + std::string in = argv[1]; + + Mat image = imread(in, CV_LOAD_IMAGE_GRAYSCALE); + + // Create and LSD detector with std refinement. + LSD lsd_std(LSD_REFINE_STD); + double start = double(getTickCount()); + vector lines_std; + lsd_std.detect(image, lines_std); + double duration_ms = (double(getTickCount()) - start) * 1000 / getTickFrequency(); + std::cout << "OpenCV STD (blue) - " << duration_ms << " ms." << std::endl; + + // Create an LSD detector with no refinement applied. + LSD lsd_none(LSD_REFINE_NONE); + start = double(getTickCount()); + vector lines_none; + lsd_none.detect(image, lines_none); + duration_ms = (double(getTickCount()) - start) * 1000 / getTickFrequency(); + std::cout << "OpenCV NONE (red)- " << duration_ms << " ms." << std::endl; + std::cout << "Overlapping pixels are shown in purple." << std::endl; + + Mat difference = Mat::zeros(image.size(), CV_8UC1); + LSD::compareSegments(image.size(), lines_std, lines_none, &difference); + imshow("Line difference", difference); + + Mat drawnLines(image); + LSD::drawSegments(drawnLines, lines_std); + imshow("Standard refinement", drawnLines); + + waitKey(); + return 0; +}