diff --git a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown index 6507e0f4a1..b6f1479172 100644 --- a/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown +++ b/doc/tutorials/objdetect/generalized_hough_ballard_guil/generalized_hough_ballard_guil.markdown @@ -27,8 +27,7 @@ Example 4. Set the required parameters for both GeneralizedHough variants 5. Detect and show found results -Note: - +@note - Both variants can't be instantiated directly. Using the create methods is required. - Guil Hough is very slow. Calculating the results for the "mini" files used in this tutorial takes only a few seconds. With image and template in a higher resolution, as shown below, @@ -40,31 +39,14 @@ Note: ### Code The complete code for this tutorial is shown below. -@include generalizedHoughTransform.cpp +@include samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp Explanation ----------- ### Load image, template and setup variables -```c++ -// load source images -Mat image = imread("images/generalized_hough_mini_image.jpg"); -Mat imgTemplate = imread("images/generalized_hough_mini_template.jpg"); - -// create grayscale image and template -Mat templ = Mat(imgTemplate.rows, imgTemplate.cols, CV_8UC1); -Mat grayImage; -cvtColor(imgTemplate, templ, COLOR_RGB2GRAY); -cvtColor(image, grayImage, COLOR_RGB2GRAY); - -// create variable for location, scale and rotation of detected templates -vector positionBallard, positionGuil; - -// template width and height -int w = templ.cols; -int h = templ.rows; -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-load-and-setup The position vectors will contain the matches the detectors will find. Every entry contains four floating point values: @@ -79,87 +61,19 @@ An example could look as follows: `[200, 100, 0.9, 120]` ### Setup parameters -```c++ -// create ballard and set options -Ptr ballard = createGeneralizedHoughBallard(); -ballard->setMinDist(10); -ballard->setLevels(360); -ballard->setDp(2); -ballard->setMaxBufferSize(1000); -ballard->setVotesThreshold(40); - -ballard->setCannyLowThresh(30); -ballard->setCannyHighThresh(110); -ballard->setTemplate(templ); - - -// create guil and set options -Ptr guil = createGeneralizedHoughGuil(); -guil->setMinDist(10); -guil->setLevels(360); -guil->setDp(3); -guil->setMaxBufferSize(1000); - -guil->setMinAngle(0); -guil->setMaxAngle(360); -guil->setAngleStep(1); -guil->setAngleThresh(1500); - -guil->setMinScale(0.5); -guil->setMaxScale(2.0); -guil->setScaleStep(0.05); -guil->setScaleThresh(50); - -guil->setPosThresh(10); - -guil->setCannyLowThresh(30); -guil->setCannyHighThresh(110); - -guil->setTemplate(templ); -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-setup-parameters Finding the optimal values can end up in trial and error and depends on many factors, such as the image resolution. ### Run detection -```c++ -// execute ballard detection - ballard->detect(grayImage, positionBallard); -// execute guil detection - guil->detect(grayImage, positionGuil); -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-run As mentioned above, this step will take some time, especially with larger images and when using Guil. ### Draw results and show image -```c++ -// draw ballard -for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) { -RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), -Size2f(w * (*iter)[2], h * (*iter)[2]), -(*iter)[3]); -Point2f vertices[4]; -rRect.points(vertices); -for (int i = 0; i < 4; i++) -line(image, vertices[i], vertices[(i + 1) % 4], Scalar(255, 0, 0), 6); -} - -// draw guil -for (vector::iterator iter = positionGuil.begin(); iter != positionGuil.end(); ++iter) { -RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), -Size2f(w * (*iter)[2], h * (*iter)[2]), -(*iter)[3]); -Point2f vertices[4]; -rRect.points(vertices); -for (int i = 0; i < 4; i++) -line(image, vertices[i], vertices[(i + 1) % 4], Scalar(0, 255, 0), 2); -} - -imshow("result_img", image); -waitKey(); -return EXIT_SUCCESS; -``` +@snippet samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp generalized-hough-transform-draw-results Result ------ diff --git a/doc/tutorials/objdetect/table_of_content_objdetect.markdown b/doc/tutorials/objdetect/table_of_content_objdetect.markdown index 6d646a8481..9b8a09b4e8 100644 --- a/doc/tutorials/objdetect/table_of_content_objdetect.markdown +++ b/doc/tutorials/objdetect/table_of_content_objdetect.markdown @@ -19,10 +19,10 @@ Ever wondered how your digital camera detects peoples and faces? Look here to fi - @subpage tutorial_generalized_hough_ballard_guil - Detect an object in a picture with the help of GeneralizedHoughBallard and GeneralizedHoughGuil. - *Languages:* C++ - *Compatibility:* \> OpenCV 3.4 + *Compatibility:* \>= OpenCV 3.4 - *Author:* Markus Heck \ No newline at end of file + *Author:* Markus Heck + + Detect an object in a picture with the help of GeneralizedHoughBallard and GeneralizedHoughGuil. \ No newline at end of file diff --git a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp index 3e0e095a9e..2630dc1f6e 100644 --- a/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp +++ b/samples/cpp/tutorial_code/objectDetection/generalizedHoughTransform.cpp @@ -11,6 +11,7 @@ using namespace cv; using namespace std; int main() { + //! [generalized-hough-transform-load-and-setup] // load source images Mat image = imread("images/generalized_hough_mini_image.jpg"); Mat imgTemplate = imread("images/generalized_hough_mini_template.jpg"); @@ -27,7 +28,10 @@ int main() { // template width and height int w = templ.cols; int h = templ.rows; + //! [generalized-hough-transform-load-and-setup] + + //! [generalized-hough-transform-setup-parameters] // create ballard and set options Ptr ballard = createGeneralizedHoughBallard(); ballard->setMinDist(10); @@ -64,14 +68,18 @@ int main() { guil->setCannyHighThresh(110); guil->setTemplate(templ); + //! [generalized-hough-transform-setup-parameters] + //! [generalized-hough-transform-run] // execute ballard detection ballard->detect(grayImage, positionBallard); // execute guil detection guil->detect(grayImage, positionGuil); + //! [generalized-hough-transform-run] + //! [generalized-hough-transform-draw-results] // draw ballard for (vector::iterator iter = positionBallard.begin(); iter != positionBallard.end(); ++iter) { RotatedRect rRect = RotatedRect(Point2f((*iter)[0], (*iter)[1]), @@ -96,5 +104,7 @@ int main() { imshow("result_img", image); waitKey(); + //! [generalized-hough-transform-draw-results] + return EXIT_SUCCESS; } \ No newline at end of file