天天看點

OpenCV程式main函數參數argc和argv的含義

在剛剛接觸到Opencv時,我們常常會在相關的示例程式當中見到argc和argv這兩個參數,下面給大家解釋一下argc和argv的含義。

argc和argv中的arg指的是"參數"。其中,argc為整數,用來統計運作程式時送給main函數的指令行參數的個數(個人了解是主函數中字元串的個數);argv加上* 與[ ],成為*argv[ ],表示字元串數組,用來存放指向字元串參數的指針數組,每個元素指向一個參數。各成員含義如下:

argv[0]指向程式運作的全路徑名;

argv[1]指向執行程式後的第一個字元串;

argv[2]指向執行程式名後的第二個字元串;

argv[3]指向執行程式名後的第三個字元串;

argv[argc]為NULL。

這裡所說的程式名後的字元串是在linux終端或windows控制台中用程式名的方式運作程式時在程式名後所加的字元串。這些字元串可以通過在程式中調用argv[]數組實作程式中的直接使用。

argc、argv這兩個參數一般在用指令行編譯程式時有用。在初學c++時,往往要弱化argc和argv的用法,main函數常常不帶參數,如下:

int main()

{

}

而在opencv官方示例程式中,main函數的寫法經常會帶上兩個形參,一般為argc和argv,并且在函數體内部會使用到這兩個形參,如下:

int main()

{

const char * imagename = argc >1?argv[1]:“lena.jpg”;

}

其實,在如今各版本的vs編譯器中,main()函數帶或者不帶argc,argv,傳回值為void或不為void,都是合法的。

【寫法一】傳回值為整形帶參的main函數

int main(int argc,char** argv)

{

//函數體内使用或者不使用argc和argv都可行

......

return 1;

}
           

【寫法二】傳回值為整型不帶參的main函數

int main( )

{

......

return 1;

}
           

【寫法三】傳回值為void且不帶參的main函數

void main()

{

......

}
           

在Visual Studio中,如果使用了argc或argv,即上文代碼的第一種寫法,且在使用之前沒有在【項目屬性】—【配置屬性】—【調試】—【指令的參數】中指定參數的值,就會報錯:

OpenCV程式main函數參數argc和argv的含義

如果有多個字元串,則用空格隔開,如:

OpenCV程式main函數參數argc和argv的含義

想要不報錯,除了上文講過的在項目屬性頁中填上指令參數外,最簡單的做法就是在不影響原始程式的基礎上,将argc和argv有關代碼進行替換或注釋。

比如将

Mat srcImage = imread(argv[1], 1);//讀取字元串名為argc[1]的圖檔

替換為

Mat srcImage = imread("1.jpg", 1);//工程目錄下有一張名為“1.jpg”的圖檔

最後簡單來說:

int argc表示指令行字串的個數。

char *argv[ ] 表示指令行參數的字元串。