好像在opencv的c版本中,應該是opencv1.0以前,還沒有出現CommandLineParser這個類,最近看到opencv2.3后面的版本里自帶的samples,很多都用到了CommandLineParser
這個類,那么這個類到底有什么作用呢,從命名大概可以猜出這是個命令行解析類。因為我們知道opencv是一個開源庫,所以其很少有圖形操作方面的api,基本上還是基於命令行執行的。那么這個類的出現主要是方便用戶在命令行使用過程中減少工作量,暫時只能理解到這一點好處,也不知道說錯了沒有。
比如說看下samples中的一個類中,main函數前定義了一個keys指針
const char* keys =
{
"{c |camera |false | use camera or not}"
"{fn|file_name |PetsD1TeC1.avi | movie file}"
};
在main函數中使用了下面幾句:
CommandLineParser parser(argc, argv, keys);
bool useCamera = parser.get<bool>("camera");
string file = parser.get<string>("file_name");
VideoCapture cap;
bool update_bg_model = true;
if( useCamera )
cap.open(0);
else
cap.open(file.c_str());
parser.printParams();
第一行就是這個類的構造函數,前2個參數是命令行傳過來的,第3個就是剛剛定義的keys了,keys的結構有一定規律,比如說"{c |camera |false | use camera or not}" 都是用大括號和雙引號引起來,然后中間的內容分成4斷,用”|”分隔開,分別表示簡稱,文件來源,文件值和幫助語句。第二行和第三行表示打開攝像頭和打開文件,文件的文件名等都在keys指針中了。
最后一行為打印keys中的參數,如下:
大概可以看出來用這個類的好處就是很方便,因為以前版本沒這個類時,如果要運行帶參數的.exe,必須在命令行中輸入文件路徑以及各種參數,並且輸入的參數格式要與代碼中的if語句判斷內容格式一樣,一不小心就輸錯了,很不方便。另外如果想要更改輸入格式的話在主函數文件中要相應更改很多地方。現在有了這個類,只需要改keys里面的內容就可以了,並且運行時可以直接在vs下用F5,不需要cmd命令行帶參運行。最后這個類封裝了很多函數,可以直接用,只不過這個本來就是類結構的優點。