diff --git a/modules/ximgproc/samples/structured_edge_detection.cpp b/modules/ximgproc/samples/structured_edge_detection.cpp index a11e9f102..98eeefc1d 100644 --- a/modules/ximgproc/samples/structured_edge_detection.cpp +++ b/modules/ximgproc/samples/structured_edge_detection.cpp @@ -7,6 +7,7 @@ https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.ym #include #include "opencv2/highgui.hpp" #include "opencv2/core/utility.hpp" +#include using namespace cv; using namespace cv::ximgproc; @@ -21,52 +22,51 @@ const char* keys = int main( int argc, const char** argv ) { bool printHelp = ( argc == 1 ); - printHelp = printHelp || ( argc == 2 && std::string(argv[1]) == "--help" ); - printHelp = printHelp || ( argc == 2 && std::string(argv[1]) == "-h" ); + printHelp = printHelp || ( argc == 2 && String(argv[1]) == "--help" ); + printHelp = printHelp || ( argc == 2 && String(argv[1]) == "-h" ); if ( printHelp ) { - printf("\nThis sample demonstrates structured forests for fast edge detection\n" + 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"); + " structured_edge_detection -i=in_image_name -m=model_name [-o=out_image_name]\n\n"; return 0; } - cv::CommandLineParser parser(argc, argv, keys); + CommandLineParser parser(argc, argv, keys); if ( !parser.check() ) { parser.printErrors(); return -1; } - std::string modelFilename = parser.get("m"); - std::string inFilename = parser.get("i"); - std::string outFilename = parser.get("o"); + String modelFilename = parser.get("m"); + String inFilename = parser.get("i"); + String outFilename = parser.get("o"); - cv::Mat image = cv::imread(inFilename, 1); + Mat image = imread(inFilename, 1); if ( image.empty() ) - { - printf("Cannot read image file: %s\n", inFilename.c_str()); - return -1; - } + CV_Error(Error::StsError, String("Cannot read image file: ") + inFilename); - image.convertTo(image, cv::DataType::type, 1/255.0); + if ( modelFilename.size() == 0) + CV_Error(Error::StsError, String("Empty model name")); - cv::Mat edges(image.size(), image.type()); + image.convertTo(image, DataType::type, 1/255.0); - cv::Ptr pDollar = + Mat edges(image.size(), image.type()); + + Ptr pDollar = createStructuredEdgeDetection(modelFilename); pDollar->detectEdges(image, edges); - if ( outFilename == "" ) + if ( outFilename.size() == 0 ) { - cv::namedWindow("edges", 1); - cv::imshow("edges", edges); - - cv::waitKey(0); + namedWindow("edges", 1); + imshow("edges", edges); + waitKey(0); } else - cv::imwrite(outFilename, 255*edges); + imwrite(outFilename, 255*edges); return 0; } diff --git a/modules/ximgproc/src/structured_edge_detection.cpp b/modules/ximgproc/src/structured_edge_detection.cpp index 69edf4e37..ef8acff4f 100644 --- a/modules/ximgproc/src/structured_edge_detection.cpp +++ b/modules/ximgproc/src/structured_edge_detection.cpp @@ -235,6 +235,7 @@ static void gradientHist(const cv::Mat &src, cv::Mat &magnitude, cv::Mat &histog magnitude /= imsmooth( magnitude, gnrmRad ) + 0.01*cv::Mat::ones( magnitude.size(), magnitude.type() ); + int pHistSize = histogram.cols*histogram.channels() - 1; for (int i = 0; i < phase.rows; ++i) { const float *pPhase = phase.ptr(i); @@ -243,7 +244,11 @@ static void gradientHist(const cv::Mat &src, cv::Mat &magnitude, cv::Mat &histog float *pHist = histogram.ptr(i/pSize); for (int j = 0; j < phase.cols; ++j) - pHist[cvRound((j/pSize + pPhase[j])*nBins)] += pMagn[j] / CV_SQR(pSize); + { + int index = cvRound((j/pSize + pPhase[j])*nBins); + index = std::max(0, std::min(index, pHistSize)); + pHist[index] += pMagn[j] / CV_SQR(pSize); + } } }