2011-02-10 57 views
0

我意識到這個問題之前已被問過。我已經閱讀了答案並嘗試瞭解決方案,但它並沒有爲我解決。OpenCV cvLoadImage不接受字符*的文件名,但接受argv [1]

我在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); 

的結果是,框架現在是00000000,也沒有圖片

如果我通過相同的文字作爲參數傳遞給可執行文件,我可以將argv [1]存儲到char *並將其傳遞給cvLoadImage(),並按照預期讀取圖像。

下面的代碼:

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

我不知道這樣做的原因是什麼。 :■

作爲參數,並在文件傳遞的字符串恰好是:(包括引號) "/home/atharva/Documents/FYP/1a.jpg"

感謝

+0

也想問另外一個問題:有沒有更好的方法來從文本文件中讀取沒有換行符或者確定長度然後存儲在變量中的行?謝謝 – AtharvaI 2011-02-10 22:56:39

回答

2

您需要從文件中的字符串中刪除引號。引號只用於shell的解析器,以便首先正確地將路徑導入到程序的argv列表中 - 並且即使只有確實是,如果文件路徑具有嵌入的空格。由於fgets()讀取整行文本(直到\ n),因此不需要引用任何內容(儘管50個字符對於文件路徑來說並不多 - 您可能想要增加該緩衝區大小)。如果由於某種原因必須在文件中引用它,那麼在將它傳遞給cvLoadImage()之前,需要將它們刪除。

+0

@Chris Lutz:不,如果文件名大於緩衝區大小,strtok()將返回截斷的文件名。但是,如果輸入文件包含空行,它將返回NULL。 – caf 2011-02-10 23:24:42