1
0
mirror of https://github.com/opencv/opencv_contrib.git synced 2025-10-15 12:07:08 +08:00

Merge remote-tracking branch 'upstream/3.4' into merge-3.4

This commit is contained in:
Alexander Alekhin
2021-10-15 13:33:19 +00:00
5 changed files with 57 additions and 61 deletions

View File

@@ -266,7 +266,7 @@ public:
} }
else else
{ {
hash = 0; hash.setTo(cv::Scalar::all(0));
} }
} }

View File

@@ -102,31 +102,31 @@ public:
The algorithm underlies this function is much more robust to texture presence, than common The algorithm underlies this function is much more robust to texture presence, than common
approaches, e.g. Sobel approaches, e.g. Sobel
@param _src source image (RGB, float, in [0;1]) to detect edges @param src source image (RGB, float, in [0;1]) to detect edges
@param _dst destination image (grayscale, float, in [0;1]) where edges are drawn @param dst destination image (grayscale, float, in [0;1]) where edges are drawn
@sa Sobel, Canny @sa Sobel, Canny
*/ */
CV_WRAP virtual void detectEdges(cv::InputArray _src, cv::OutputArray _dst) const = 0; CV_WRAP virtual void detectEdges(cv::InputArray src, cv::OutputArray dst) const = 0;
/** @brief The function computes orientation from edge image. /** @brief The function computes orientation from edge image.
@param _src edge image. @param src edge image.
@param _dst orientation image. @param dst orientation image.
*/ */
CV_WRAP virtual void computeOrientation(cv::InputArray _src, cv::OutputArray _dst) const = 0; CV_WRAP virtual void computeOrientation(cv::InputArray src, cv::OutputArray dst) const = 0;
/** @brief The function edgenms in edge image and suppress edges where edge is stronger in orthogonal direction. /** @brief The function edgenms in edge image and suppress edges where edge is stronger in orthogonal direction.
@param edge_image edge image from detectEdges function. @param edge_image edge image from detectEdges function.
@param orientation_image orientation image from computeOrientation function. @param orientation_image orientation image from computeOrientation function.
@param _dst suppressed image (grayscale, float, in [0;1]) @param dst suppressed image (grayscale, float, in [0;1])
@param r radius for NMS suppression. @param r radius for NMS suppression.
@param s radius for boundary suppression. @param s radius for boundary suppression.
@param m multiplier for conservative suppression. @param m multiplier for conservative suppression.
@param isParallel enables/disables parallel computing. @param isParallel enables/disables parallel computing.
*/ */
CV_WRAP virtual void edgesNms(cv::InputArray edge_image, cv::InputArray orientation_image, cv::OutputArray _dst, int r = 2, int s = 0, float m = 1, bool isParallel = true) const = 0; CV_WRAP virtual void edgesNms(cv::InputArray edge_image, cv::InputArray orientation_image, cv::OutputArray dst, int r = 2, int s = 0, float m = 1, bool isParallel = true) const = 0;
}; };
/*! /*!

View File

@@ -1,12 +1,11 @@
/************************************************************************************** /**************************************************************************************
The structered edge demo requires you to provide a model. The structured forests for fast edge detection demo requires you to provide a model.
This model can be found at the opencv_extra repository on Github on the following link: This model can be found at the opencv_extra repository on Github on the following link:
https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.yml.gz https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.yml.gz
***************************************************************************************/ ***************************************************************************************/
#include <opencv2/ximgproc.hpp> #include <opencv2/ximgproc.hpp>
#include "opencv2/highgui.hpp" #include "opencv2/highgui.hpp"
#include "opencv2/core/utility.hpp"
#include <iostream> #include <iostream>
using namespace cv; using namespace cv;
@@ -14,26 +13,17 @@ using namespace cv::ximgproc;
const char* keys = const char* keys =
{ {
"{i || input image name}" "{i || input image file name}"
"{m || model name}" "{m || model file name}"
"{o || output image name}" "{o || output image file name}"
}; };
int main( int argc, const char** argv ) int main( int argc, const char** argv )
{ {
bool printHelp = ( argc == 1 );
printHelp = printHelp || ( argc == 2 && String(argv[1]) == "--help" );
printHelp = printHelp || ( argc == 2 && String(argv[1]) == "-h" );
if ( printHelp )
{
std::cout << "\nThis sample demonstrates structured forests for fast edge detection\n"
"Call:\n"
" structured_edge_detection -i=in_image_name -m=model_name [-o=out_image_name]\n\n";
return 0;
}
CommandLineParser parser(argc, argv, keys); CommandLineParser parser(argc, argv, keys);
parser.about("This sample demonstrates usage of structured forests for fast edge detection");
parser.printMessage();
if ( !parser.check() ) if ( !parser.check() )
{ {
parser.printErrors(); parser.printErrors();
@@ -44,21 +34,41 @@ int main( int argc, const char** argv )
String inFilename = parser.get<String>("i"); String inFilename = parser.get<String>("i");
String outFilename = parser.get<String>("o"); String outFilename = parser.get<String>("o");
Mat image = imread(inFilename, 1); //! [imread]
Mat image = imread(inFilename, IMREAD_COLOR);
if ( image.empty() ) if ( image.empty() )
CV_Error(Error::StsError, String("Cannot read image file: ") + inFilename); CV_Error(Error::StsError, String("Cannot read image file: ") + inFilename);
//! [imread]
if ( modelFilename.size() == 0) if ( modelFilename.size() == 0)
CV_Error(Error::StsError, String("Empty model name")); CV_Error(Error::StsError, String("Empty model name"));
//! [convert]
image.convertTo(image, DataType<float>::type, 1/255.0); image.convertTo(image, DataType<float>::type, 1/255.0);
//! [convert]
Mat edges(image.size(), image.type()); TickMeter tm;
tm.start();
//! [create]
Ptr<StructuredEdgeDetection> pDollar = Ptr<StructuredEdgeDetection> pDollar =
createStructuredEdgeDetection(modelFilename); createStructuredEdgeDetection(modelFilename);
pDollar->detectEdges(image, edges); //! [create]
tm.stop();
std::cout << "createStructuredEdgeDetection() time : " << tm << std::endl;
tm.reset();
tm.start();
//! [detect]
Mat edges;
pDollar->detectEdges(image, edges);
//! [detect]
tm.stop();
std::cout << "detectEdges() time : " << tm << std::endl;
tm.reset();
tm.start();
//! [nms]
// computes orientation from edge map // computes orientation from edge map
Mat orientation_map; Mat orientation_map;
pDollar->computeOrientation(edges, orientation_map); pDollar->computeOrientation(edges, orientation_map);
@@ -66,17 +76,21 @@ int main( int argc, const char** argv )
// suppress edges // suppress edges
Mat edge_nms; Mat edge_nms;
pDollar->edgesNms(edges, orientation_map, edge_nms, 2, 0, 1, true); pDollar->edgesNms(edges, orientation_map, edge_nms, 2, 0, 1, true);
//! [nms]
tm.stop();
std::cout << "nms time : " << tm << std::endl;
//! [imshow]
if ( outFilename.size() == 0 ) if ( outFilename.size() == 0 )
{ {
namedWindow("edges", 1);
imshow("edges", edges); imshow("edges", edges);
namedWindow("edges nms", 1);
imshow("edges nms", edge_nms); imshow("edges nms", edge_nms);
waitKey(0); waitKey(0);
} }
else else
imwrite(outFilename, 255*edges); imwrite(outFilename, 255*edges);
//! [imshow]
return 0; return 0;
} }

View File

@@ -292,7 +292,8 @@ TEST_F(ximgproc_ED, ManySmallCircles)
size_t lines_size = 6264; size_t lines_size = 6264;
size_t ellipses_size = 2449; size_t ellipses_size = 2449;
EXPECT_EQ(detector->getSegments().size(), segments_size); EXPECT_EQ(detector->getSegments().size(), segments_size);
EXPECT_EQ(lines.size(), lines_size); EXPECT_GE(lines.size(), lines_size);
EXPECT_LE(lines.size(), lines_size + 2);
EXPECT_EQ(ellipses.size(), ellipses_size); EXPECT_EQ(ellipses.size(), ellipses_size);
} }
}} // namespace }} // namespace

View File

@@ -46,41 +46,22 @@ Explanation
----------- -----------
-# **Load source color image** -# **Load source color image**
@code{.cpp}
cv::Mat image = cv::imread(inFilename, 1);
if ( image.empty() )
{
printf("Cannot read image file: %s\n", inFilename.c_str());
return -1;
}
@endcode
-# **Convert source image to [0;1] range** @snippet ximgproc/samples/structured_edge_detection.cpp imread
@code{.cpp}
image.convertTo(image, cv::DataType<float>::type, 1/255.0); -# **Convert source image to float [0;1] range**
@endcode
@snippet ximgproc/samples/structured_edge_detection.cpp convert
-# **Run main algorithm** -# **Run main algorithm**
@code{.cpp}
cv::Mat edges(image.size(), image.type());
cv::Ptr<StructuredEdgeDetection> pDollar = @snippet ximgproc/samples/structured_edge_detection.cpp create
cv::createStructuredEdgeDetection(modelFilename); @snippet ximgproc/samples/structured_edge_detection.cpp detect
pDollar->detectEdges(image, edges); @snippet ximgproc/samples/structured_edge_detection.cpp nms
@endcode
-# **Show results** -# **Show results**
@code{.cpp}
if ( outFilename == "" )
{
cv::namedWindow("edges", 1);
cv::imshow("edges", edges);
cv::waitKey(0); @snippet ximgproc/samples/structured_edge_detection.cpp imshow
}
else
cv::imwrite(outFilename, 255*edges);
@endcode
Literature Literature
---------- ----------