通过硬论证

时间:2018-04-11 09:02:03

标签: c++ opencv

我正在尝试对传递给OpenCV Command Line Parser的参数进行硬编码。在object_detection file中,我已经添加了代码,因此我不必通过命令行输入文件名:

第40-48行:

void drawPred(int classId, float conf, int left, int top, int right, int bottom, Mat& frame);

void callback(int pos, void* userdata);

int main(int argc, char** argv)
{
    // This line added below:
    argv[1]="-input /home/Videos/test.mp4";

    CommandLineParser parser(argc, argv, keys);
    parser.about("Use this script to run object detection deep learning networks using OpenCV.");
    if (argc == 1 || parser.has("help"))

OpenCV会跳过此文件,而是切换到相机。在将参数传递给命令行解析器之前,如何对参数进行硬编码?

3 个答案:

答案 0 :(得分:2)

什么是argc?如果它是0,它将被忽略,并且argv中的指针将为NULL,因此你得到UB。此外,修改提供给main的系统存储是一个坏主意,它可能是UB,因为您没有适当的存储空间来存储字符串。

唯一正确的方法是创建中间变量。请注意,数组应以NULL结尾。

答案 1 :(得分:1)

问题是argc,argv是一种旧式的C机制。您不能简单地在C数组char**中插入值。相反,您必须使用一个额外元素创建一个新数组。 (您现有的代码会覆盖 argv[1]

现在有更多不寻常的东西。 argv是一个包含argc+1个元素的数组,其中最后一个是nullptr。由于您要插入新元素,因此必须创建char*[argc+2]*,复制所有argc元素,将指针附加到字符串,然后使用nullptr终止新数组。

您现在可以将新数组和argc+1传递给CommandLineParser

答案 2 :(得分:-1)

argc的目标是传递参数t" -input /home/Videos/test.mp4");     argv [2] = NULL;通过main,如果你使用的是GNU / UNIX发行版,只需传递类似的参数:

argc = 2
argv[1] = strdup("-input /home/Videos/test.mp4");
argv[2] = NULL;

CommandLineParser parser(argc, argv, keys);
parser.about("Use this script to run object detection deep learning networks using OpenCV.");
if (argc == 1 || parser.has("help"))

或只是使用"正常"方式并通过我们的二进制传递参数,如

  

./ a.out" -input /home/Videos/test.mp4"