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:
@@ -266,7 +266,7 @@ public:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hash = 0;
|
hash.setTo(cv::Scalar::all(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
----------
|
----------
|
||||||
|
Reference in New Issue
Block a user