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

Opencv EigenFace人臉識別算法詳解

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

簡要:

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

第一步:將ORL人臉圖片的地址統(tǒng)一放在一個文件里,等會通過對該文件操作,將圖片全部加載進來。

//ofstream一般對文件進行讀寫操作,ifstream一般對文件進行讀操作
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ù),即用來訓(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ù)測模型

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

補充:

1、顯示平均臉

//計算特征值特征向量及平均值
 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);//第一個參數(shù)為通道數(shù),第二個參數(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、對第一張人臉在特征向量空間進行人臉重建(分別基于前10,20,30,40,50,60個特征向量進行人臉重建)

//重建人臉
 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ù),用來訓(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);
 //將最后一個樣本作為測試樣本
 Mat testSample = images[images.size() - 1];
 int testLabel = labels[labels.size() - 1];
 //刪除列表末尾的元素
 images.pop_back();
 labels.pop_back();
 
 //加載,訓(xùn)練,預(yù)測
 Ptr<BasicFaceRecognizer> model = EigenFaceRecognizer::create();
 model->train(images, labels);
 int predictedLabel = model->predict(testSample);
 printf("actual label:%d,predict label :%d\n", testLabel, predictedLabel);
 
 //計算特征值特征向量及平均值
 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);//第一個參數(shù)為通道數(shù),第二個參數(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;
}

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

相關(guān)文章

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

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

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

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

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

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

    這篇文章主要介紹了C語言字符函數(shù)、內(nèi)存函數(shù) 功能及實現(xiàn),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    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)知識,通過進程間通信比線程間通信難也是因為進程間的用戶空間是相互隔離的,無法相互訪問,需要通過進程間通信方式通信,通過內(nèi)核地址空間
    2021-10-10
  • C語言實現(xiàn)大學(xué)生考勤管理系統(tǒng)

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

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

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

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

    C++ ReSharper2021激活碼永久有效

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

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

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

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

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

最新評論

岚皋县| 樟树市| 镇平县| 苍梧县| 白水县| 潜山县| 方正县| 鄱阳县| 桂东县| 白山市| 上犹县| 衡阳县| 定州市| 五华县| 金秀| 长兴县| 南陵县| 涪陵区| 漳州市| 上栗县| 正镶白旗| 江陵县| 邻水| 祁东县| 闸北区| 合肥市| 大厂| 循化| 肇州县| 武威市| 民和| 固安县| 静海县| 曲靖市| 宜州市| 福安市| 石渠县| 松溪县| 常宁市| 吉木萨尔县| 阿坝县|