Commit e11951c1 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #883 from sovrasov:structured_edge_det_rounding_fix

parents f427be6e 98f305e4
...@@ -7,6 +7,7 @@ https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.ym ...@@ -7,6 +7,7 @@ https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.ym
#include <opencv2/ximgproc.hpp> #include <opencv2/ximgproc.hpp>
#include "opencv2/highgui.hpp" #include "opencv2/highgui.hpp"
#include "opencv2/core/utility.hpp" #include "opencv2/core/utility.hpp"
#include <iostream>
using namespace cv; using namespace cv;
using namespace cv::ximgproc; using namespace cv::ximgproc;
...@@ -21,52 +22,51 @@ const char* keys = ...@@ -21,52 +22,51 @@ const char* keys =
int main( int argc, const char** argv ) int main( int argc, const char** argv )
{ {
bool printHelp = ( argc == 1 ); bool printHelp = ( argc == 1 );
printHelp = printHelp || ( argc == 2 && std::string(argv[1]) == "--help" ); printHelp = printHelp || ( argc == 2 && String(argv[1]) == "--help" );
printHelp = printHelp || ( argc == 2 && std::string(argv[1]) == "-h" ); printHelp = printHelp || ( argc == 2 && String(argv[1]) == "-h" );
if ( printHelp ) 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" "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; return 0;
} }
cv::CommandLineParser parser(argc, argv, keys); CommandLineParser parser(argc, argv, keys);
if ( !parser.check() ) if ( !parser.check() )
{ {
parser.printErrors(); parser.printErrors();
return -1; return -1;
} }
std::string modelFilename = parser.get<std::string>("m"); String modelFilename = parser.get<String>("m");
std::string inFilename = parser.get<std::string>("i"); String inFilename = parser.get<String>("i");
std::string outFilename = parser.get<std::string>("o"); String outFilename = parser.get<String>("o");
cv::Mat image = cv::imread(inFilename, 1); Mat image = imread(inFilename, 1);
if ( image.empty() ) if ( image.empty() )
{ CV_Error(Error::StsError, String("Cannot read image file: ") + inFilename);
printf("Cannot read image file: %s\n", inFilename.c_str());
return -1;
}
image.convertTo(image, cv::DataType<float>::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<float>::type, 1/255.0);
cv::Ptr<StructuredEdgeDetection> pDollar = Mat edges(image.size(), image.type());
Ptr<StructuredEdgeDetection> pDollar =
createStructuredEdgeDetection(modelFilename); createStructuredEdgeDetection(modelFilename);
pDollar->detectEdges(image, edges); pDollar->detectEdges(image, edges);
if ( outFilename == "" ) if ( outFilename.size() == 0 )
{ {
cv::namedWindow("edges", 1); namedWindow("edges", 1);
cv::imshow("edges", edges); imshow("edges", edges);
waitKey(0);
cv::waitKey(0);
} }
else else
cv::imwrite(outFilename, 255*edges); imwrite(outFilename, 255*edges);
return 0; return 0;
} }
...@@ -235,6 +235,7 @@ static void gradientHist(const cv::Mat &src, cv::Mat &magnitude, cv::Mat &histog ...@@ -235,6 +235,7 @@ static void gradientHist(const cv::Mat &src, cv::Mat &magnitude, cv::Mat &histog
magnitude /= imsmooth( magnitude, gnrmRad ) magnitude /= imsmooth( magnitude, gnrmRad )
+ 0.01*cv::Mat::ones( magnitude.size(), magnitude.type() ); + 0.01*cv::Mat::ones( magnitude.size(), magnitude.type() );
int pHistSize = histogram.cols*histogram.channels() - 1;
for (int i = 0; i < phase.rows; ++i) for (int i = 0; i < phase.rows; ++i)
{ {
const float *pPhase = phase.ptr<float>(i); const float *pPhase = phase.ptr<float>(i);
...@@ -243,7 +244,11 @@ static void gradientHist(const cv::Mat &src, cv::Mat &magnitude, cv::Mat &histog ...@@ -243,7 +244,11 @@ static void gradientHist(const cv::Mat &src, cv::Mat &magnitude, cv::Mat &histog
float *pHist = histogram.ptr<float>(i/pSize); float *pHist = histogram.ptr<float>(i/pSize);
for (int j = 0; j < phase.cols; ++j) 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);
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment