structured_edge_detection.cpp 2.43 KB
Newer Older
1 2 3
/**************************************************************************************
The structered edge demo requires you to provide a model.
This model can be found at the opencv_extra repository on Github on the following link:
4
https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.yml.gz
5 6
***************************************************************************************/

7
#include <opencv2/ximgproc.hpp>
8 9
#include "opencv2/highgui.hpp"
#include "opencv2/core/utility.hpp"
10
#include <iostream>
11 12 13

using namespace cv;
using namespace cv::ximgproc;
14 15 16 17 18 19 20 21 22 23 24

const char* keys =
{
    "{i || input image name}"
    "{m || model name}"
    "{o || output image name}"
};

int main( int argc, const char** argv )
{
    bool printHelp = ( argc == 1 );
25 26
    printHelp = printHelp || ( argc == 2 && String(argv[1]) == "--help" );
    printHelp = printHelp || ( argc == 2 && String(argv[1]) == "-h" );
27 28 29

    if ( printHelp )
    {
30
        std::cout << "\nThis sample demonstrates structured forests for fast edge detection\n"
31
               "Call:\n"
32
               "    structured_edge_detection -i=in_image_name -m=model_name [-o=out_image_name]\n\n";
33 34 35
        return 0;
    }

36
    CommandLineParser parser(argc, argv, keys);
37 38 39 40 41 42
    if ( !parser.check() )
    {
        parser.printErrors();
        return -1;
    }

43 44 45
    String modelFilename = parser.get<String>("m");
    String inFilename = parser.get<String>("i");
    String outFilename = parser.get<String>("o");
46

47
    Mat image = imread(inFilename, 1);
48
    if ( image.empty() )
49
        CV_Error(Error::StsError, String("Cannot read image file: ") + inFilename);
50

51 52
    if ( modelFilename.size() == 0)
        CV_Error(Error::StsError, String("Empty model name"));
53

54
    image.convertTo(image, DataType<float>::type, 1/255.0);
55

56 57 58
    Mat edges(image.size(), image.type());

    Ptr<StructuredEdgeDetection> pDollar =
59
        createStructuredEdgeDetection(modelFilename);
60 61
    pDollar->detectEdges(image, edges);

62 63 64 65 66 67 68 69
    // computes orientation from edge map
    Mat orientation_map;
    pDollar->computeOrientation(edges, orientation_map);

    // suppress edges
    Mat edge_nms;
    pDollar->edgesNms(edges, orientation_map, edge_nms, 2, 0, 1, true);

70
    if ( outFilename.size() == 0 )
71
    {
72 73
        namedWindow("edges", 1);
        imshow("edges", edges);
74 75
        namedWindow("edges nms", 1);
        imshow("edges nms", edge_nms);
76
        waitKey(0);
77 78
    }
    else
79
        imwrite(outFilename, 255*edges);
80 81 82

    return 0;
}