最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Opencv EigenFace人臉識(shí)別算法詳解

 更新時(shí)間:2019年05月21日 08:33:10   作者:東城青年  
這篇文章主要為大家詳細(xì)介紹了Opencv EigenFace人臉識(shí)別算法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

簡(jiǎn)要:

EigenFace是基于PCA降維的人臉識(shí)別算法,PCA是使整體數(shù)據(jù)降維后的方差最大,沒(méi)有考慮降維后類間的變化。 它是將圖像每一個(gè)像素當(dāng)作一維特征,然后用SVM或其它機(jī)器學(xué)習(xí)算法進(jìn)行訓(xùn)練。但這樣維數(shù)太多,根本無(wú)法計(jì)算。我這里用的是ORL人臉數(shù)據(jù)庫(kù),英國(guó)劍橋?qū)嶒?yàn)室拍攝的,有40位志愿者的人臉,在不同表情不同光照下每位志愿者拍攝10張,共有400張圖片,大小為112*92,所以如果把每個(gè)像素當(dāng)做特征拿來(lái)訓(xùn)練的話,一張人臉就有10304維特征,這么高維的數(shù)據(jù)根本無(wú)法處理。所以需要先對(duì)數(shù)據(jù)進(jìn)行降維,去掉一些冗余的特征。

第一步:將ORL人臉圖片的地址統(tǒng)一放在一個(gè)文件里,等會(huì)通過(guò)對(duì)該文件操作,將圖片全部加載進(jìn)來(lái)。

//ofstream一般對(duì)文件進(jìn)行讀寫操作,ifstream一般對(duì)文件進(jìn)行讀操作
ofstream file;
 file.open("path.txt");//新建并打開文件
 char str[50] = {};
 for (int i = 1; i <= 40; i++) {
 for (int j = 1; j <= 10; j++) { 
  sprintf_s(str, "orl_faces/s%d/%d.pgm;%d", i, j, i);//將數(shù)字轉(zhuǎn)換成字符
  file << str << endl;//寫入
 } 
 }

得到路勁文件如下圖所示:

 第二步:讀入模型需要輸入的數(shù)據(jù),即用來(lái)訓(xùn)練的圖像vector<Mat>images和標(biāo)簽vector<int>labels

string filename = string("path.txt");
 ifstream file(filename);
 if (!file) { 
    printf("could not load file"); 
  }
 vector<Mat>images;
 vector<int>labels;
 char separator = ';';
 string line,path, classlabel;
 while (getline(file,line)) {
 stringstream lines(line);
 getline(lines, path, separator);
 getline(lines, classlabel);
 images.push_back(imread(path, 0));
 labels.push_back(atoi(classlabel.c_str()));//atoi(ASCLL to int)將字符串轉(zhuǎn)換為整數(shù)型
 }

第三步:加載、訓(xùn)練、預(yù)測(cè)模型

Ptr<BasicFaceRecognizer> model = EigenFaceRecognizer::create();
 model->train(images, labels);
 int predictedLabel = model->predict(testSample);
 printf("actual label:%d,predict label :%d\n", testLabel, predictedLabel);

補(bǔ)充:

1、顯示平均臉

//計(jì)算特征值特征向量及平均值
 Mat vals = model->getEigenValues();//89*1
 printf("%d,%d\n", vals.rows, vals.cols);
 Mat vecs = model->getEigenVectors();//10324*89
 printf("%d,%d\n", vecs.rows, vecs.cols);
 Mat mean = model->getMean();//1*10304
 printf("%d,%d\n", mean.rows, mean.cols);
 
 //顯示平均臉
 Mat meanFace = mean.reshape(1, height);//第一個(gè)參數(shù)為通道數(shù),第二個(gè)參數(shù)為多少行
 normalize(meanFace, meanFace, 0, 255, NORM_MINMAX, CV_8UC1);
 imshow("Mean Face", meanFace);

2、顯示前部分特征臉

//顯示特征臉
 for (int i = 0; i<min(10, vals.rows); i++) {
 Mat feature_vec = vecs.col(i).clone();
 Mat feature_face= feature_vec.reshape(1, height); 
 normalize(feature_face, feature_face, 0, 255, NORM_MINMAX, CV_8UC1); 
 Mat colorface;
 applyColorMap(feature_face, colorface, COLORMAP_BONE);
 
 sprintf_s(win_title, "eigenface%d", i);
 imshow(win_title, colorface);
 }

3、對(duì)第一張人臉在特征向量空間進(jìn)行人臉重建(分別基于前10,20,30,40,50,60個(gè)特征向量進(jìn)行人臉重建)

//重建人臉
 for (int i = min(10, vals.rows); i <min(61, vals.rows); i+=10) {
 Mat vecs_space = Mat(vecs, Range::all(), Range(0, i));
 Mat projection = LDA::subspaceProject(vecs_space, mean, images[0].reshape(1, 1));//投影到子空間
 Mat reconstruction = LDA::subspaceReconstruct(vecs_space, mean, projection);//重建
 Mat result = reconstruction.reshape(1, height);
 normalize(result, result, 0, 255, NORM_MINMAX, CV_8UC1);
 //char wintitle[40] = {};
 sprintf_s(win_title, "recon face %d", i);
 imshow(win_title, result);
 }

完整代碼如下:

#include<opencv2\opencv.hpp>
#include<opencv2\face.hpp>
using namespace cv;
using namespace face;
using namespace std;
char win_title[40] = {};
 
int main(int arc, char** argv) { 
 namedWindow("input",CV_WINDOW_AUTOSIZE);
 
 //讀入模型需要輸入的數(shù)據(jù),用來(lái)訓(xùn)練的圖像vector<Mat>images和標(biāo)簽vector<int>labels
 string filename = string("path.txt");
 ifstream file(filename);
 if (!file) { printf("could not load file"); }
 vector<Mat>images;
 vector<int>labels;
 char separator = ';';
 string line,path, classlabel;
 while (getline(file,line)) {
 stringstream lines(line);
 getline(lines, path, separator);
 getline(lines, classlabel);
 //printf("%d\n", atoi(classlabel.c_str()));
 images.push_back(imread(path, 0));
 labels.push_back(atoi(classlabel.c_str()));//atoi(ASCLL to int)將字符串轉(zhuǎn)換為整數(shù)型
 }
 int height = images[0].rows;
 int width = images[0].cols;
 printf("height:%d,width:%d\n", height, width);
 //將最后一個(gè)樣本作為測(cè)試樣本
 Mat testSample = images[images.size() - 1];
 int testLabel = labels[labels.size() - 1];
 //刪除列表末尾的元素
 images.pop_back();
 labels.pop_back();
 
 //加載,訓(xùn)練,預(yù)測(cè)
 Ptr<BasicFaceRecognizer> model = EigenFaceRecognizer::create();
 model->train(images, labels);
 int predictedLabel = model->predict(testSample);
 printf("actual label:%d,predict label :%d\n", testLabel, predictedLabel);
 
 //計(jì)算特征值特征向量及平均值
 Mat vals = model->getEigenValues();//89*1
 printf("%d,%d\n", vals.rows, vals.cols);
 Mat vecs = model->getEigenVectors();//10324*89
 printf("%d,%d\n", vecs.rows, vecs.cols);
 Mat mean = model->getMean();//1*10304
 printf("%d,%d\n", mean.rows, mean.cols);
 
 //顯示平均臉
 Mat meanFace = mean.reshape(1, height);//第一個(gè)參數(shù)為通道數(shù),第二個(gè)參數(shù)為多少行
 normalize(meanFace, meanFace, 0, 255, NORM_MINMAX, CV_8UC1);
 imshow("Mean Face", meanFace);
 
 //顯示特征臉
 for (int i = 0; i<min(10, vals.rows); i++) {
 Mat feature_vec = vecs.col(i).clone();
 Mat feature_face= feature_vec.reshape(1, height); 
 normalize(feature_face, feature_face, 0, 255, NORM_MINMAX, CV_8UC1); 
 Mat colorface;
 applyColorMap(feature_face, colorface, COLORMAP_BONE);
 
 sprintf_s(win_title, "eigenface%d", i);
 imshow(win_title, colorface);
 }
 
 //重建人臉
 for (int i = min(10, vals.rows); i <min(61, vals.rows); i+=10) {
 Mat vecs_space = Mat(vecs, Range::all(), Range(0, i));
 Mat projection = LDA::subspaceProject(vecs_space, mean, images[0].reshape(1, 1));
 Mat reconstruction = LDA::subspaceReconstruct(vecs_space, mean, projection);
 Mat result = reconstruction.reshape(1, height);
 normalize(result, result, 0, 255, NORM_MINMAX, CV_8UC1);
 //char wintitle[40] = {};
 sprintf_s(win_title, "recon face %d", i);
 imshow(win_title, result);
 }
 
 waitKey(0);
 return 0;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C到C++的升級(jí)關(guān)系及區(qū)別實(shí)例探究

    C到C++的升級(jí)關(guān)系及區(qū)別實(shí)例探究

    這篇文章主要為大家介紹了C到C++的升級(jí)關(guān)系及區(qū)別實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • C++中的并行與并發(fā)基礎(chǔ)與使用詳解

    C++中的并行與并發(fā)基礎(chǔ)與使用詳解

    對(duì)于多線程來(lái)說(shuō),這兩個(gè)概念有很大部分是重疊的。對(duì)于很多人來(lái)說(shuō),它們的意思沒(méi)有什么區(qū)別。其區(qū)別主要在于關(guān)注點(diǎn)和意圖方面(差距甚微)。這兩個(gè)詞都是用來(lái)對(duì)硬件在同時(shí)執(zhí)行多個(gè)任務(wù)的方式進(jìn)行描述的術(shù)語(yǔ),不過(guò)并行更加注重性能
    2023-02-02
  • C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼

    C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù)功能及實(shí)現(xiàn)代碼

    這篇文章主要介紹了C語(yǔ)言字符函數(shù)、內(nèi)存函數(shù) 功能及實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    這篇文章主要介紹了VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在的相關(guān)資料,需要的朋友可以參考下
    2015-10-10
  • 淺析C++內(nèi)存布局

    淺析C++內(nèi)存布局

    本文給大家介紹了C++內(nèi)存布局的相關(guān)知識(shí),通過(guò)進(jìn)程間通信比線程間通信難也是因?yàn)檫M(jìn)程間的用戶空間是相互隔離的,無(wú)法相互訪問(wèn),需要通過(guò)進(jìn)程間通信方式通信,通過(guò)內(nèi)核地址空間
    2021-10-10
  • C語(yǔ)言實(shí)現(xiàn)大學(xué)生考勤管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)大學(xué)生考勤管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)大學(xué)生考勤管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Pthread并發(fā)編程之線程基本元素和狀態(tài)的剖析

    Pthread并發(fā)編程之線程基本元素和狀態(tài)的剖析

    本篇文章主要給大家介紹pthread并發(fā)編程當(dāng)中關(guān)于線程的基礎(chǔ)概念,并且深入剖析進(jìn)程的相關(guān)屬性和設(shè)置,以及線程在內(nèi)存當(dāng)中的布局形式,幫助大家深刻理解線程
    2022-11-11
  • C++ ReSharper2021激活碼永久有效

    C++ ReSharper2021激活碼永久有效

    ReSharperC++是為c/c++開發(fā)者打造的一款實(shí)用Visual Studio擴(kuò)展插件,這款插件旨在提升開發(fā)者的效率,今天給大家分享這款軟件的激活方法,需要C++ ReSharper2021激活碼的朋友參考下本文
    2021-06-06
  • C++學(xué)習(xí)之如何進(jìn)行內(nèi)存資源管理

    C++學(xué)習(xí)之如何進(jìn)行內(nèi)存資源管理

    與java、golang等自帶垃圾回收機(jī)制的語(yǔ)言不同,C++并不會(huì)自動(dòng)回收內(nèi)存,這往往會(huì)導(dǎo)致內(nèi)存泄漏和內(nèi)存溢出等問(wèn)題,所以掌握C++中的內(nèi)存管理技巧和工具是非常重要的,本文就來(lái)和大家詳細(xì)講講
    2023-05-05
  • C++左值引用與指針的區(qū)別及說(shuō)明

    C++左值引用與指針的區(qū)別及說(shuō)明

    左值引用與指針的區(qū)別:左值引用是一個(gè)別名,只能綁定左值,對(duì)左值引用的訪問(wèn)與訪問(wèn)左值是相同的;指針是一個(gè)變量,該變量在內(nèi)存中存在真是的物理地址,該變量?jī)?nèi)的存儲(chǔ)的是一個(gè)內(nèi)存地址,訪問(wèn)指針變量對(duì)應(yīng)的內(nèi)容需要配合解訪問(wèn)符*
    2025-03-03

最新評(píng)論

黄陵县| 江山市| 磐安县| 祁阳县| 高要市| 昌吉市| 苍山县| 车致| 长宁区| 松滋市| 凤山市| 额尔古纳市| 富蕴县| 滁州市| 漳州市| 绥滨县| 唐海县| 云南省| 乌苏市| 喀喇| 福贡县| 丹阳市| 舟曲县| 新泰市| 双柏县| 福建省| 宁河县| 汕头市| 巴楚县| 灵武市| 当阳市| 太白县| 苏尼特左旗| 阿巴嘎旗| 榆中县| 闽侯县| 雷山县| 宁德市| 阳春市| 交口县| 朝阳县|