精华内容
下载资源
问答
  • 多人脸检测Matlab

    热门讨论 2013-04-23 15:20:01
    人脸检测的matlab程序,可以实现多人脸检测,并且在人脸处画绿框。。。是个比较好的程序,供初学者使用
  • 基于OpenCV的人脸检测,单人脸检测和合照中多人脸检测,Python实现 本例基于opencv4。Python 3.7.4。 Python安装OpenCV4.0的命令: pip install opencv-python 安装完成后: 需要到OpenCV官方GitHub下载...

    基于OpenCV的人脸检测,单人脸检测和合照中多人脸检测,Python实现

    本例基于opencv4。Python 3.7.4。

    Python安装OpenCV4.0的命令:

    pip install opencv-python

    安装完成后:

     

    需要到OpenCV官方GitHub下载人脸检测的分类器:https://github.com/opencv/opencv/tree/master/data/haarcascades

    然后把分类器和所要检测的图片放到一定目录文件夹下加载。我把分类器和图片放在项目根目录下:

     

    Python代码:

    import cv2 as cv
    
    imagepath = "./pic1.jpg"
    
    image = cv.imread(imagepath)
    
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    
    face_cascade = cv.CascadeClassifier('./haarcascade_frontalface_default.xml')
    
    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.2,
        minNeighbors=3,
        minSize=(70, 70),
        maxSize=(160, 160),
        flags=cv.IMREAD_GRAYSCALE
    )
    
    print("检测到{0}个人脸".format(len(faces)))
    
    for (x, y, w, h) in faces:
        cv.rectangle(image, (x, y), (x + w, y + w), (0, 0, 255), 2)
    
    cv.imshow("image", image)
    
    cv.waitKey(0)

     

    检测计算机视觉经典照片lena,原图:

    运行代码后,红框标记出检测到的人脸:

    程序检测到1张人脸。

     

     

    换一张合影照片,看看能否检测到群体像中的人脸,原图:

     

    运行代码后,红框标记出检测到的人脸:

    程序检测到五张人脸。

     

    再来一张,原图:

     

    运行程序:

    程序检测到2个人脸,并用红框标记出人脸范围。

    展开全文
  • 本源代码是基于C#和EmguCV,实现的多人脸检测和识别器。
  • 基于OPCV的多人脸检测与定位系统是可以识别多人的,从一个软件开发论坛弄到的,有需要的可以下载,csdn里给的我发现大部分都是识别一个人的
  • 可以实现多人脸图像的检测,代码有注释,便于新手理解和学习。首先对人脸肤色的色素进行统计,如何在RGB空间下进行建立人脸肤色模型,最后使用MATLAB对其实现,准确度高,代码亲测可以实现。
  • 用matlab+opncv做基于viola-Jones算法可以实现多人脸检测吗?和单人脸有什么不同吗,网上找到的好像都是单人脸</p>
  • cudao10+opencv4.4.0-pre 多人脸检测(GPU版本) 说明: 代码中使用的模型文件:haarcascade_frontalface_alt.xml ,可以使用opencv的github 的data/haarcascades_cuda/haarcascade_frontalface_default.xml 文件。 **...

    **

    cuda10.1+opencv4.4.0-pre 多人脸检测(GPU版本)

    说明: 代码中使用的模型文件:haarcascade_frontalface_alt.xml ,可以使用opencv的github 的data/haarcascades_cuda/haarcascade_frontalface_default.xml 文件。

    #include <iostream>
    #include <chrono>
    #include <opencv2/opencv.hpp>
    #include <opencv2/imgproc/types_c.h>
    #include <opencv2/cudaimgproc.hpp>
    #include <opencv2/cudaobjdetect.hpp>
    
    using namespace cv;
    
    int main(int argc,char *argv[])  {
    
        auto gpu_num = cuda::getCudaEnabledDeviceCount();;
        std::cout<<"gpu num:"<<gpu_num<<std::endl;
    
        auto dev_id = cuda::getDevice();
        std::cout<<"device id:"<<dev_id<<std::endl;
    
        if (argc != 2) {
            std::cout << argv[0] << " jpgname" << std::endl;
            return 0;
        }
    
        Mat image = imread(argv[1], 1);
        auto cc = cuda::CascadeClassifier::create("./haarcascade_frontalface_alt.xml");
        if (!cc) {
            std::cout << "加载分类器失败" << std::endl;
            return 0;
        }
    
        cuda::GpuMat GpuGray;
        cuda::GpuMat GpuImage(image);
        cuda::cvtColor(GpuImage, GpuGray, CV_BGR2GRAY);
        cuda::equalizeHist(GpuGray, GpuGray);
    
        std::vector<Rect> faces;
        cuda::GpuMat objbuf;
        std::chrono::steady_clock::time_point t1 = std::chrono::steady_clock::now();
        cc->detectMultiScale(GpuGray, objbuf);
        std::chrono::steady_clock::time_point t2 = std::chrono::steady_clock::now();
    
        auto diff = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1);
        cc->convert(objbuf, faces);
        std::cout << "face size:" << faces.size() <<", cost :"<< diff.count()<<" mill"<< std::endl;
        for (auto const& face : faces) {
            rectangle(image, Rect(face.x, face.y, face.width, face.height), Scalar(0,0,255), 3);
        }
    
        imwrite("res_gpu.jpg", image);
    
        return 0;
    }
    

    效果如下:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 上一段时间参加了某个比赛,其中有一环节需要用多人脸检测;由于其他队伍好多采用的商用SDK,竞争激烈,又不能误检更不能漏检测,而且保证框的数量只能和人脸数量对应,不能一个人脸上有多个框。 而我还是喜欢自己...

    上一段时间参加了某个比赛,其中有一环节需要用多人脸检测;由于其他队伍好多采用的商用SDK,竞争激烈,又不能误检更不能漏检测,而且保证框的数量只能和人脸数量对应,不能一个人脸上有多个框。
    而我还是喜欢自己写,所以想出了几个方案实现了一下,实现都比较简单而且准确率都得到了保证。
    比赛结束,最终因为性别检测出现了错误,与冠军失之交臂,我的方案好在是自己写的,顺便把源码也给大家

    因为是在嵌入式上应用的,所以代码是用 C++实现

    1.预读

    为了方便后面大家理解,我在这里把我的思路县说一下,顺便把一些参数必要的部分说一下。

    1.1思路

    基础是使用的是Haar级联分类器,但是直接使用Haar级联分类器,单纯的调参都不能达到很好的效果。
    所以是先用低阈值的人脸检测初步筛选出人脸框(因为是低阈值所以框总是比),然后在初筛的人脸框部分再进行人眼睛检测,只有同时存在人眼的部分才会做成人脸输出。

    1.2Haar级联分类器使用心得

    Haar级联分类器速度快,容易调用,是很好的工具。基础的使用教程,我放在这里
    opencv 官网object模块使用例子
    https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html

    其中创建检测器的参数在这里说明一下,
    cv::CascadeClassifier::detectMultiScale ( InputArray image,
    std::vector< Rect >
    double scaleFactor = 1.1,
    int minNeighbors = 3,
    int flags = 0,
    Size minSize = Size(),
    Size maxSize = Size()
    )
    第一个参数是图像矩阵,即输入一个Mat即可;
    第二个参数是输出口,输出一个 Rect型的容器,一个Rect存放的是四个整型值(x,y,w,h)xy为矩形框左上角的像素坐标,wh分别代表着矩形框的宽和高;
    第三个参数是每次搜索框缩小的比例,看一下官网例子前的算法解析就知道,级联分类器是从大框开始搜索,大框搜索完一遍,再用小一级的框集进行重新搜索。而这个两级之间的大小比例就是这个参数。
    第四个参数是重复确定框,比如默认是3,一块人脸只有被重复扫描到3次是人脸才会放在输出里面,可以想到,当数值增大的时候,判断的要求就会变高,误检率会变低,但漏检率会随之升高;当数值更小比如2时,会向相反变化。经过我的测试,单纯靠改变这个参数,无法达到自己的期望
    第五个参数如果是使用opencv3可以忽略,没有区别,默认0就可以。
    第六个参数和第七个参数是一个道理,也就是之前说的第三个参数里面大小框的关系。第三个参数是两个级别框的比例,而最后这两个参数是最大框和最小框的设定。如果在使用的过程中,确定不会出现大脸或者特别小的脸,可以通过设置这两个参数加快检测速度。

    1.3去掉重叠度高的人脸框

    考虑到嵌入式计算能力,我们为了达到实时的效果所以要把数值计算尽量变成逻辑运算。
    从最简单的情况推理,假设有两个框(x1,y1,w1,h1) ,(x2,y2,w2,h2)如果要保证完全不重叠,则有以下关系:(在纸上画一下就看得出来)
    x1+w1<x2
    y1+h1<y2

    但是当我们要求允许部分重叠时候,就可以添加一个参数:
    重叠度 thr ,thr取值为0~1;
    x1+(w1 x thr)<x2
    y1+(h1 x thr)<y2

    2.代码实现(封装成类,可以直接调用)

    头文件.h

    //
    // Created by peilin on 2019/10/2.
    //
    
    #ifndef OPERATOR_CASCADE_CLASSIFER_H
    #define OPERATOR_CASCADE_CLASSIFER_H
    
    #include <opencv2/core.hpp>
    #include <opencv2/imgproc.hpp>
    #include <opencv2/objdetect.hpp>
    #include <opencv2/highgui.hpp>
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    class cascade_classifer {
    public:
    
        cascade_classifer();
        ~cascade_classifer();
        vector<Rect> faces(Mat frame);
        vector<Rect> eyes(Mat frame);
    
    private:
        CascadeClassifier face_cascade; \\初始化一个人脸检测器
        CascadeClassifier eyes_cascade; \\初始化一个人眼检测器
        String FACE_MODEL_PATH; \\人脸模型文件地址
        String EYES_MODEL_PATH; \\人眼模型地址
        int FACE_MINS;  \\调整参数,即人脸检测器的第四个参数,这里单独拿出来是为了方便修改
        float FACE_OVERLAP_RATE;  \\人脸的重叠度,即1.3中的那个阈值thr
        bool isOverlap(Rect rct1, Rect rct2);  \\判断两个框是否重叠,bool型函数
    };
    
    #endif //OPERATOR_CASCADE_CLASSIFER_H
    

    ~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~

    类的主函数.cpp

    //
    // Created by peilin on 2019/10/2.
    //
    
    #include "cascade_classifer.h"
    
    cascade_classifer::cascade_classifer()
    {
        FACE_MODEL_PATH = "face_model_path"; \\存放脸模型的参数
        EYES_MODEL_PATH = "eyes_model_path"; \\存放人眼模型的地址
        FACE_OVERLAP_RATE = 0.8;
        FACE_MINS = 2;
        face_cascade.load(FACE_MODEL_PATH);
        eyes_cascade.load(EYES_MODEL_PATH);
    }
    cascade_classifer::~cascade_classifer()
    {
    }
    
    vector<Rect> cascade_classifer::faces(Mat frame) {
        //init and preproce
        cascade_classifer cascade;
        size_t num_faces, repeat, repeat_final;
        Mat frame_gray;
        vector<Rect> faces_init, eyes, faces, faces_final;
    
        if (frame.empty())
            cout << "No image in frame!" << endl;
        cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
    
        //detect
        face_cascade.detectMultiScale(frame_gray, faces_init, 1.1, FACE_MINS,0);
    	\\faces_init用来存放初筛的人脸框
        if(faces_init.size()==0)
            return faces_init; \\如果是初筛也没有框,则直接返回空
        else
        {
            faces.push_back(faces_init[0]);
            for(repeat=1;repeat<faces_init.size();repeat++)
            {
                for(repeat_final=0;repeat_final<faces.size();repeat_final++)
                {
                \\判断是否有重叠框,去掉重叠度高框
                    if(cascade.isOverlap(faces_init[repeat], faces[repeat_final])) 
                        break;
                }
                if(repeat_final==faces.size())
                    faces.push_back(faces_init[repeat]);
                else continue;
            }
        }
            
        for(num_faces=0;num_faces<faces.size();num_faces++)
        {
            eyes=cascade.eyes(frame_gray(faces[num_faces]));
            if(eyes.size())
            {
                faces_final.push_back(faces[num_faces]);
                rectangle(frame, cvPoint(faces[num_faces].x, faces[num_faces].y),
                          cvPoint(faces[num_faces].x + faces[num_faces].width,
                                  faces[num_faces].y + faces[num_faces].height),
                          Scalar(255, 0, 0),2);
            }
        }
        return faces_final;
    }
    
    vector<Rect> cascade_classifer::eyes(Mat frame)
    {
        vector<Rect> eyes_data;
        eyes_cascade.detectMultiScale(frame, eyes_data);
        return eyes_data;
    }
    
    bool cascade_classifer::isOverlap(Rect rc1,Rect rc2)
    {
        if ((rc1.x + rc1.width*FACE_OVERLAP_RATE)  > rc2.x &&
            (rc2.x + rc2.width*FACE_OVERLAP_RATE)  > rc1.x &&
            (rc1.y + rc1.height*FACE_OVERLAP_RATE) > rc2.y &&
            (rc2.y + rc2.height*FACE_OVERLAP_RATE) > rc1.y
            )
            return true;
        else
            return false;
    }
    

    这个方法非常适用于像素足够情况下的情况(也就是没有特别小尺寸的人脸)
    下次更新一个用模板匹配的方法检测,能够进一步检测到小的人脸

    展开全文
  • 提出一种基于改进的肤色分割和距离变换的快速人脸检测算法。该算法对传统肤色分割进行了改进,使得肤色分割更加可靠,而且能够对图像中的多个人脸进行快速定位。实验证明该方法是有效的。
  • 使用MATLAB的多人脸检测工具 它使用WebCam和Kanade-Lucas-Tomasi(KLT)算法实现实时跟踪多个对象 自动检测和跟踪网络摄像头获取的视频流中的多个面部。 安装网络摄像头支持包 它将来自任何USB视频类(UVC)网络...
  • //使用级联分类器进行识别,参数为灰度图片,面部数组,检测单元的增长率,是否融合检测出的矩形,最小检测单元大小 faceCascade.detectMultiScale(smallImg, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, ...

    一,说明及环境

           代码是完全参考opencv中自带的源代码,将其中很多不必要的代码已经删除。环境是opencv2413,vs2013,win10。

           目录结构如图所示:

                                                                                  

               其中的xml文件在opencv/sources/data中,图片在opencv/sources/samples/c/,复制到自己的项目目录下。


    二,代码及注释

    #include "stdafx.h"
    #include "opencv2/objdetect/objdetect.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include <cctype>
    #include <iostream>
    #include <iterator>
    #include <stdio.h>
    
    using namespace std;
    using namespace cv;
    
    //面部和眼睛检测并绘制矩形框,参数一次为图片数据,面部和眼部的级联分类器,检测时允许的图片缩小比例
    void detectAndDraw(Mat& img, CascadeClassifier& faceCascade, CascadeClassifier& eyeCascade, double scale);
    //脸部和眼部的训练数据,就是以xml文件的形式,存储了标准的用来比对的模特数据,文件放在了当前目录
    string faceCascadeName = "haarcascade_frontalface_alt.xml";//面部
    string eyeCascadeName = "haarcascade_eye.xml";//眼部
    
    int main(int argc, const char** argv)
    {
    	Mat image;//opencv中存储数据的基本单位,存储帧,图片等,代替旧版本的IplImage
    	string inputName("lena.jpg");//示例图片,放在当前目录
    	CascadeClassifier faceCascade, eyeCascade;//定义级联分类器,由它们实现检测功能
    	double scale = 1;//不缩小图片,这样可以提高准确率
    	if (!faceCascade.load(faceCascadeName) || !eyeCascade.load(eyeCascadeName))//载入xml训练数据
    	{
    		return -1;
    	}
    	image = imread(inputName, CV_LOAD_IMAGE_COLOR);//读取图片,第二个参数说明是彩色图片
    	cvNamedWindow("result", 1);//创建窗口,命名result,id为1
    	if (!image.empty())
    	{
    		detectAndDraw(image, faceCascade, eyeCascade, scale);//进行识别
    	}
    	waitKey(0);//等待建入
    	cvDestroyWindow("result");//销毁窗口
    	return 0;
    }
    
    void detectAndDraw(Mat& img, CascadeClassifier& faceCascade,CascadeClassifier& eyeCascade,double scale)
    {
    	int i = 0;
    	double t = 0;
    	vector<Rect> faces,eyes;//用来存储检测出来的面部和眼部数据,我们无法确定个数,因此定义成vector
    	Mat gray, smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);//smallImg已缩放
    
    	cvtColor(img, gray, CV_BGR2GRAY);//图片颜色格式转化,CV_BGR2GRAY是从BGR到gray,彩色到灰色
    	resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);//将灰色图像适应大小到smallImg中
    	equalizeHist(smallImg, smallImg);//加强对比度,提高检测准确率
    
    	t = (double)cvGetTickCount();//获取当前时间
    	//使用级联分类器进行识别,参数为灰度图片,面部数组,检测单元的增长率,是否融合检测出的矩形,最小检测单元大小
    	faceCascade.detectMultiScale(smallImg, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
    	for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++)
    	{
    		cv::rectangle(img, *r, Scalar(0,255,0), 1, 1, 0);//在img上绘制出检测到的面部矩形框,绿色框
    		Mat faceROI = smallImg(*r);//设置图片感兴趣区域,也就是改变了图片原点和长宽,实际像素数据没有丢失
    		eyeCascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
    		for (vector<Rect>::const_iterator e = eyes.begin(); e != eyes.end(); e++)
    		{
    			Rect eyeR;
    			eyeR.x = r->x + e->x;//从感兴趣区域映射到整个图片区域
    			eyeR.y = r->y + e->y;
    			eyeR.height = e->height;
    			eyeR.width = e->width;
    			cv::rectangle(img, eyeR, Scalar(0, 255, 255), 1, 1, 0);//绘制检测到的眼睛矩形框,黄色框
    		}
    	}
    	t = (double)cvGetTickCount() - t;//获取当前时间
    	printf("detection time = %g ms\n", t / ((double)cvGetTickFrequency()*1000.));//转化成毫秒打印
    	cv::imshow("result", img);//将img显示到result窗口
    }
    
    

    三,程序运行结果

    detectMultiScale()的第四个参数设为2时:

             

    detectMultiScale()的第四个参数设为0,且只检测面部时:

            

           由程序运行结果可以看出,opencv特征检测,是对图片进行大小不等的单元分别检测,并将所有可能的结果获取,有参数决定是否融合。另外左上角出现了一个错误的识别区,但是在detectMultiScale()的第四个参数设为2,进行融合时,opencv已经去掉。



    展开全文
  • 网上关于人脸检测、识别的代码很多,我采用了其中之一的方法,并综合应用,适合初学者入门学习,欢迎交流。 应用环境:window 7 、python3.5 shape_predictor_68_face_landmarks.dat 需在网上下载 dlib_face_...
  • 最近用到人脸识别技术,有个需求是多人脸图片的时候需要一个一个把人脸裁剪出来,以便获取人脸的图片,从而用其获取单人脸的特征
  • 基于深度学习的自然场景下多人脸实时检测
  • 基于FPGA的多人脸实时检测系统设计与实现.pdf
  • 针对复杂环境下,基于肤色信息的CamShift(continuously adaptive Mean-Shift)算法跟踪运动人脸的实时性欠佳,且同一时刻只能跟踪一个人脸的问题,提出了一种适于复杂环境下多人脸目标的自动检测与实时跟踪的方法。...
  • 针对复杂环境下,基于肤色信息的CamShift(continuously adaptive Mean-Shift)算法跟踪运动人脸的实时性欠佳,且同一时刻只能跟踪一个人脸的问题,提出了一种适于复杂环境下多人脸目标的自动检测与实时跟踪的方法。...
  • 安卓opencv实现人脸检测,人脸识别,人脸对比,实现opencv对图像的翻转,镜像等操作。实现多人检测
  •  下面的代码是博主参考了Intel realsense官方SDK和官方例程后写的一段较为简单的代码,实现了简单的多人脸实时检测及跟踪功能。官方的人脸检测例程功能较多,但代码量很大,阅读起来也较困难,所以博主写了一段较为...
  • 1.单帧多人脸multiscaleface检测人脸的流程: 申请生成新的相应大小的内存的mat数据 Rect rect(x,y,width,height); Mat image=zero(0,0,width,height); img(rect).copyTo(image); 2. ...
  • 基于多任务卷积网络(MTCNN)和Center-Loss的多人实时人脸检测和人脸识别系统。编程语言采用python。
  • FairMOT训练多人脸跟踪
  • python+opencv 实现图像人脸检测及视频中的人脸检测

    千次阅读 多人点赞 2020-09-01 17:13:38
    python+opencv 实现图像人脸检测及视频中的人脸检测,首先下载人脸检测要用到的分类器,熟悉opencv相关API的使用,然后利用python+opencv实现图像单人脸检测、图像多人脸检测、视频中人脸检测和摄像头人脸检测。
  • C# EmguCV多人人脸是

    2018-03-19 13:13:38
    C# EmguCV 能够实时人脸检测和识别。此应用使用了EigenFace,PCB算法提高识别准确率。
  • 基于二哈实现多人人脸学习和识别 基于TinywebDB实现云数据库应用 三、实验软硬件环境 硬件:掌控板 软件:Mind+ 四、实验过程(实验步骤、记录、数据、分析) 1.基于二哈实现多人人脸学习和识别 先用Husklens识别...
  • 基于深度残差和特征金字塔网络的实时多人脸关键点定位算法基

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,732
精华内容 1,092
关键字:

多人脸检测