OpenCV提供了機器學(xué)習(xí)程序和圖像識別的框架。接下來我們看看它是如何實現(xiàn)這些功能的谊路。
首先OpenCV提供的機器學(xué)習(xí)是監(jiān)督學(xué)習(xí)耳璧,也就是我們需要提供給機器正樣本和負(fù)樣本治筒,使機器生成相應(yīng)的檢測器。OpenCV使用進(jìn)行圖像識別的檢測器叫級聯(lián)分類器羊赵,所謂的級聯(lián)分類器趟佃,就是將若干的簡單的分量分類器(可以理解為一般的普通分類器)依次串聯(lián)起來扇谣,最終的檢測分類結(jié)果,要依次通過所有的分量分類器才能算是一個有效的檢測分類結(jié)果闲昭。否則罐寨,就認(rèn)為當(dāng)前檢測區(qū)域內(nèi)沒有我們需要找的目標(biāo)。
所以我們先要做的是序矩,收集訓(xùn)練樣本->生成正鸯绿、負(fù)樣本描述文件->生成正樣本特征文件->進(jìn)行分類器訓(xùn)練
OpenCV中有兩個程序可以訓(xùn)練級聯(lián)分類器: opencv_haartraining和opencv_traincascade。opencv_traincascade?是一個新程序簸淀,使用OpenCV 2.x API 以C++編寫瓶蝴。這二者主要的區(qū)別是?opencv_traincascade?支持 Haar、Hog和 LBP(Local Binary Patterns)三種特征租幕,并易于增加其他的特征舷手。與Haar特征相比,LBP特征是整數(shù)特征劲绪,因此訓(xùn)練和檢測過程都會比Haar特征快幾倍聚霜。LBP和Haar特征用于檢測的準(zhǔn)確率,是依賴訓(xùn)練過程中的訓(xùn)練數(shù)據(jù)的質(zhì)量和訓(xùn)練參數(shù)珠叔。訓(xùn)練一個與基于Haar特征同樣準(zhǔn)確度的LBP的分類器是可能的蝎宇。
參考鏈接:https://blog.csdn.net/uncle_lin/article/details/48582251
訓(xùn)練完后的級聯(lián)分類器是一個xml文件。我們將這個文件導(dǎo)入項目中就可以使用進(jìn)行圖像識別了祷安。
OpenCV中提供了CascadeClassifier類姥芥,首先通過項目中的xml文件初始化這個類。
例如:
cv::CascadeClassifier humanFaceClassifier([[bundle pathForResource:@"haarcascade_frontalface_alt" ofType:@"xml"] UTF8String])
接下來將想要識別的圖像傳入這個類的函數(shù)detectMultiScale就可以進(jìn)行圖像識別了
例如:
humanFaceClassifier.detectMultiScale(equalizedImage, humanFaceRects, DETECT_HUMAN_FACE_SCALE_FACTOR, DETECT_HUMAN_FACE_MIN_NEIGHBORS, 0, detectHumanFaceMinSize);
識別到目標(biāo)的Rect存在函數(shù)的第二個參數(shù)中汇鞭。
至此凉唐,OpenCV中的圖像識別功能就完成了。
參考資料:iOS? Application? Development? with? OpenCV 3.pdf? chapter 4