(二)iOS 上使用 OpenCV 的人臉識別

環(huán)境

OpenCV 4.1.0 (CocoaPods 管理)

Xcode11

頭文件和編譯配置

OpenCV 從2.4之后蔑祟,開始支持人臉識別翠订。相對于 iOS 系統(tǒng)級的悬秉,代碼量還挺少仲锄,包括視頻流。

可以看看參考里的第1條 URL 掖桦,官方文檔。

視頻流和靜態(tài)圖片處理邏輯是一致的供汛,都是操作 cv::Mat 這個數(shù)據(jù)結(jié)構(gòu)枪汪。

這是我們這里需要用到的頭文件:

#ifdef __cplusplus

#import <opencv2/imgcodecs/ios.h> // Mat 和 UIImage互轉(zhuǎn)
#import <opencv2/objdetect/objdetect.hpp> // 物體識別相關(guān)的類
#import <opencv2/imgproc.hpp> // 顏色空間 cvtColor 等
#import <opencv2/videoio/cap_ios.h> // AVFoundation相機封裝

#endif

另外,你在 OC 文件里是 .m 可能需要改名為 .mm怔昨,或者修改編譯類型雀久,才能使用 OpenCV。

compile_type.png

圖片識別

看一下 OpenCV 怎么識別一張圖片里的人臉趁舀。參考官方Example facedetect.cpp

首先你需要額外把 opencv 的源碼包下載回來赖捌,然后找到 /data 下的訓練好的 xml 模型來使用。

比如我下載的路徑是:opencv-4.1.0/data/haarcascades/haarcascade_frontalface_alt2

file_xml.png
cv::Mat orignalImg;
UIImageToMat([UIImage imageNamed:@"face1"], orignalImg);
    
std::vector<cv::Rect> faces;
NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"];
faceDetector.load([path UTF8String]);
faceDetector.detectMultiScale(orignalImg, faces, 1.2, 6, 0, cv::Size(0, 0));
    
cv::Scalar color = cv::Scalar( rand() & 255, rand() & 255, rand() & 255 );
for ( size_t i = 0; i < faces.size(); i++ ) {
    cv::rectangle(orignalImg, cv::Point(faces[i].x, faces[i].y), cv::Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
    color);
}
self.resultView.image = MatToUIImage(orignalImg);

UIImageToMat 和 MatToUIImage 這個是 OpenCV 專門為 iOS 提供的 UIImage 與 cv::Mat 互轉(zhuǎn)的方法矮烹。頭文件在 <opencv2/imgcodecs/ios.h>下越庇。

faceDetector.load 將你要使用的 xml 模型加載進去。然后調(diào)用 faceDetector.detectMultiScale 傳參數(shù)進去奉狈,將識別到的臉的位置卤唉,都存進 faces 里。

然后我們還在 orignalImg 這個 Mat 上繪制矩形框仁期,標注臉的位置桑驱。

視頻流

官方文檔,已經(jīng)給出非常清晰的視頻使用方法 OpenCV iOS - Video Processing

按照文檔的寫蟀拷,就能顯示視頻了碰纬。

我們需要處理的是 CvVideoCameraDelegate 這個的回調(diào) processImage 方法的回調(diào)。

注意processImage:(cv::Mat &)image這里的是引用傳遞问芬,所以直接修改 image 就能修改 cv::Mat 的數(shù)據(jù)悦析。

我們可以直接拿圖片識別的方法來測試,發(fā)現(xiàn)是可以的此衅,但是有很嚴重的掉幀現(xiàn)象强戴,視頻里看到的是一卡一卡的慢速運動。

參考 facedetect.cpp 文檔挡鞍,我們學習它一樣骑歹,將圖片灰度化、縮小墨微、增加對比度后道媚,然后再去識別,減小識別難度,加快速度最域。

提升性能版谴分,我們將圖片灰度化后,縮小到25%镀脂。然后再去識別牺蹄,整個速度就提上來了。

我們最終還在原圖image上畫框薄翅,但是計算是用縮小的 smallImg 圖沙兰,所以在 faces 的坐標需要轉(zhuǎn)換回去。

- (void)processImage:(cv::Mat &)image {
    double scale = 1.0 / 4.0;
    cv::Mat gray, smallImg;

    // 灰度化翘魄、縮小鼎天、直方圖增強對比
    cvtColor( image, gray, cv::COLOR_BGRA2GRAY);
    resize( gray, smallImg, smallImg.size(), scale, scale, cv::INTER_LINEAR_EXACT  );
    equalizeHist( smallImg, smallImg );

    std::vector<cv::Rect> faces;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"];
    faceDetector.load([path UTF8String]);
    faceDetector.detectMultiScale(smallImg, faces, 1.2, 6, 0, cv::Size(0, 0));
        
    cv::Scalar color = cv::Scalar( rand() & 255, rand() & 255, rand() & 255 );
    for ( size_t i = 0; i < faces.size(); i++ ) {
        cv::rectangle(image, cv::Point(faces[i].x / scale, faces[i].y / scale), cv::Point(faces[i].x / scale + faces[i].width / scale, faces[i].y / scale + faces[i].height / scale),
        color);
    }
}

總結(jié)

OpenCV 整個使用流程還蠻順暢,且操作邏輯統(tǒng)一熟丸。OpenCV的文檔非常棒训措,又齊全,又完整光羞。

UIView 的圖片和視頻就感覺完全是2個團隊的風格绩鸣,不僅數(shù)據(jù)格式不同,坐標系也不同纱兑。實際代碼量也挺大呀闻。

參考

Face Recognition with OpenCV

OpenCV iOS - Video Processing

facedetect.cpp

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市潜慎,隨后出現(xiàn)的幾起案子捡多,更是在濱河造成了極大的恐慌,老刑警劉巖铐炫,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垒手,死亡現(xiàn)場離奇詭異,居然都是意外死亡倒信,警方通過查閱死者的電腦和手機科贬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鳖悠,“玉大人榜掌,你說我怎么就攤上這事〕俗郏” “怎么了憎账?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卡辰。 經(jīng)常有香客問我胞皱,道長邪意,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任反砌,我火速辦了婚禮抄罕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘于颖。我一直安慰自己,他們只是感情好嚷兔,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布森渐。 她就那樣靜靜地躺著,像睡著了一般冒晰。 火紅的嫁衣襯著肌膚如雪同衣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天壶运,我揣著相機與錄音耐齐,去河邊找鬼。 笑死蒋情,一個胖子當著我的面吹牛埠况,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棵癣,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辕翰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狈谊?” 一聲冷哼從身側(cè)響起喜命,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎河劝,沒想到半個月后壁榕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡赎瞎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年牌里,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煎娇。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡二庵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缓呛,到底是詐尸還是另有隱情催享,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布哟绊,位于F島的核電站因妙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攀涵,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一铣耘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧以故,春花似錦蜗细、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昆烁,卻和暖如春吊骤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背静尼。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工白粉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鼠渺。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓鸭巴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拦盹。 傳聞我的和親對象是個殘疾皇子奕扣,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容