OpenCV学习代码记录——人脸检测

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录。

代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/imgproc.hpp>

#include <cstdio>
// g++ face.cpp -o face -std=c++11 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_objdetect

// 文件在opencv的安装目录下有
static const char* cascade_name = "D:\\OpenCV\\share\\OpenCV\\haarcascades\\"
                           "haarcascade_frontalface_alt2.xml";

// http://wiki.opencv.org.cn/index.php/%E4%BA%BA%E8%84%B8%E6%A3%80%E6%B5%8B

void frameFaceDetection(cv::Mat& src, cv::CascadeClassifier& cascade,
    const char* showWindowName);

int FaceDetection(int c,char**v)
{
    //cv::Mat   src,gray;   // 源图像,灰度图像

    cv::VideoCapture    capture;    // 视频捕获对象
    cv::Mat             frame;      // 视频帧
    cv::CascadeClassifier   cascade;    //级联分类器

    /**
    // 加载源图像
    const char* picpath = "../Image/sisy.jpg";
    if (c > 1) { picpath = v[1]; }
    src = cv::imread(picpath);

    if (src.empty()) {
        puts("图片加载失败!!!");
        return -1;
    }
    */

    // 打开视频文件
    if (!capture.open("../Image/video.mov")) {
        puts("打开视频文件失败!!!");
        return -1;
    }

    // 加载人脸识别级联分类器文件
    if (!cascade.load(cascade_name)){
        puts("人脸识别级联分类器文件加载失败!!!");
        return 0;
    }

    // 创建显示窗口
    cv::namedWindow("src");

    cv::Mat src_scale;
    src_scale.create(cv::Size(480, 320), CV_8SC3);
    // 循环取帧并显示
    while (capture.read(frame)) {
        // 进行缩放
        cv::resize(frame, src_scale, src_scale.size());
        // 检测并显示
        frameFaceDetection(src_scale, cascade, "src");
        // 等待按键事件
        // 此处等待也为显示图像函数提供足够的时间完成显示
        // 等待事件可以按照CPU速度进行调节
        if (cv::waitKey(1) >= 0) {
            break;  // 按键就退出
        }
    }
    //cv::waitKey();
    cv::destroyAllWindows();
    return 0;
}

void frameFaceDetection(cv::Mat& src,
    cv::CascadeClassifier& cascade,
    const char* showWindowName)
{
    std::vector<cv::Rect>   faces;
    cv::Mat gray;

    // 获取源图像的灰度图像
    gray.create(src.size(), CV_8UC1);
    cv::cvtColor(src, gray, CV_BGR2GRAY);
    // 使灰度图象直方图均衡化
    cv::equalizeHist(gray, gray);

    // 获取初步检测结果
    cascade.detectMultiScale(
        gray/*源图像*/,
        faces/*检测出的物体边缘(得到被检测物体的矩形框向量组)*/,
        1.1/*每一个图像尺度中的尺度参数,默认值为1.1*/,
        2/*每一个级联矩形应该保留的邻近个数*/,
        CV_HAAR_SCALE_IMAGE,
        cv::Size(30, 30)/*最小可能的对象的大小,小于的对象将被忽略*/);

    // 将检测得到的结果,绘制到原图像上
    for (auto face : faces) {
        // 绘制红色矩形
        cv::rectangle(src, face, cv::Scalar(0, 0, 255), 3);
    }
    // 显示图像
    cv::imshow(showWindowName, src);
}

原文地址:https://www.cnblogs.com/oloroso/p/8722016.html

时间: 2024-10-18 12:07:49

OpenCV学习代码记录——人脸检测的相关文章

OpenCV学习代码记录——轮廓(contour)检测

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> // cv

OpenCV学习代码记录——Hough线段检测

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> // http://blog.csdn.net/zh

OpenCV学习代码记录—— Snake轮廓

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/legac

OpenCV学习代码记录——canny边缘检测

很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录. 代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest. #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> // c

【从零学习openCV】IOS7根据人脸检测

前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app.总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习openCV,自然不能放过这个领域.于是略微了解了下openCV下人脸检測的一些原理.为之后的人脸识别等研究做个小小的铺垫. 原理: 人脸检測属于目标检測(object detection) 的一部分,主要涉及两个方面 先对要检測的目标对象进行概率统计,从而知道待检測对象的一些特征,建立起目标检測模型.

OpenCV实践之路——人脸检测(C++/Python) 【转】

转自:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 版权声明:本文为博主原创文章,转载请联系作者取得授权. 本文由@星沉阁冰不语出品,转载请注明作者和出处. 文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/51105159 微博:http://weibo.com/xingchenbing  之前一直觉得人脸检测是非常麻烦的,即使是用OpenCV,麻

OpenCV实践之路——人脸检测(C++/Python)

之前一直觉得人脸检测是非常麻烦的,即使是用opencv,麻烦到我都不敢去碰.这两天仔细看了下,如果只是调用opencv自带的分类器和函数的话,简直是简单.这不,正好最近也在学习Python,索性就用C++和Python两种语言都实现一下.当然,我现在这个是最简单的版本. 步骤: 调用opencv训练好的分类器和自带的检测函数检测人脸人眼等的步骤简单直接: 1.加载分类器,当然分类器事先要放在工程目录中去.分类器本来的位置是在*\opencv\sources\data\haarcascades(h

基于OpenCV读取摄像头进行人脸检测和人脸识别

前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的了,识别的代码是从OpenCV官网上找到的:http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_api.html 需要注意的是,opencv的FaceRecogizer目前有三个类实现了它,特征脸和fisherface方法

opencv学习笔记霍夫变换——直线检测

参考大佬博文:blog.csdn.net/jia20003/article/details/7724530 lps-683.iteye.com/blog/2254368 openCV里有两个函数(比较常用)处理霍夫变换直线检测,有什么区别呢. CvHoughLine:是用于标准的霍夫变换方法 CvHoughLine2:可以使用三种霍夫变换的方法,分别是标准霍夫变换(SHT).多尺度标准霍夫变换(MSHT).累计概率霍夫变换(PPHT). 函数原型: CvSeq* cvHoughLines2( C