人臉識別Project

openCV 基礎(chǔ)函數(shù)和類

OpenCV環(huán)境配置及測試

預(yù)熱:
1俭嘁、環(huán)境配置 
  在系統(tǒng)環(huán)境變量path中 追加路徑:C:\openCV\install\x86\mingw\bin
2沈跨、配置工程文件pro:
  INCLUDEPATH += C:\openCV\install\include
  INCLUDEPATH += C:\openCV\install\include\opencv
  INCLUDEPATH += C:\openCV\install\include\opencv2
  LIBS += C:/openCV/install/x86/mingw/lib/libopencv_*.a
3劲室、頭文件
  #include <opencv2/opencv.hpp>
  using namespace cv;
4仿耽、測試Code
  int main(int argc, char *argv[])
  {
      Mat src, dst;
      src = imread("1.jpg");
      if (!src.data) {
          printf("could not load image...\n");
          return -1;
      }
      namedWindow("input image", CV_WINDOW_AUTOSIZE);
      imshow("input image", src);
      waitKey(0); 
      return 0;
  }
備注:我的QT版本是5.4.0

以下開啟OpenCV的學(xué)習(xí)Q矣堋I恰恭金!

Mat類

OpenCV中表示圖像的類
計(jì)算機(jī)“眼中”的圖片(二維數(shù)組)

創(chuàng)建對象
Mat src;
重要屬性
Mat src;
src.clos; //獲取圖像的寬度
src.rows;//獲取圖像的高度
src.channels();//獲取圖像的通道數(shù),表示一個像素點(diǎn)的數(shù)組元素的個數(shù)褂策,比如:BGR的圖片通道數(shù)是3
常用函數(shù)
功能:加載圖像
  Mat imread( const String& filename, int flags = IMREAD_COLOR );
  參數(shù)1:圖片的路徑
  參數(shù)2:圖像的色彩空間模式(默認(rèn)為BGR)
  返回值:圖像對象

功能:在窗口顯示圖像
  void imshow(const String& winname, const ogl::Texture2D& tex);
  參數(shù)1:窗口名稱
  參數(shù)2:圖像對象Mat就可以

功能:轉(zhuǎn)換圖像色彩空間   色彩空間(一個像素點(diǎn)的組成)
  void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
  參數(shù)1:輸入圖像
  參數(shù)2:輸出圖像
  參數(shù)3:色彩空間  詳情ColorConversionCodes
  參數(shù)4:通道數(shù)横腿,默認(rèn)根據(jù)色彩空間決定

常用來將BGR轉(zhuǎn)成Gray,灰度圖雖然難看辙培,但是保留了原圖像的所有特征蔑水,提升效率。

flip();//圖片翻轉(zhuǎn)
resize();//
Mat類轉(zhuǎn)換到QImage

通常情況下需要在QT上顯示圖片扬蕊,因此了解Mat(BGR)轉(zhuǎn)換QImage(RGB)非常必要

Mat src;
Mat dst;
執(zhí)行操作步驟:
1搀别、色彩空間轉(zhuǎn)換
  cvtColor(src,dst,CV_BGR2RGB);
2、QImage img(dst.data, dst.cols, dst.rows, dst.cols*rgb.channels(), QImage::Format_RGB888);
    QImgae構(gòu)造函數(shù)的參數(shù)說明:
      參數(shù)1:存放圖片數(shù)據(jù)的數(shù)組
      參數(shù)2:圖片的列數(shù)
      參數(shù)3:圖片的行數(shù)
      參數(shù)4:每一行的通道數(shù)
      參數(shù)5:圖片的編碼格式
3尾抑、可以在Qt上顯示了
  ui->show_label->setPixmap(QPixmap::fromImage(img));

VideoCapture視頻類

常用函數(shù)
功能:打開視頻
  bool open(const String& filename);
  參數(shù)1:視頻路徑歇父;參數(shù)傳整數(shù)0,表示打開攝像頭
  返回值:打開成功

功能:讀取視頻幀
  VideoCapture& operator >> (CV_OUT Mat& image);
  參數(shù)1:讀取到Mat對象
  返回值:VideoCapture對象

矩陣掩膜

掩膜并不重要再愈,重要的是通過掩膜我們來感受卷積榜苫,opencv對圖像所有的操作幾乎都是卷積
卷積:對圖片中的每個像素點(diǎn)進(jìn)行特定的操作
有什么用呢?
可以提升圖片的對比度翎冲,對比美顏相機(jī)(降低對比度)

常用函數(shù)
功能:獲取圖像像素指針
Mat src; 
uchar* p = src.ptr<uchar>(i) 獲取圖像像素的指針垂睬,i表示第i行
這里的指針p偏移一個單位是偏移了一個通道,而不是一個像素點(diǎn)抗悍,對于3通道的圖片驹饺,p需要偏移3次才能指向下調(diào)一個像素點(diǎn)

功能:獲取通道數(shù)
src.channels()

功能:獲取位圖深度 
src.depth()
位圖深度:指一個像素點(diǎn)的通道的值,占了幾個二進(jìn)制位

功能:像素范圍處理  
saturate_cast<uchar>(num) 將數(shù)字參數(shù)num的值限制的類型參數(shù)的范圍內(nèi)缴渊,如果num超出最小值范圍赏壹,
函數(shù)返回最小值,超出最大值范圍衔沼,函數(shù)返回最大值蝌借。

功能:掩膜公式
矩陣的掩膜操作十分簡單昔瞧,就是掩膜來計(jì)算每個像素的像素值,從而提升對比對菩佑,掩膜(mask也被稱作kernel)
I(i,j) = 5*I(i,j)-[I(i+1,j)+I(i-1,j)+I(i,j+1)+I(i,j-1)]

功能:對RGB圖修改像素值
  Vec3b val = img.at<Vec3b>(i, j);
  img.at<Vec3b>(y,x)[0]=128; // blue
  img.at<Vec3b>(y,x)[1]=128; // green
  img.at<Vec3b>(y,x)[2]=128; // red
或者
    Vec3b v(255, 255, 255);
    src.at<Vec3b>(j,i) = v;//一次性給返回值的三個通道賦值

Rect類

矩形
void rectangle(    Mat& img,        //背景圖片
                   Rect rec,            //矩形的范圍
                   const Scalar& color,     //顏色
                   int thickness = 1,           //線條寬度
                   int lineType = LINE_8,
                                    //線條類型LINE_4  LINE_8  LINE_AA(反鋸齒)
                   int shift = 0);              //點(diǎn)坐標(biāo)中小數(shù)位數(shù)
截圖自晰,對感興趣區(qū)域選擇
Mat src;
Rect rect(100, 100, 200, 400);
//參數(shù)1 矩形左上角x 
//參數(shù)2 矩形左上角y 
//參數(shù)3 矩形寬 
//參數(shù)4 矩形高
Mat dst = src(rect);
//這里是()的運(yùn)算符重載,從src中截取rect部分的圖片放到dst里

級聯(lián)分類器

理論上可以查找任何事物

訓(xùn)練模型文件采用OpenCV自帶的
路徑:C:/openCV/install/etc/haarcascades/haarcascade_frontalface_alt2.xml

識別:
  通過多級篩選在圖片中尋找目標(biāo)

注意:1擎鸠、不要每次都創(chuàng)建新的對象缀磕,重復(fù)加載模型不合理
      2、加載很多個臉怎么回事 detectMultiScale參數(shù)是不是寫錯了
cv::CascadeClassifier類 _初始化級聯(lián)分類器
CascadeClassifier classifier = CascadeClassifier(const String& filename);
參數(shù):訓(xùn)練模型的文件路徑
人臉檢測函數(shù)_detectMultiScale
void detectMultiScale(
                 InputArray image,
                  //待檢測的灰度圖劣光,需要預(yù)先進(jìn)行直方圖均值化來提升對比度
                 CV_OUT std::vector<Rect>& objects,//查找到的目標(biāo)矩形輸出
                 double scaleFactor = 1.1,//前后兩次相繼的掃描中搜索窗口的比例系數(shù)袜蚕,默認(rèn)為1.1 即每次搜索窗口擴(kuò)大10%,這個值越大,某些尺寸的對象無法被檢測绢涡,但檢測更快
                 int minNeighbors = 3, 
                  //有多少個重疊的檢測標(biāo)記才被認(rèn)為有效
                 int flags = 0, //新的級聯(lián)分類器沒用
                 Size minSize = Size(),//目標(biāo)最小尺寸
                 Size maxSize = Size() );//目標(biāo)最大尺寸牲剃,可以排除不合理對象,大大提升識別效率

機(jī)器學(xué)習(xí)_人臉識別器

1雄可、機(jī)器學(xué)習(xí)的作用:根據(jù)提供的圖片模型通過算法生成數(shù)據(jù)模型凿傅,從而在其他圖片中查找相關(guān)的目標(biāo)
2、人臉識別的兩種常見算法
1.Fisher
輸入數(shù)據(jù)-->減去均值-->計(jì)算離散矩陣-->計(jì)算特征值與特征向量-->計(jì)算前K個最大特征值對應(yīng)特征向量-->投影到子空間-->終止

2.LBPH
開始-->圖像灰度化-->LBP特征提取-->ULBP降維處理-->分割為多個方格-->每個方格生成直方圖-->直方圖連接特征向量集合-->直方圖比較-->得到分類結(jié)果
FaceRecognizer類

opencv提供的人臉識別器基類数苫,LBPHFaceRecognizer是根據(jù)LBPH算法實(shí)現(xiàn)的識別器類.

  • 頭文件
#include <opencv2/face.hpp>  //人臉識別器
using namespace cv::face;
  • 創(chuàng)建對象
//創(chuàng)建空的人臉識別器對象
Ptr<FaceRecognizer> recognizer = LBPHFaceRecognizer::create();
//根據(jù)已有的模型創(chuàng)新人臉識別器對象
Ptr<FaceRecognizer> recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("模型文件.xml");

機(jī)器學(xué)習(xí)

_更新模型
void update(
        InputArrayOfArrays src, //圖片模型數(shù)組  vector<Mat>  
        InputArray labels);//標(biāo)簽數(shù)組聪舒,每個模型識別后的標(biāo)簽 vector<int>

_保存模型
void save(const String& filename);

_預(yù)測目標(biāo)
void predict(InputArray src, //預(yù)測圖形
             int &label,        //預(yù)測后的標(biāo)簽,學(xué)習(xí)時對應(yīng)的標(biāo)簽
             double &confidence) const;//可信度
使用定時器說明

由于UI界面不能出現(xiàn)死循環(huán)之類的虐急,否則就卡住了
因此考慮使用定時器 箱残。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市止吁,隨后出現(xiàn)的幾起案子被辑,更是在濱河造成了極大的恐慌,老刑警劉巖敬惦,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盼理,死亡現(xiàn)場離奇詭異,居然都是意外死亡俄删,警方通過查閱死者的電腦和手機(jī)宏怔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畴椰,“玉大人臊诊,你說我怎么就攤上這事⊙该” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵潜叛,是天一觀的道長秽褒。 經(jīng)常有香客問我壶硅,道長,這世上最難降的妖魔是什么销斟? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任庐椒,我火速辦了婚禮,結(jié)果婚禮上蚂踊,老公的妹妹穿的比我還像新娘约谈。我一直安慰自己,他們只是感情好犁钟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布棱诱。 她就那樣靜靜地躺著,像睡著了一般涝动。 火紅的嫁衣襯著肌膚如雪迈勋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天醋粟,我揣著相機(jī)與錄音靡菇,去河邊找鬼。 笑死米愿,一個胖子當(dāng)著我的面吹牛厦凤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播育苟,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼较鼓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宙搬?” 一聲冷哼從身側(cè)響起笨腥,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勇垛,沒想到半個月后脖母,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闲孤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年谆级,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讼积。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡肥照,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勤众,到底是詐尸還是另有隱情舆绎,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布们颜,位于F島的核電站吕朵,受9級特大地震影響猎醇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜努溃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一硫嘶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梧税,春花似錦沦疾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至斥铺,卻和暖如春彻桃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晾蜘。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工邻眷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剔交。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓肆饶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親岖常。 傳聞我的和親對象是個殘疾皇子驯镊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359