&1 问题来源

  在运行官网的facedetect这个demo的时候,总是不会出来result的图形,电脑右下角提示的错误是“显示器驱动程序已停止响应,而且已恢复 windows 8(R)”。

&2 前期处理

  • 修改代码,各种代码上的调试都尝试过,demo运行失败了;
  • 百度上的禁用视觉效果方案,即修改电脑的主题为“windows 经典”主题,demo运行失败了;
  • 百度上的重新安装显卡驱动方案,即重新装集成网卡驱动,导致显示器黑屏,倒腾了一天才整回来,失败;

&3 成功解决

  首先,打开注册表,找到HKEY_LOCAL_MACHINE,在SYSTEM中的CurrentControlSet中的Control的GrphicsDrivers上面点击右键,新建QEORD(64位)值(Q),数值名称为:TdrDelay,数值数据为:8,基数不用改变,选择十六进制即可。

  

  然后,在你的项目编译文件夹内加入四个文件,haarcascade_eye_tree_eyeglasses.xml和haarcascade_frontalface_alt.xml、opencv_ffmpeg310_64.dll及opencv_world310d.dll;

  

  在opencv的环境配置中,(前面有博文介绍),去掉可执行文件目录,去掉附加依赖项的opencv_world310.lib,至此,所有的环境配置方面已经完成。

&4 demo的代码和运行结果

注意:在opencv安装文件夹sources\samples\cpp中的文件facedetect.cpp即是源代码。

 #include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream> using namespace std;
using namespace cv; static void help() {
  cout << "\nThis program demonstrates the cascade recognizer. Now you can use Haar or LBP features.\n"
  "This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.\n"
  "It's most known use is for faces.\n"
  "Usage:\n"
  "./facedetect [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]\n"
  " [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n"
  " [--scale=<image scale greater or equal to 1, try 1.3 for example>]\n"
  " [--try-flip]\n"
  " [filename|camera_index]\n\n"
  "see facedetect.cmd for one call:\n"
  "./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml\" --scale=1.3\n\n"
  "During execution:\n\tHit any key to quit.\n"
  "\tUsing OpenCV version " << CV_VERSION << "\n" << endl;
} void detectAndDraw(Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip); string cascadeName;
string nestedCascadeName; int main(int argc, const char** argv)
{
  VideoCapture capture;
  Mat frame, image;
  string inputName;
  bool tryflip;
  CascadeClassifier cascade, nestedCascade;
  double scale;   cv::CommandLineParser parser(argc, argv,
    "{help h||}"
    "{cascade|haarcascade_frontalface_alt.xml|}"
    "{nested-cascade|haarcascade_eye_tree_eyeglasses.xml|}"
    "{scale|1|}{try-flip||}{@filename|lena.jpg|}"
  );   if (parser.has("help"))
  {
    help();
    return ;
  }
  cascadeName = parser.get<string>("cascade");
  nestedCascadeName = parser.get<string>("nested-cascade");
  scale = parser.get<double>("scale");
  if (scale < )
    scale = ;
  tryflip = parser.has("try-flip");
  inputName = parser.get<string>("@filename");
  if (!parser.check())
  {
    parser.printErrors();
    return ;
  }
  if (!nestedCascade.load(nestedCascadeName))
    cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;
  if (!cascade.load(cascadeName))
  {
    cerr << "ERROR: Could not load classifier cascade" << endl;
    help();
    return -;
  }
  if (inputName.empty() || (isdigit(inputName[]) && inputName.size() == ))
  {
    int c = inputName.empty() ? : inputName[] - '';
    if (!capture.open(c))
    cout << "Capture from camera #" << c << " didn't work" << endl;
  }
  else if (inputName.size())
  {
    image = imread(inputName, );
    if (image.empty())
    {
      if (!capture.open(inputName))
      cout << "Could not read " << inputName << endl;
    }
  }
  else
  {
    image = imread("../data/lena.jpg", );
    if (image.empty()) cout << "Couldn't read ../data/lena.jpg" << endl;
  }   if (capture.isOpened())
  {
    cout << "Video capturing has been started ..." << endl;     for (;;)
    {
      capture >> frame;
      if (frame.empty())
      break;       Mat frame1 = frame.clone();
      detectAndDraw(frame1, cascade, nestedCascade, scale, tryflip);       int c = waitKey();
      if (c == || c == 'q' || c == 'Q')
      break;
    }
  }
  else
  {
    cout << "Detecting face(s) in " << inputName << endl;
    if (!image.empty())
    {
      detectAndDraw(image, cascade, nestedCascade, scale, tryflip);
      waitKey();
    }
  else if (!inputName.empty())
  {
    /* assume it is a text file containing the
    list of the image filenames to be processed - one per line */
    FILE* f = fopen(inputName.c_str(), "rt");
    if (f)
    {
      char buf[ + ];
      while (fgets(buf, , f))
      {
        int len = (int)strlen(buf), c;
        while (len > && isspace(buf[len - ]))
        len--;
        buf[len] = '\0';
        cout << "file " << buf << endl;
        image = imread(buf, );
        if (!image.empty())
        {
          detectAndDraw(image, cascade, nestedCascade, scale, tryflip);
          c = waitKey();
          if (c == || c == 'q' || c == 'Q')
            break;
        }
        else
        {
          cerr << "Aw snap, couldn't read image " << buf << endl;
        }
      }
    fclose(f);
    }
  }
} return ;
} void detectAndDraw(Mat& img, CascadeClassifier& cascade,
CascadeClassifier& nestedCascade,
double scale, bool tryflip)
{
double t = ;
vector<Rect> faces, faces2;
const static Scalar colors[] =
{
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , )
};
Mat gray, smallImg; cvtColor(img, gray, COLOR_BGR2GRAY);
double fx = / scale;
resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR);
equalizeHist(smallImg, smallImg); t = (double)cvGetTickCount();
cascade.detectMultiScale(smallImg, faces,
1.1, ,
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
| CASCADE_SCALE_IMAGE,
Size(, ));
if (tryflip)
{
flip(smallImg, smallImg, );
cascade.detectMultiScale(smallImg, faces2,
1.1, ,
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
| CASCADE_SCALE_IMAGE,
Size(, ));
for (vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++)
{
faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height));
}
}
t = (double)cvGetTickCount() - t;
printf("detection time = %g ms\n", t / ((double)cvGetTickFrequency()*.));
for (size_t i = ; i < faces.size(); i++)
{
Rect r = faces[i];
Mat smallImgROI;
vector<Rect> nestedObjects;
Point center;
Scalar color = colors[i % ];
int radius; double aspect_ratio = (double)r.width / r.height;
if (0.75 < aspect_ratio && aspect_ratio < 1.3)
{
center.x = cvRound((r.x + r.width*0.5)*scale);
center.y = cvRound((r.y + r.height*0.5)*scale);
radius = cvRound((r.width + r.height)*0.25*scale);
circle(img, center, radius, color, , , );
}
else
rectangle(img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)),
cvPoint(cvRound((r.x + r.width - )*scale), cvRound((r.y + r.height - )*scale)),
color, , , );
if (nestedCascade.empty())
continue;
smallImgROI = smallImg(r);
nestedCascade.detectMultiScale(smallImgROI, nestedObjects,
1.1, ,
//|CASCADE_FIND_BIGGEST_OBJECT
//|CASCADE_DO_ROUGH_SEARCH
//|CASCADE_DO_CANNY_PRUNING
| CASCADE_SCALE_IMAGE,
Size(, ));
for (size_t j = ; j < nestedObjects.size(); j++)
{
Rect nr = nestedObjects[j];
center.x = cvRound((r.x + nr.x + nr.width*0.5)*scale);
center.y = cvRound((r.y + nr.y + nr.height*0.5)*scale);
radius = cvRound((nr.width + nr.height)*0.25*scale);
circle(img, center, radius, color, , , );
}
}
imshow("result", img);
}

facedetect源码

结果:

OpenCV人脸检测demo--facedetect的更多相关文章

  1. 【AdaBoost算法】基于OpenCV实现人脸检测Demo

    一.关于检测算法 分类器训练: 通过正样本与负样本训练可得到分类器,opencv有编译好的训练Demo,按要求训练即可生成,这里我们直接使用其已经训练好的分类器检测: 检测过程: 检测过程很简单,可以 ...

  2. keras系列︱人脸表情分类与识别:opencv人脸检测+Keras情绪分类(四)

    引自:http://blog.csdn.net/sinat_26917383/article/details/72885715 人脸识别热门,表情识别更加.但是表情识别很难,因为人脸的微表情很多,本节 ...

  3. opencv人脸检测分类器训练小结

    这两天在初学目标检测的算法及步骤,其中人脸检测作为最经典的算法,于是进行了重点研究.该算法最重要的是建立人脸检测分类器,因此我用了一天的时间来学习分类器的训练.这方面的资料很多,但是能按照一个资料运行 ...

  4. Android+openCV人脸检测2(静态图片)

    前几篇文章中有提到对openCV环境配置,这里再重新梳理导入和使用openCV进行简单的人脸检测(包括使用级联分类器) 一 首先导入openCVLibrary320 二 设置gradle的sdk版本号 ...

  5. opencv人脸检测,旋转处理

    年会签到,拍自己的大头照,有的人可能会拍成横向的,需要旋转,用人脸检测并修正它(图片). 1. 无脑检测步骤为: 1. opencv 读取图片,灰度转换 2. 使用CascadeClassifier( ...

  6. OpenCV人脸检测并把图片写成avi视频

    读出某一个文件夹下“jpg”后缀的全部图片后,用的OpenCV自带的人脸检测检测图片中的人脸,调整图片的大小写成一个avi视频. 主要是要记录一下CvVideoWriter的用法和如何从文件夹中读取某 ...

  7. 人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)

    1.Easily Create High Quality Object Detectors with Deep Learning 2016/10/11 http://blog.dlib.net/201 ...

  8. OpenCV——人脸检测

    OpenCV支持的目标检测的方法: 利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification) 1.加载级联分类器 CascadeClass ...

  9. OpenCV: OpenCV人脸检测框可信度排序

    参考文章:http://blog.csdn.net/hua_007/article/details/45368607 使用OpenCV进行人脸识别时,使用 casecade.detectMultiSc ...

随机推荐

  1. C语言-08-预处理器

    C预处理器,C Preprocessor简称CPP.C预处理器不是编译器的一部分,它是一个单独的文本替换工具,指示编译器在实际编译之前需要完成的工作. 常用的预处理器指令 #include 包含头文件 ...

  2. <极客学院>视频教程学习笔记-iOS中CALayer的使用

    <1>CALayer简介 1.CALayer一般作为UIView的容器而使用. 2.CALayer是一个管理者图片载体(image-based content)的层结构 3.直接修改单独创 ...

  3. (甲)PAT-1001

    1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B   Calculate a + b and output the sum ...

  4. 应用Spring MVC发布restful服务是怎样的一种体验

            摘要:“约定优于配置”这是一个相当棒的经验,SOAP服务性能差.基于配置.紧耦合,restful服务性能好.基于约定.松耦合,现在我就把使用Spring MVC发布restful服务的 ...

  5. 虚拟机Linux----Ubuntu1204----设置固定Ip

    1.介绍 环境:ubuntu版本是12.04,虚拟机是Oracle Vm VirtualBox 2.说明 需求:现在已经安装了一个ubuntu系统,网络配置是默认选择桥接,可以上网,物理机可以连接虚拟 ...

  6. TCP/IP详解--TCP首部选项中时间戳选项

    一.简介 TCP时间戳选项会在TCP包头增加12个字节,以一种比重发超时更精确的方法来启用对RTT 的计算.   二.作用 ) TCP时间戳位于TCP选项中,kind=:lenth=:data由tim ...

  7. QQ一键登录功能的实现过程

    QQ登录的思路: 当qq登陆成功后,QQ会给我们返回一个唯一的用户标识:openId,当用户授权QQ时,判断 if(已经有openId){ 跳转到登陆后的页面. }else if(没有openId){ ...

  8. 【读书笔记《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)

    3.1 Button Button这控件不用多说,就是一个按钮,主要是点击后进行相应事件的响应. 给组件添加ID属性:定义格式为 android:id="@+id/name",这里 ...

  9. ZBrush中的Clip剪切笔刷怎么快速运用

    Clip剪切笔刷可以对模型网格进行剪切操作,也可以叫做剪切笔刷.接下来看一下Clip切割笔刷在ZBrush中是如何使用的. 查看更多内容请直接前往:http://www.zbrushcn.com/ji ...

  10. HDU 1892 See you~

    最裸的二维树状数组,但是因为内存太大(c[1010][1010]),好像不能运行,结果蒙着写,写了好久.. 代码: #include <iostream> #include <cst ...