【问题标题】:OpenCV cvLoadImage doesn't accept char* for filename but accepts argv[1]OpenCV cvLoadImage 不接受 char* 作为文件名,但接受 argv[1]
【发布时间】:2011-02-10 22:46:15
【问题描述】:

我知道这个问题以前有人问过。我已经阅读了答案并尝试了解决方案,但它并没有为我解决。

我在 Ubuntu 10.10(32 位)和 Eclipse C IDE 中使用 OpenCV 2.1。

我的问题:

如果我从文件中读取文本行,并将其存储在 char* 变量中并将其传递给 cvLoadImage,我什么也得不到。我从文件中读取的文本行是某个图像的完全定义的文件路径。

代码如下:

FILE *f = fopen("./input.txt","r");
char img1[50];
fgets(img1,50,f);
char* img3 = strtok(img1,"\n");
IplImage* frame = cvLoadImage(img3);

结果是帧现在是 0x00000000 并且没有图片

但是

如果我将相同的文本作为参数传递给可执行文件,我可以将 argv[1] 存储到 char* 中并将其传递给 cvLoadImage() 并按预期读取图像。

代码如下:

char* img3 = argv[1];
IplImage* frame = cvLoadImage(img3);

我不确定这是什么原因。 :s

作为参数传递并在文件中的字符串完全是:(包括引号) "/home/atharva/Documents/FYP/1a.jpg"

谢谢

【问题讨论】:

  • 还想问另一个问题:有没有更好的方法从文本文件中读取一行而不需要换行符,或者确定长度然后存储在变量中?谢谢

标签: c file-io opencv char argv


【解决方案1】:

您需要从文件中的字符串中删除引号。只有 shell 的解析器首先需要引号才能将路径正确地放入程序的 argv 列表中——即使这样,如果文件路径嵌入了空格,也只有 真正 是必需的。

由于 fgets() 读取整行文本(直到 \n),因此无需引用任何内容(尽管 50 个字符对于文件路径来说并不多——您可能需要增加缓冲区大小) .如果出于某种原因必须在文件中引用它,那么您需要在将其传递给 cvLoadImage() 之前将其删除。

【讨论】:

  • @Chris Lutz:不,如果文件名大于缓冲区大小,strtok() 将返回截断的文件名。但是,如果输入文件包含空行,它将返回 NULL
  • 谢谢。工作。这么简单,应该已经意识到了
猜你喜欢
  • 2010-10-01
  • 2020-03-09
  • 2014-10-17
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多