千家信息网

C++怎么利用opencv实现人脸检测功能

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"C++怎么利用opencv实现人脸检测功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++怎么利用opencv实现人脸检测功能"吧!
千家信息网最后更新 2026年11月01日C++怎么利用opencv实现人脸检测功能

本篇内容主要讲解"C++怎么利用opencv实现人脸检测功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++怎么利用opencv实现人脸检测功能"吧!

Linux系统下安装opencv我就再啰嗦一次,防止有些人没有安装没调试出来喷小编的程序是个坑,
sudo apt-get install libcv-dev
sudo apt-get install libopencv-dev
看看你的usr/share/opencv/haarcascades目录下有没有出现几个训练集.XML文件,接下来我拿人脸和眼睛检测作为实例玩一下,程序如下:

好多人不会编译opencv,我再多写几句解决一下好多菜鸟的困难吧

copy完代码之后,保存为xiaorun.cpp哦,记得编译试用个g++ -o xiaorun ./xiaorun.cpp -lopencv_highgui -lopenc_imgproc -lopencv_core -lopencv_objdetect

即可实现

#include #include #include #include #include using namespace cv;using namespace std;void detectAndDraw( Mat& img, CascadeClassifier& cascade,          CascadeClassifier& nestedCascade,          double scale, bool tryflip );int main(){  CascadeClassifier cascade, nestedCascade;  bool stop = false;  cascade.load("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml");  nestedCascade.load("/usr/share/opencv/haarcascades/haarcascade_eye.xml");  // frame = imread("renlian.jpg");  VideoCapture cap(0);  //打开默认摄像头  if(!cap.isOpened())  {    return -1;  }  Mat frame;  Mat edges;while(!stop){cap>>frame; detectAndDraw( frame, cascade, nestedCascade,2,0 ); if(waitKey(30) >=0) stop = true; imshow("cam",frame);}  //CascadeClassifier cascade, nestedCascade;  // bool stop = false;  //训练好的文件名称,放置在可执行文件同目录下  // cascade.load("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml");//  nestedCascade.load("/usr/share/opencv/haarcascades/aarcascade_eye.xml");//  frame = imread("renlian.jpg");//  detectAndDraw( frame, cascade, nestedCascade,2,0 );  // waitKey();  //while(!stop)  //{  //  cap>>frame;  //  detectAndDraw( frame, cascade, nestedCascade,2,0 );    if(waitKey(30) >=0)   stop = true;  //}  return 0;}void detectAndDraw( Mat& img, CascadeClassifier& cascade,          CascadeClassifier& nestedCascade,          double scale, bool tryflip ){  int i = 0;  double t = 0;  //建立用于存放人脸的向量容器  vector faces, faces2;  //定义一些颜色,用来标示不同的人脸  const static Scalar colors[] = {    CV_RGB(0,0,255),    CV_RGB(0,128,255),    CV_RGB(0,255,255),    CV_RGB(0,255,0),    CV_RGB(255,128,0),    CV_RGB(255,255,0),    CV_RGB(255,0,0),    CV_RGB(255,0,255)} ;  //建立缩小的图片,加快检测速度  //nt cvRound (double value) 对一个double型的数进行四舍五入,并返回一个整型数!  Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );  //转成灰度图像,Harr特征基于灰度图  cvtColor( img, gray, CV_BGR2GRAY );  // imshow("灰度",gray);  //改变图像大小,使用双线性差值  resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); // imshow("缩小尺寸",smallImg);  //变换后的图像进行直方图均值化处理  equalizeHist( smallImg, smallImg );  //imshow("直方图均值处理",smallImg);  //程序开始和结束插入此函数获取时间,经过计算求得算法执行时间  t = (double)cvGetTickCount();  //检测人脸  //detectMultiScale函数中smallImg表示的是要检测的输入图像为smallImg,faces表示检测到的人脸目标序列,1.1表示  //每次图像尺寸减小的比例为1.1,2表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大  //小都可以检测到人脸),CV_HAAR_SCALE_IMAGE表示不是缩放分类器来检测,而是缩放图像,Size(30, 30)为目标的  //最小最大尺寸  cascade.detectMultiScale( smallImg, faces,    1.1, 2, 0    //|CV_HAAR_FIND_BIGGEST_OBJECT    //|CV_HAAR_DO_ROUGH_SEARCH    |CV_HAAR_SCALE_IMAGE    ,Size(30, 30));  //如果使能,翻转图像继续检测  if( tryflip )  {    flip(smallImg, smallImg, 1);  //  imshow("反转图像",smallImg);    cascade.detectMultiScale( smallImg, faces2,      1.1, 2, 0      //|CV_HAAR_FIND_BIGGEST_OBJECT      //|CV_HAAR_DO_ROUGH_SEARCH      |CV_HAAR_SCALE_IMAGE      ,Size(30, 30) );    for( vector::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;  //  qDebug( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );  for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )  {    Mat smallImgROI;    vector nestedObjects;    Point center;    Scalar color = colors[i%8];    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, 3, 8, 0 );    }    else      rectangle( img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)),      cvPoint(cvRound((r->x + r->width-1)*scale), cvRound((r->y + r->height-1)*scale)),      color, 3, 8, 0);    if( nestedCascade.empty() )      continue;    smallImgROI = smallImg(*r);    //同样方法检测人眼    nestedCascade.detectMultiScale( smallImgROI, nestedObjects,      1.1, 2, 0      //|CV_HAAR_FIND_BIGGEST_OBJECT      //|CV_HAAR_DO_ROUGH_SEARCH      //|CV_HAAR_DO_CANNY_PRUNING      |CV_HAAR_SCALE_IMAGE      ,Size(30, 30) );    for( vector::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ )    {      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, 3, 8, 0 );    }  }  // imshow( "识别结果", img );}

到此,相信大家对"C++怎么利用opencv实现人脸检测功能"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

检测 人脸 图像 目标 功能 C++ 尺寸 文件 灰度 程序 不同 内容 函数 均值 方法 时间 目录 直方图 处理 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会毛军 西安互联网科技 奇酷互联网科技公司 广州宏创互联网科技 深圳天众互联网科技公司 互联网科技公司名称 多迪互联网科技有限公司 盛创互联网科技有限公司 互联网科技生活的内容 成都仁贤领冠互联网科技有限公司 农村开互联网科技讲堂 创业天下互联网科技有限公司 科技互联网大厂 昊天互联网科技有限公司 杭州壁岐互联网科技有限公司 坤平互联网科技 翼展科技 首家互联网医院 无锡工业互联网科技有限公司 浙南科技城互联网大厦招聘 35岁以上互联网科技行业 中国互联网科技工作委员会毛军 互联网科技有限公司经营范围 厦门中拓互联网络科技有限公司 互联网与科技金融数据 科技与互联网发展 互联网金融科技平台 宝灵互联网科技有限公司 互联网科技公司营业执照怎么办理 版纳互联网科技选哪家 现代科技的标志之一的互联网
0