可以不用openCV,用C++寫一個簡單的人臉識別程序么?

一個簡單的人臉識別程序,識別函數在openCV裡面幾行就搞定了。如果自己用C++去寫識別函數,工作量會很大么?網上的程序基本上都是基於openCV開發的,有沒有不用openCV的代碼呢?


你首先要明白人臉識別程序包括了哪些流程?
(1)不提數據採集了,第一步是圖像或視頻解碼,光圖像就有N多種格式:bmp,jpg,png,pgm,ppm等等,每種裡面都可能還有細分,比如有損的圖像,無損的圖像,你都需要自己來寫;
(2)人臉檢測,最簡單的就是harr特徵,自己寫,分類器是adaboost,自己寫,人臉檢測的訓練流程,測試流程,人臉檢測模型的讀取和輸出,都要自己寫;
(3)人臉識別,最簡單的,特徵臉eigenface,其中涉及最簡單的pca演算法,矩陣特徵分解演算法,自己寫,配上最簡單的分類器最近鄰,計算向量的距離,自己寫,人臉識別訓練流程,識別流程,自己寫;
(4)其他的數據預處理,各種IO操作等等;
這裡面已經是最簡單的人臉識別流程了。。。
而opencv可以幫你完成上述90%的工作!如果不用opencv或者類似的庫,我不知道你能不能寫出所有的完整的流程,就算寫出來了,我不知道,還能不能說是「簡單的」程序?


不用opencv的話,dlib的人臉檢測,還有關鍵點檢測都是很好的。
不建議自己從頭寫,且不說演算法,一個內存管理問題都折騰死你,親身體會。


當然可以,看怎麼定義「簡單」了,Windows hello里人臉識別模塊大概3MB的CPP文件,當然這是在線識別部分,不包括訓練,數據採集,標註,測試……


你要先告訴大家你為什麼要這麼做,大家的回答才會有針對性。


可以的,現在的話基於Dlib可能會更簡單。這是一個dlib的例子,基於Python語言。但是dlib是C++開發的,可以很容易地改成C++。

40行代碼的人臉識別實踐


不用OpenCV你把圖片讀出來就不簡單了,別說後面的處理了


「識別函數在openCV裡面幾行就搞定了......」

絕不會是幾行就搞定了,這幾行函數里調用的函數簡直了。

還是先通讀代碼搞清原理吧。


當然可以。opencv也是用c++寫的。無非就是用c++重新寫一次而已


反對一下說手寫讀取jpg的,題主只是說不能用opencv,還有一些叫「lib+&<圖像格式後綴名&>」系列庫可以用的嘛,比如libjpeg。如果是出於學習目的自己寫寫沒有問題,如果是有需求要用的話,建議還是不要自己造輪子了。
不知道題主說的人臉識別是要做到什麼程度,能找出人臉?判斷簡單的特徵(性別、是否戴眼鏡)?判斷是誰?還是像微軟之前出的預測年齡的功能?
說說我自己的經歷,算不上正兒八經的人臉識別。上個學期選了門叫「機器學習」的選修課(不是計算機專業選的,全校都能選的那種通識課程),要做圖像識別相關的作業,規定除了讀取圖像可以用庫之外,別的代碼都必須自己寫,然後我又很初生牛犢不怕虎地想做人臉識別,因為水平有限,所以降低了難度,做了個給出報名照識別性別的程序,思路是libjpeg解碼後所有像素扔給神經網路去訓練,訓練樣本用的是從我高中網站偷偷扒下來的歷屆報名照。
一共兩個輸出,都是0-1之間,第一個比第二個高就是男生,你們感受一下很man的習大大。

自己造輪子,除了寫代碼花時間之外,還要花時間去理解演算法,而且我覺得後者可能占的比重比想像的要大。


主要回答最後一個問題。

當然有不用OpenCV的。我之前實習的一個公司,他們的代碼就是從底層自己做起的(因為他們也做自己的硬體)。不過我想這無論如何都不會是個簡單的過程吧,畢竟他們有專門的一個團隊寫底層的函數庫,另外一個團隊研究上層的識別演算法。


你這個所謂的不用OpenCV也其實就是把OpenCV里自己要用到的函數重寫了一遍,施主何苦呢?難道想蓋層樓真的要從打磨榔頭和採礦開始?


人臉檢測dlib C++ Library速度稍慢,不能實時,應用hog來進行人臉檢測。建議基於joint或是於仕其的快速人臉檢測


給我一感覺,明明可以直接用別人的麥克斯韋 你偏要自己繞電磁法拉第安培╮(╯_╰)╭


擼主可知道僅僅寫一個jpeg圖片的解壓演算法有多麼複雜么?


來來來,題主,我問下你手寫C++的代碼,怎麼打開JPG。


感覺題主可以查一下JPEG的含義


有,CImg。
其實opencv底層也是C++, 目的就是公共工具集,不重複發明輪子,當然你想自己造也沒問題,但你想只做人臉識別部分的話,那你還需要一個mini lib幫你解決圖像解碼讀取,顯示等問題。

有興趣可以試試自己寫的程序與opencv中的介面性能差多少,在優化性能方面源碼有些tricks蠻值得學習的


OpenCV裡面的函數都是打包好的給你用,實際上是非常複雜的數學運算,如果自己來寫會非常複雜,我們之前寫過一個讀取BMP的圖像大約用了500行左右,這還只是讀取某一種圖像格式。
不過你可以嘗試使用http://cimg.eu 來做,這個庫也有很豐富的圖像處理方法。



推薦閱讀:

你的導師coding能力如何?
工業相機自動對焦如何實現?機器視覺的自動對焦開發與應用前景如何?
雙目立體視覺中,標定內外參數後,如何由左攝像機和右攝像機獲取的圖片的某一像素坐標求出世界坐標?
為什麼視覺搞了這麼多年,標定還是各種問題,3D還是各種不靠譜?
halcon學習方法與應該注意的技巧?

TAG:編程 | 人臉識別 | C | OpenCV | 計算機視覺 |