轉自CSDN:蔣坤
在camshiftdemo.cpp中出現了一個名叫CommandLineParser的類,不知道是幹什麼用的,查了一下文檔纔看明白。
關於這個類的實現具體請看:root\opencv\modules\core\src\cmdparser.cpp(root是你安裝opencv的位置)
好像在opencv的c版本中,應該是opencv1.0以前,還沒有出現CommandLineParser這個類,最近看到opencv2.3後面的版本里自帶的samples,很多都用到了CommandLineParser這個類,那麼這個類到底有什麼作用呢,從命名大概可以猜出這是個命令行解析類。因爲我們知道opencv是一個開源庫,所以其很少有圖形操作方面的api,基本上還是基於命令行執行的。那麼這個類的出現主要是方便用戶在命令行使用過程中減少工作量,可以在程序文件中直接指定命令行中的參數指令,方便了調試。
我簡單寫了下面這個例子:
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <ctype.h>
#include <string>
using namespace cv;
using namespace std;
const char* keys =
{
"{ c | camera | 0 | use camera or not}"
"{ fn | filename |xxxx.avi | movie file}"
"{ t | test | test string | good day!}"
};
int main(int argc, const char** argv )
{
CommandLineParser parser(argc, argv, keys);
bool useCamera = parser.get<bool>("c");//括號裏寫成“camera”也可以
string file = parser.get<string>("fn");
string third = parser.get<string>("t");
//打印輸出
cout<<useCamera<<endl;
cout<<file<<endl;
cout<<third<<endl;
cout<<endl;
parser.printParams();//CommandLineParser的成員函數,打印全部參數,還有其他成員函數,如:has(),getString()等
return 0;
}
第一行就是這個類的構造函數,前2個參數是命令行傳過來的,第3個就是剛剛定義的keys了,keys的結構有一定規律,比如說"{ c | camera | 0 | use camera or not}"都是用大括號和雙引號引起來,然後中間的內容分成4斷,用”|”分隔開,分別表示簡稱,文件來源,文件值和幫助語句。第二行和第三行表示打開攝像頭和打開文件,文件的文件名等都在keys指針中了。
大概可以看出來用這個類的好處就是很方便,因爲以前版本沒這個類時,如果要運行帶參數的.exe,必須在命令行中輸入文件路徑以及各種參數,並且輸入的參數格式要與代碼中的if語句判斷內容格式一樣,一不小心就輸錯了,很不方便。另外如果想要更改輸入格式的話在主函數文件中要相應更改很多地方。現在有了這個類,只需要改keys裏面的內容就可以了,並且可以直接運行,不需要cmd命令行帶參運行。最後這個類封裝了很多函數,可以直接用,只不過這個本來就是類結構的優點。