• opencv3.0 人脸识别基础实验入门


    一,基于图像识别
    在上一篇我们将环境搭建好之后,这次开始实践
    实验准备:自己在网上找一张带人物的头像就可以。
    我们使用使用的分类器:haar
    opencv中有三种分类器:
    "haar"特征主要用于人脸检测,
    “hog”特征主要用于行人检测,
    “lbp”特征主要用于人脸识别。
    注意代码中所使用的路径要换成自己的路径才不会报错

    //图片人脸检测
    //void CascadeClassifier::detectMultiScale(InputArray image,
    //	CV_OUT std::vector<Rect>& objects,
    //	double scaleFactor,
    //	int minNeighbors, int flags,
    //	Size minSize,
    //	Size maxSize)
    //InputArray image : 需要被检测的图像(灰度图)
    //vector<Rect>& objects : 保存被检测出的人脸位置坐标序列
    //double scaleFactor : 每次图片缩放的比例
    //int minNeighbors : 每一个人脸至少要检测到多少次才算是真的人脸
    //int flags: 决定是缩放分类器来检测,还是缩放图像
    //Size minSize : 表示人脸的最小尺寸
    //Size maxSize : 表示人脸的最大尺寸
    /**********************************/
    #include<opencv2/objdetect/objdetect.hpp>  
    #include<opencv2/highgui/highgui.hpp>  
    #include<opencv2/imgproc/imgproc.hpp>  
    
    using namespace cv;
    using namespace std;
    
    CascadeClassifier faceCascade;
    
    int main()
    {
    	//faceCascade.load("/root/library/opencv/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt2.xml");//加载分类器
    	faceCascade.load("E:\opcv3\opencv\sources\data\haarcascades\haarcascade_frontalface_alt2.xml");//加载分类器
    	Mat img = imread("timg.jpg");// 载入图片
    	Mat imgGray;
    	vector<Rect> faces;
    
    	if (img.empty())
    	{
    		return 1;
    	}
    
    	if (img.channels() == 3)
    	{
    		cvtColor(img, imgGray, CV_RGB2GRAY); // RGB转化为灰度
    	}
    	else
    	{
    		imgGray = img; // 不转化
    	}
    
    	faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));// 检测人脸
    
    	if (faces.size()>0)
    	{
    		for (int i = 0; i<faces.size(); i++)
    		{
    			rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8);    // 框出人脸
    		}
    	}
    
    	imshow("FacesOfPrettyGirl", img);// 显示图片
    
    	waitKey(0);
    	return 0;
    }
    
    

    识别效果:
    ![

    二、视频实时识别

    //视频检测2.0
    /*************************************************/
    #include "opencv2/objdetect.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    #include <stdio.h>
    
    using namespace cv;
    using namespace std;
    
    // 控制编译版本宏
    //#define VERSION_2_4
    
    /* 参数 : 输入图像、级联分类器、缩放倍数 */
    void DetectAndDraw(Mat& img, CascadeClassifier& cascade, double scale);
    
    int main()
    {
    	CascadeClassifier faceCascade;
    	double scale = 4;
    	int		nRet = 0;
    
    	VideoCapture capture;
    	capture.open(0);
    	//  capture.open("video.avi");
    	if (!capture.isOpened())
    	{
    		cout << "open camera failed. " << endl;
    		return -1;
    	}
    	cout << "open camera succeed. " << endl;
    
    	/* 加载分类器 */
    #ifdef VERSION_2_4	
    	nRet = faceCascade.load("E:\opcv3\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml");
    #else
    	nRet = faceCascade.load("E:\opcv3\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml");
    #endif
    
    	if (!nRet)
    	{
    		printf("load xml failed.
    ");
    		return -1;
    	}
    
    	Mat frame;
    	vector<Rect> faces;
    	while (1)
    	{
    		capture >> frame;
    		if (frame.empty())
    		{
    			continue;
    		}
    
    		Mat frame1 = frame.clone();
    		DetectAndDraw(frame1, faceCascade, scale);
    
    		if (waitKey(1) > 0)		// delay ms 等待按键退出
    		{
    			break;
    		}
    	}
    
    	return 0;
    }
    
    void DetectAndDraw(Mat& img, CascadeClassifier& cascade, double scale)
    {
    	double t = 0;
    	vector<Rect> faces;
    	Mat gray, smallImg;
    	double fx = 1 / scale;
    
    	cvtColor(img, gray, COLOR_BGR2GRAY);	// 将源图像转为灰度图
    
    	/* 缩放图像 */
    #ifdef VERSION_2_4	
    	resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR);
    #else
    	//resize(gray, smallImg, Size(), fx, fx,INTER_LINEAR_EXACT);
    	resize(gray, smallImg, Size(), fx, fx,INTER_LINEAR);
    #endif
    
    	equalizeHist(smallImg, smallImg);	// 直方图均衡化,提高图像质量
    
    	/* 检测目标 */
    	t = (double)getTickCount();
    	cascade.detectMultiScale(smallImg, faces,
    		1.1, 2, 0
    		//|CASCADE_FIND_BIGGEST_OBJECT
    		//|CASCADE_DO_ROUGH_SEARCH
    		| CASCADE_SCALE_IMAGE,
    		Size(30, 30));
    	t = (double)getTickCount() - t;
    	printf("detection time = %g ms
    ", t * 1000 / getTickFrequency());
    
    	/* 画矩形框出目标 */
    	for (size_t i = 0; i < faces.size(); i++) // faces.size():检测到的目标数量
    	{
    		Rect rectFace = faces[i];
    
    		rectangle(img, Point(rectFace.x, rectFace.y) * scale,
    			Point(rectFace.x + rectFace.width, rectFace.y + rectFace.height) * scale,
    			Scalar(0, 255, 0), 2, 8);
    	}
    
    	imshow("FaceDetect", img);	// 显示
    }
    

    实验效果:

    一键三连呀!
  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/jee-cai/p/14095352.html
Copyright © 2020-2023  润新知