无法在opencv

时间:2016-10-01 12:56:12

标签: opencv

我有以下代码:

int main(int argc, char** argv)
{
    cv::CommandLineParser parser(argc, argv,
            "{eyes||}{nose||}{mouth||}{help h||}");
    if (parser.has("help"))
    {
        help();
        return 0;
    }
    input_image_path = parser.get<string>(0);
    face_cascade_path = parser.get<string>(1);
    eye_cascade_path = parser.has("eyes") ? parser.get<string>("eyes") : "";
    nose_cascade_path = parser.has("nose") ? parser.get<string>("nose") : "";
    mouth_cascade_path = parser.has("mouth") ? parser.get<string>("mouth") : "";
    if (input_image_path.empty() || face_cascade_path.empty())
    {
        cout << "IMAGE or FACE_CASCADE are not specified\n";
        return 1;
    }
    // Load image and cascade classifier files
    Mat image;
    image = imread(input_image_path);

当我按如下方式运行代码时:./code help

或者作为,

./code eyes: /home/Users/Matt/rob.jpg

它总是给我错误:IMAGE or FACE_CASCADE are not specified。我在这里错过了什么吗?我一直在关注此链接http://docs.opencv.org/trunk/d0/d2e/classcv_1_1CommandLineParser.html,我按照那里指定的那样输入命令,但它仍然没有接受参数。

1 个答案:

答案 0 :(得分:2)

有几个错误:

  1. 您没有在input_image_path键中指定face_cascade_pathparser的位置参数。
  2. 要使用非位置参数,您需要使用-arg=,例如:-eyes=/path/to/eyes.xml
  3. 您可以使用正确的密钥和示例调用检查下面的代码。 为了完整起见,我将图像指定为必需(<none>默认值),以及面部级联路径的默认值。

    此代码与OpenCV 3.1一样正常工作。以前的版本不支持<none>

    您可以将此程序称为:

    ./foo -help  // -> show help
    ./foo /path/to/image // -> use dafault face cascade
    ./foo /path/to/image /path/to/face_cascade
    ./foo /path/to/image /path/to/face_cascade -eyes=/path/to/eyes_cascade
    

    等等。

    代码:

    #include <opencv2\opencv.hpp>
    
    int main(int argc, char** argv)
    {
        cv::String keys =
            "{@image |<none>           | input image path}"         // input image is the first argument (positional)
            "{@face  |/path/to/file.xml| face cascade path}"        // optional, face cascade is the second argument (positional)
            "{eyes   |                 | eye cascade path}"         // optional, default value ""
            "{nose   |      | nose cascade path}"       // optional, default value ""
            "{mouth  |      | mouth cascade path}"      // optional, default value ""
            "{help   |      | show help message}";      // optional, show help optional
    
    
        cv::CommandLineParser parser(argc, argv, keys);
        if (parser.has("help")) {
            parser.printMessage();
            return 0;
        }
    
        cv::String input_image_path = parser.get<cv::String>(0); // read @image (mandatory, error if not present)
        cv::String face_cascade_path = parser.get<cv::String>(1); // read @face (use default value if not in cmd)
    
        bool hasEyeCascade = parser.has("eyes");
        bool hasNoseCascade = parser.has("nose");
        bool hasMouthCascade = parser.has("mouth");
        cv::String eye_cascade_path = parser.get<cv::String>("eyes"); 
        cv::String nose_cascade_path = parser.get<cv::String>("nose"); 
        cv::String mouth_cascade_path = parser.get<cv::String>("mouth");
    
    
        if (!parser.check()) {
            parser.printErrors();
            return -1;
        }
    
        // No errors!
    
        // image path always present
        //cv::Mat img = cv::imread(input_image_path);
    
        // face cascaed path always present (eventually the default value)
        // load face cascade
    
        // You need to check optional arguments
        if (hasEyeCascade) {
            // load eye cascade
        }
        // You need to check optional arguments
        if (hasNoseCascade) {
            // load nose cascade
        }
        // You need to check optional arguments
        if (hasMouthCascade) {
            // load mouth cascade
        }
    
        // Do your stuff
    
        return 0;
    }