C++怎么利用opencv实现人脸检测功能
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,本篇内容主要讲解"C++怎么利用opencv实现人脸检测功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"C++怎么利用opencv实现人脸检测功能"吧!
千家信息网最后更新 2025年01月22日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安全错误
数据库的锁怎样保障安全
互联网大会科技领先成果
网络安全核心期刊排名
服务器验证功能安全链接
查询无法进行请检查数据库服务器
顺义区智能网络技术口碑推荐
怎样判断数据库是否删除
数据库以读换写的分级缓存
黑龙江网络服务器机柜服务器
英语教育与网络技术
搭建后端json服务器
嘉定区信息网络技术报价
陕西网络技术服务报价
华为服务器下载测试
金普网络安全宣传
北京公交app服务器无法请求
郴州软件开发培训哪里好
软件开发背景说明
网络安全L2题库
软件开发行业利税比例
法院网络安全检查汇报材料
安徽电视墙服务器虚拟主机
阿里云购买服务器
软件开发专利免税
网站数据库可以复制吗
网络安全政策环境
服务器系统盘防护
网络安全专业大学研究生排名
大连太阳线软件开发哪家好
品牌电商服务器
主从同步 指定数据库