iOS下使用OpenCV進行影象識別

weixin_34321977發表於2018-07-12

OpenCV提供了機器學習程式和影象識別的框架。接下來我們看看它是如何實現這些功能的。

首先OpenCV提供的機器學習是監督學習,也就是我們需要提供給機器正樣本和負樣本,使機器生成相應的檢測器。OpenCV使用進行影象識別的檢測器叫級聯分類器,所謂的級聯分類器,就是將若干的簡單的分量分類器(可以理解為一般的普通分類器)依次串聯起來,最終的檢測分類結果,要依次通過所有的分量分類器才能算是一個有效的檢測分類結果。否則,就認為當前檢測區域內沒有我們需要找的目標。

所以我們先要做的是,收集訓練樣本->生成正、負樣本描述檔案->生成正樣本特徵檔案->進行分類器訓練

OpenCV中有兩個程式可以訓練級聯分類器: opencv_haartraining和opencv_traincascade。opencv_traincascade 是一個新程式,使用OpenCV 2.x API 以C++編寫。這二者主要的區別是 opencv_traincascade 支援 Haar、Hog和 LBP(Local Binary Patterns)三種特徵,並易於增加其他的特徵。與Haar特徵相比,LBP特徵是整數特徵,因此訓練和檢測過程都會比Haar特徵快幾倍。LBP和Haar特徵用於檢測的準確率,是依賴訓練過程中的訓練資料的質量和訓練引數。訓練一個與基於Haar特徵同樣準確度的LBP的分類器是可能的。

參考連結:https://blog.csdn.net/uncle_lin/article/details/48582251

訓練完後的級聯分類器是一個xml檔案。我們將這個檔案匯入專案中就可以使用進行影象識別了。

OpenCV中提供了CascadeClassifier類,首先通過專案中的xml檔案初始化這個類。

例如:

cv::CascadeClassifier humanFaceClassifier([[bundle pathForResource:@"haarcascade_frontalface_alt" ofType:@"xml"] UTF8String])

接下來將想要識別的影象傳入這個類的函式detectMultiScale就可以進行影象識別了

例如:

humanFaceClassifier.detectMultiScale(equalizedImage, humanFaceRects, DETECT_HUMAN_FACE_SCALE_FACTOR, DETECT_HUMAN_FACE_MIN_NEIGHBORS, 0, detectHumanFaceMinSize);

識別到目標的Rect存在函式的第二個引數中。

至此,OpenCV中的影象識別功能就完成了。

參考資料:iOS  Application  Development  with  OpenCV 3.pdf  chapter 4

相關文章