我正在尝试对传递给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会跳过此文件,而是切换到相机。在将参数传递给命令行解析器之前,如何对参数进行硬编码?
答案 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"