1. 程式人生 > >人臉檢測與識別 (環境:opencv3.3.0 + vs2015)

人臉檢測與識別 (環境:opencv3.3.0 + vs2015)

首先,全部程式碼實現參考冰不語,感謝大佬提供程式碼(檢視官網也可),幫助素人學習。

總的來說,當你走過一遍以後,會發現其實很簡單,基本都是呼叫opencv庫和opencv_contrib庫,關於opencv_contrib的配置方法,CSDN上真正對你路子的方法很少,所以建議初學者安裝版本時,選擇你參考的安裝方法的版本,除錯起來會更方便,如果你是3.3.0版本,需要配置contrib的話,可以私信我,我可以分享編譯好的install檔案給你,免除配置煩惱。

至於為什麼寫這篇文章,是應為冰不語的版本時opencv2.*的版本,自己再寫3.3版本時,遇到很多坑,然後一一填滿,所以避免opencv3新手入坑吧,寫了這篇總結。

重點開始

  • 資料準備                                                                                                                                                                          ORL人臉資料庫,參考:人臉識別之一資料收集和預處理                                                                                                   本人資料準備:
#include <opencv2/opencv.hpp>;
#include <iostream>

using namespace cv;
using namespace std;

char ad[128] = { 0 };
int main()
{
	vector<Rect> faces;
	Mat image, image_gray;

	for (int i = 1; i < 11; i++)
	{
		sprintf_s(ad, "你的照片路徑(注意分割符用\\或者/)\\%d.jpg", i);
		image = imread(ad);
		cvtColor(image, image_gray, COLOR_BGR2GRAY);
		equalizeHist(image_gray, image_gray);
		CascadeClassifier face_cascade; //載入分類器
		if (!face_cascade.load("分類器存放目錄\\haarcascade_frontalface_alt.xml"))
		{
			cout << "Load haarcascade_frontalface_alt failed" << endl;
			return 0;
		}
		vector<Rect> faceRect;
		face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
		for (size_t j = 0; j < faceRect.size(); j++)
		{
			Mat faceROI = image(faceRect[j]);
			Mat MyFace;
			if (faceROI.cols > 100)
			{
				resize(faceROI, MyFace, Size(92, 112));
				string str = format("儲存路徑\\s41\\%d.jpg", i);
				imwrite(str, MyFace);
			}

		}

	}


}

這部分沒遇到什麼問題,如有問題,歡迎提問

  • 模型訓練                                                                                                                                                 
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <math.h>
    #include <opencv2/opencv.hpp>
    #include <opencv2/face/facerec.hpp>
    #include <opencv2/face.hpp>
    
    using namespace std;
    using namespace cv;
    using namespace cv::face;
    
    
    static Mat norm_0_255(InputArray _src) {
    	Mat src = _src.getMat();
    	// 建立和返回一個歸一化後的影象矩陣:  
    	Mat dst;
    	switch (src.channels()) {
    	case1:
    		cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
    		break;
    	case3:
    		cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
    		break;
    	default:
    		src.copyTo(dst);
    		break;
    	}
    	return dst;
    }
    	
    //使用CSV檔案去讀影象和標籤,主要使用stringstream和getline方法  
    static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {
    	std::ifstream file(filename.c_str(), ifstream::in);
    	if (!file) {
    		string error_message = "No valid input file was given, please check the given filename.";
    		CV_Error(CV_StsBadArg, error_message);
    	}
    	string line, path, classlabel;
    	while (getline(file, line)) {
    		stringstream liness(line);
    		getline(liness, path, separator);
    		getline(liness, classlabel);
    		if (!path.empty() && !classlabel.empty()) {
    			images.push_back(imread(path, 0));
    			labels.push_back(atoi(classlabel.c_str()));
    		}
    	}
    }
    
    int main()
    {
    	system("color 3F");
    	//讀取檔案路徑
    	string  fn_csv = "路徑\\att_faces\\at.txt";
    
    	//定義容器存放影象資料和標籤
    	vector<Mat> images;
    	vector<int> labels;
    
    	//讀取資料
    	try
    	{
    		read_csv(fn_csv, images, labels);
    	}
    	catch (cv::Exception& e)
    	{
    		cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
    		// 檔案有問題,我們啥也做不了了,退出了  
    		exit(1);
    	}
    	// 如果沒有讀取到足夠圖片,也退出.  
    	if (images.size() <= 1) {
    		string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
    		CV_Error(CV_StsError, error_message);
    	}
    
    	//訓練集去除最後一張圖片
    	Mat testSample = images[images.size() - 1];
    	int testLabel = labels[labels.size() - 1];
    	images.pop_back();
    	labels.pop_back();
    
    	Ptr<EigenFaceRecognizer> model = EigenFaceRecognizer::create();
    	model->train(images, labels);
    	model->write("MyFacePCAModel.xml");
    
    	Ptr<FisherFaceRecognizer> model1 = FisherFaceRecognizer::create();
    	model1->train(images, labels);
    	model1->write("MyFaceFisherModel.xml");
    
    	Ptr<LBPHFaceRecognizer> model2 = LBPHFaceRecognizer::create();
    	model2->train(images, labels);
    	model2->write("MyFaceLBPHModel.xml");
    
    	// 下面對測試影象進行預測,predictedLabel是預測標籤結果  
    	int predictedLabel = model->predict(testSample);
    	int predictedLabel1 = model1->predict(testSample);
    	int predictedLabel2 = model2->predict(testSample);
    
    	string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
    	string result_message1 = format("Predicted class = %d / Actual class = %d.", predictedLabel1, testLabel);
    	string result_message2 = format("Predicted class = %d / Actual class = %d.", predictedLabel2, testLabel);
    	cout << result_message << endl;
    	cout << result_message1 << endl;
    	cout << result_message2 << endl;
    
    	waitKey(0);
    	return 0;
    
    }
    問題彙總                                                                                                                                                   1.這裡有難度的地方就是at.txt檔案的製作,我是按照冰不語的方式做的,但是有一個問題就是,我做出來的,我本人的照片並不是物件41標籤,而是35,無所謂的,能找到自己就行。

      2.特徵模型的建立,繼續我大哥,冰不語:opencv3.3 API變換,你以為這樣就夠了嘛,不是的,當我訓練完成以後,在進行測試識別的時候, 出現了OpenCV Error: Unspecified error錯誤,不得不說,百度拯救了我,沒錯,在opencv3.3以前,save對應load, 3.3就要變成write對應read, 水平真的有限,你體會的到我被那哥錯誤支配半天的痛苦嗎,我都要放棄的時候,找到了答案,題外話,遇到問題,百度百度再百度,人類那麼多,總會有和你問題一樣的“先行者”,加油,你行的!

  • 識別自己的臉

    冰不語是呼叫的攝像頭,我選擇讀自己其他的照片,別說這個簡單,沒有參考的去做這個,你做你還真能行!

程式碼奉上:

#include <opencv2/opencv.hpp>
#include <opencv2/face.hpp>
#include <opencv2/face/facerec.hpp>
#include <iostream>

using namespace std;
using namespace cv;
using namespace cv::face;

int main()
{
	system("color 3F");
	Mat image, image_gray;

	image = imread("huangbo.jpg");
	//namedWindow("蘇寶寶本人");
	//imshow("蘇寶寶本人", image);
	cvtColor(image, image_gray, CV_BGR2GRAY);
	equalizeHist(image_gray, image_gray);
	//imshow("蘇寶寶", image_gray);

	CascadeClassifier cascade;
	cascade.load("haarcascade_frontalface_alt.xml");
	vector<Rect> faces(0);
	cascade.detectMultiScale(image_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
	Mat face;
	Point text_lb;
	for (size_t i = 0; i < faces.size(); i++)
	{
		if (faces[i].height > 0 && faces[i].width > 0)
		{
			face = image_gray(faces[i]);
			text_lb = Point(faces[0].x, faces[0].y);
			rectangle(image, faces[0], Scalar(0, 255, 0), 1, 8, 0);
		}
			
	}
    Ptr<EigenFaceRecognizer> modelPCA = EigenFaceRecognizer::create();
	modelPCA -> read("MyFacePCAModel.xml");

	int predictPCA = 50;
	Mat face_test;
	if (face.rows >= 120)
	{
		resize(face, face_test, Size(92, 112));
	}

	if (!face_test.empty())
	{
		predictPCA = modelPCA->predict(face_test);
	}
	if (predictPCA == 50)
	{
		string name2 = "Not RanRansu";
		putText(image, name2, text_lb, FONT_HERSHEY_COMPLEX, 1, Scalar(255, 0, 0));
		cout << "未匹配到合適的人臉" << endl;
		namedWindow("人臉識別結果");
		imshow("人臉識別結果", image);
	}

	if (predictPCA == 35)
	{
		string name = "RanRanSu";
		putText(image, name, text_lb, FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255));
		cout << "我們可愛的蘇寶寶本人" << endl;
		namedWindow("人臉識別結果");
		imshow("人臉識別結果", image);	
	}

	waitKey(0);
	return 0;
}

那個model ->read,真是是拿智商在支配我,別說了,多看基礎東西!

沒有結果的部落格不是好部落格。。。。。。

警告!!!!!!!!!!!

膽小勿看下滑。。。。。


感謝我可愛的舍友RanRanSu出境,祝願他生活幸福,少和媳婦鬧矛盾,好好走下去!!!!

我本人比較帥

把識別不出的仙女奉上:


最長的一篇部落格,真心希望對你有用,生活快樂!

相關推薦

人臉檢測識別 環境opencv3.3.0 + vs2015

首先,全部程式碼實現參考冰不語,感謝大佬提供程式碼(檢視官網也可),幫助素人學習。總的來說,當你走過一遍以後,會發現其實很簡單,基本都是呼叫opencv庫和opencv_contrib庫,關於opencv_contrib的配置方法,CSDN上真正對你路子的方法很少,所以建議初

python實現人臉檢測識別3---- 識別真正的boss

    現在模型訓練已經完成,只需要一個預測函式判斷拍攝的照片是否是boss即可,在boss_train.py裡的Model新增predeict實現函式。 def predict(self, image): # 依然是根據後端系統確定維度順序

python實現人臉檢測識別2---- 利用keras庫訓練人臉識別模型

前面已經採集好資料集boss資料夾存放需要識別的物件照片,other存放其他人的訓練集照片,現在,我們終於可以嘗試訓練我們自己的卷積神經網路模型了。CNN擅長影象處理,keras庫的tensorflow版亦支援此種網路模型,萬事俱備,就放開手做吧。前面說過,我們需要通過大量的訓練資料訓練我們的模型,

python實現人臉檢測識別1---- 採集人臉資料

    本次專案是採用keras深度學習框架,訓練人臉識別模型,採用opencv實時檢測與識別周圍的人臉,本文主要講解如何採集訓練集,本次程式碼在人臉識別的程式碼上添加了將識別的照片依次寫入指定資料夾,並命名(000-499).jpg和顯示識別的第N張照片的文字顯示。 程式

VS2010+Opencv2.4.4+MFC實現人臉檢測識別

        運用Opencv實現人臉的檢測和識別是非常方便的,也比較常用。對於人臉檢測可以用Opencv自帶的分類器實現,而人臉識別需要自建訓練分類器,以及收集人臉資料。本文重點講講人臉資料的訓練以及人臉識別的實現,識別功能的實現也結合了MFC這個基礎類庫,介面更加美觀

JavaBean簡單介紹使用例項JSP+JavaBean註冊驗證

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getSchem

LINUX之samba伺服器的安裝配置基於redhat 6.3發行版

linux系統之間或者linux系統和windows系統之間難免會有共享檔案的時候,實現共享的方法有很多,這裡簡單介紹一下通過samba伺服器實現linux系統與windows系統之間的檔案共享的方法。 我是windows下通過虛擬機器安裝的linux系統,redhat 6.3發行版。實現sa

OpenCV3.3.0安裝配置opencv3.3.0+VS2015社群版+64位win7

博主是一名準研究生,研究生階段準備學習計算機視覺方向,涉及影象識別和處理,選擇安裝opencv庫作為前期學習工具,因為不懂,所以在網上看了許多關於opencv安裝配置的資料和部落格,最後終於成功了。(哭,opencv一共下載了2.2.9,2.2.11,3.0

caffe編譯安裝 Ubuntu16.04.3+cuda8.0+opencv3.3.0+anaconda3

然後修改makefile檔案NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS) 替換為: NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) 然

計算機視覺目標檢測識別

1 - 引言 目標檢測和識別,是計算機視覺最常見的挑戰之一。 目標檢測和識別的區別在於:目標檢測是用來確定影象的某個區域是否含有要識別的物件,而識別是程式識別物件的能力。識別通常只處理已檢測到物件的區域。 在計算機視覺中有很多目標檢測和識別的技術 梯度直方圖(Hist

計算機視覺人臉檢測識別

1 - 引言 之前我們學習了機器學習和數字影象處理的相關知識,瞭解了基本的概念理論和OpenCV和TensorFlow框架的使用,現在我們可以結合這些知識與工具寫出屬於我們自己的計算機視覺專案,本文主要介紹瞭如何使用OpenCV提供的函式來構建一個人臉識別和檢測的應用 2 - Haa

讓opencv輸出人臉檢測的得分置信率

讓opencv輸出人臉檢測的得分(置信率) 最近專案略多,其中一個需要找出一些和臉比較像但是不是臉的負樣本,想用opencv的人臉檢測器檢測到的錯誤臉作為這樣的負樣本。 但是國內(包括國外)居然幾乎沒有相關的資料如何輸出detectMultiScale()

SelectSearch+CNN人工智慧實現人臉檢測識別圖文教程附完整專案程式碼python語言

未完待續。。。 本文只說明原理,提供參考,實際應用需考慮其他因素。 環境 win7 python3.6.3 keras2.1.4 注意:各軟體之間版本之間存在適配問題。 目標 通過人工智慧技術實現目標(人臉)檢測和識別 步驟 1.selectsearc

人臉檢測識別 原始碼 下載-opencv3+python3.6完整實戰專案原始碼 識別視訊《歡樂頌》中人物

import os import sys import cv2 import numpy as np def normalize(X, low, high, dtype=None): """Normalizes a given array in X to a value between low an

目標檢測分割SSD詳解

SSD github : https://github.com/weiliu89/caffe/tree/ssd SSD paper : https://arxiv.org/abs/1512.02325 SSD eccv2016 slide pdf : http://d

opencv3 人臉檢測識別

人臉部檢測輸入:face_detection_still.pyimport cv2 from skimage import io filename = 'people.jpg' def detect(filename): face_cascade = cv2.Casc

openCV-人臉檢測特徵點識別

綜述 最近在做計算機視覺的一些基礎訓練,用opencv做了做人臉檢測。 注意opencv的人臉檢測不是基於深度學習的。後期我還做了用tensorflow搞人臉識別的demo,到時候再發一下。 環境 mac os pycharm 使用opencv3

Opencvdlib聯合進行人臉關鍵點檢測識別

前言 依賴庫:opencv 2.4.9 /dlib 19.0/libfacedetection 本篇不記錄如何配置,重點在實現上。使用libfacedetection實現人臉區域檢測,聯合dlib標記人臉特徵點,最後使用opencv的FaceRecogniz

Opencvdlib聯合進行人臉關鍵點檢測識別【轉】

來自:http://blog.csdn.net/mr_curry/article/details/51994497 前言 依賴庫:OpenCV 2.4.9 /dlib 19.0/libfacedetection  本篇不記錄如何配置,重點在演算法實現上。使用libf

QT+Opencv實現人臉檢測性別識別(1)

seetaface開源人臉檢測框架實現人臉檢測,opencv+dnn模組實現性別分類,qt做顯示介面,完成一個課程設計。 依賴庫:opencv3.1+ 包含dnn模組,QT5 1.性別分類網路訓練 1.1.訓練資料準備 下載lfw人臉資