opencv的imread函數相對路徑問題和 main 參數問題


參考:

https://blog.csdn.net/u013404374/article/details/80178822

https://blog.csdn.net/fujilove/article/details/19402561

https://blog.csdn.net/hopeneversleep/article/details/55798722

 

 

imread函數中,一個點代表省略當前文件夾路徑,兩個點則代表回到上一個文件夾路徑。

1

cv::Mat img11 = cv::imread("./res/panda.bmp");

比如這個是,Visual Studio 2015\Projects\Opencv_cuda_test1\Opencv_cuda_test1,工程文件路徑下的res文件夾。

 cv::Mat img12 = cv::imread("../res/panda.bmp");

而這個則是,Visual Studio 2015\Projects\Opencv_cuda_test1\res,這里面的res。

 這也就是兩個相對路徑設置的不同方式。

另外如果實在讀不出來圖片,可能是系統將一些存在版權信息的圖片屏蔽掉,這種情況我一般將其他各種文件格式的圖片轉換為BMP格式,雖然bmp格式壓縮性能很差,但在編寫代碼階段可以這么實現,以后換電腦就可以了。

2

分析原因:imread加載完整路徑的格式是雙斜杠,這與庫自己的定義有關,就像halcon的完整路徑是單反斜杠,大家注意下就OK了。

同樣可以將第五行代碼改為:

cv::Mat imagesrc = cv::imread("D:\\test123\\lena.bmp");
3
程序運行命令行中,程序名字 后面的第一個參數(作為字符串) 就是argv[1]。
argv[0]  是 程序名字。 位置參數總個數 是 argc.
例:
abc.exe  123
argv[1]  是 "123"   ,argv[0]  是 "abc.exe",   argc=2

4.int main(int argc,char* argv[])詳解,以及與int main()有什么區別

K&R C 上5.10 命令行參數 中介紹的int main(int argc,char* argv[ ])

 

在 d:\ 編寫 程序,並命名為 c.c
 
#include
int main(int argc, char ** argv) {     int i;     for (i=0; i < argc; i++)         printf("Argument %d is %s.\n", i, argv[i]);
    return 0; }
在附件中找到命令提示符  輸入 (exe文件的路徑)(當然不是在編譯器輸入了)
 
如圖所示

 

 

 

argc是命令行總的參數個數 argv[]是argc個參數,其中第0個參數是程序的全名,以后的參數命令行后面跟的用戶輸入的參數, ------------------------ char *argv[]是一個字符數組,其大小是int argc,      主要用於命令行參數argv[]參數,數組里每個元素代表一個參數; ------------------------ 例如: int main(int argc, char* argv[]) {     int i;     for (i=0;i<argc;i++)         cout<<argv[i]<<endl;//輸入數組到argv[i]中     cin>>i;                 //輸出數組argv[i]     return   0; } 比如你輸入: test   a.c   b.c   t.c 輸出如下: test a.c b.c t.c
則 argc   =   4
argv[0]   =   "test" argv[1]   =   "a.c" argv[2]   =   "b.c" argv[3]   =   "t.c" ------------------------------------------------------------------------------ 下面這段話感覺講得比較清楚

 

main函數的參數
  前面介紹的main函數都是不帶參數的。因此main 后的括號都是空括號。實際上,main函數可以帶參數,這個參數可以認為是 main函數的形式參數。C語言規定main函數的參數只能有兩個, 習慣上這兩個參數寫為argc和argv。因此,main函數的函數頭可寫為: main (argc,argv)C語言還規定argc(第一個形參)必須是整型變量,argv( 第二個形參)必須是指向字符串的指針數組。加上形參說明后,main函數的函數頭應寫為:  main (argc,argv) int argv; char *argv[];或寫成: main (int argc,char *argv[])   由於main函數不能被其它函數調用, 因此不可能在程序內部取得實際值。那么,在何處把實參值賦予main函數的形參呢? 實際上,main函數的參數值是從操作系統命令行上獲得的。當我們要運行一個可執行文件時,在DOS提示符下鍵入文件名,再輸入實際參數即可把這些實參傳送到main的形參中去。
  DOS提示符下命令行的一般形式為: C:\>可執行文件名 參數 參數……; 但是應該特別注意的是,main 的兩個形參和命令行中的參數在 位置上不是一一對應的。因為,main的形參只有二個,而命令行中的參數個數原則上未加限制。argc參數表示了命令行中參數的個數(注意:文件名本身也算一個參數),argc的值是在輸入命令行時由系統按實際參數的個數自動賦予的。例如有命令行為: C:\>E6 24 BASIC dbase FORTRAN由於文件名E6 24本身也算一個參數,所以共有4個參數,因此argc取得的值為4。argv參數是字符串指針數組,其各元素值為命令行中各字符串(參數均按字符串處理)的首地址。 指針數組的長度即為參數個數。數組元素初值由系統自動賦予。其表示如圖6.8所示: main(int argc,char *argv){ while(argc-->1) printf("%s\n",*++argv); } 本例是顯示命令行中輸入的參數如果上例的可執行文件名為e24.exe,存放在A驅動器的盤內。 因此輸入的命令行為: C:\>a:e24 BASIC dBASE FORTRAN  則運行結果為: BASIC dBASE FORTRAN   該行共有4個參數,執行main時,argc的初值即為4。argv的4個元素分為4個字符串的首地址。執行while語句,每循環一次 argv值減1,當argv等於1時停止循環,共循環三次, 因此共可輸出三個參數。在printf函數中,由於打印項*++argv是先加1再打印, 故第一次打印的是argv[1]所指的字符串BASIC。第二、 三次循環分別打印后二個字符串。而參數e24是文件名,不必輸出。
  下例的命令行中有兩個參數,第二個參數20即為輸入的n值。在程序中*++argv的值為字符串“20”,然后用函數"atoi"把它換為整型作為while語句中的循環控制變量,輸出20個偶數。 #include"stdlib.h" main(int argc,char*argv[]){ int a=0,n; n=atoi(*++argv); while(n--) printf("%d ",a++*2); }   本程序是從0開始輸出n個偶數。指向指針的指針變量如果一個指針變量存放的又是另一個指針變量的地址, 則稱這個指針變量為指向指針的指針變量。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM