在剛剛接觸到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,即上文代碼的第一種寫法,且在使用之前沒有在【項目屬性】—【配置屬性】—【調試】—【指令的參數】中指定參數的值,就會報錯:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxUleNJTTq1ENNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3cTMxUTNzAjMyAjMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如果有多個字元串,則用空格隔開,如:
想要不報錯,除了上文講過的在項目屬性頁中填上指令參數外,最簡單的做法就是在不影響原始程式的基礎上,将argc和argv有關代碼進行替換或注釋。
比如将
Mat srcImage = imread(argv[1], 1);//讀取字元串名為argc[1]的圖檔
替換為
Mat srcImage = imread("1.jpg", 1);//工程目錄下有一張名為“1.jpg”的圖檔
。
最後簡單來說:
int argc表示指令行字串的個數。
char *argv[ ] 表示指令行參數的字元串。