当前位置: 首页 > news >正文

深圳华强北商城网站建设网站建设视频教程集

深圳华强北商城网站建设,网站建设视频教程集,动漫做羞羞的网站,com域名1. 环境与说明 本文介绍了如何在Visual Studio上#xff0c;使用OpenCV来实现人脸识别的功能 环境说明 : 操作系统 : windows 10 64位Visual Studio版本 : Visual Studio Community 2022 (社区版)OpenCV版本 : OpenCV-4.8.0 (2023年7月最新版) 实现效果如图所示#xff0…1. 环境与说明 本文介绍了如何在Visual Studio上使用OpenCV来实现人脸识别的功能 环境说明 : 操作系统 : windows 10 64位Visual Studio版本 : Visual Studio Community 2022 (社区版)OpenCV版本 : OpenCV-4.8.0 (2023年7月最新版) 实现效果如图所示识别到的人脸会用红框框出来 : 2. 配置Visual Studio环境 这部分详见我的另一篇博客 : Visual Studio 2022 cmake配置opencv开发环境 最终配置好后能够在Visual Studio中正常调用OpenCV运行CMake项目(C程序) 3. 实现摄像头预览 这部分要用到VideoCapture这个类VideoCapture既支持从视频文件读取也支持直接从摄像机等监控器中读取还可以读取 IP 视频流要想获取视频需要先创建一个 VideoCapture 对象来打开相机然后就可以来操作视频帧了。 我们将项目代码修改为如下内容 #include OpenCVTest.h #include opencv2/opencv.hppusing namespace std; using namespace cv;int main() {VideoCapture capture;//打开相机这个传入的相机ID为0capture.open(0);if (!capture.isOpened()){cout opencv打开摄像头失败!\n endl;return -1;}//Mat矩阵用来存一张图片Mat frame;while (true){//从capture中取数据将画面输出到frame矩阵里面capture frame; if (frame.empty()){cout 读取摄像头数据失败\n endl;}imshow(摄像头, frame); //显示图像if (waitKey(30) 27) //按下ESC键退出程序{break;}}return 0; }运行程序效果如下所示 4. 转化为灰度图像 接下来我们需要将图片转化为灰度图为什么要进行灰度化处理呢 ? 主要有以下几个作用提高人脸识别的准确性和可靠性 简化图像处理灰度化可以将彩色图像转化为黑白图像使得处理更加简单。彩色图像包含三个通道红、绿、蓝而灰度图像只有一个通道使得处理更加快速和高效。消除颜色信息人脸识别对于颜色信息并不是非常敏感而更关注形状和轮廓等特征。因此通过灰度化处理可以消除颜色信息对于后续处理的影响。提高处理性能灰度化处理可以减少计算量提高处理性能。在人脸识别过程中对每个像素进行颜色计算会消耗大量计算资源而灰度化处理只需要对每个像素的亮度进行计算减少了计算量。突出图像特征灰度化处理可以突出图像中的边缘和纹理等特征。这些特征对于人脸识别非常关键可以帮助算法更好地识别人脸。 进行灰度化处理我们需要调用void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0 );这里src是我们输入的图像dst是我们要输出的图像code需要传COLOR_BGR2GRAY表示将BGR转化为灰度图。 要注意在OpenCV中是BGR排列方式而不是RGB排列。 具体完整代码如下 #include OpenCVTest.h #include opencv2/opencv.hppusing namespace std; using namespace cv;int main() {VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout opencv打开摄像头失败!\n endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像while (true){//从capture中取数据将画面输出到frame矩阵里面capture frame; if (frame.empty()){cout 读取摄像头数据失败!\n endl;return -1;}imshow(摄像头, frame); //显示彩色图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRGimshow(灰度化, grayFrame); //显示灰色图像if (waitKey(30) 27) //ESC键{break;}}return 0; }运行程序效果如下所示左边的是彩色画面右边的是黑白画面 5. 直方图均衡化处理 接着要进行直方图均衡化处理为什么要进行这一步操作呢 ? 主要有以下几个作用提高人脸识别的准确性和可靠性 提高对比度直方图均衡化通过重新分布图像像素的灰度级将原始图像中的灰度级分布变得更加均匀。这样做可以增强图像的对比度使得人脸的特征更加清晰可见。消除光照变化人脸识别中的一个挑战是光照变化对人脸图像的影响。直方图均衡化可以消除光照变化使得人脸图像在不同光照条件下具有一致的亮度和对比度。提高图像质量直方图均衡化可以改善图像的质量去除图像中的噪声和伪影。这对于后续的人脸特征提取和匹配非常重要可以提高人脸识别的准确性和鲁棒性。增强细节信息直方图均衡化可以增强图像的细节信息使得人脸图像中的纹理和特征更加明显。这对于人脸识别算法的性能至关重要可以提高人脸识别的准确率和鲁棒性。 直方图均衡化处理需要调用void equalizeHist( InputArray src, OutputArray dst);src是输入的图像需要是单通道的灰度图dst是我们输出的图像。 具体完整代码如下 #include OpenCVTest.h #include opencv2/opencv.hppusing namespace std; using namespace cv;int main() {VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout opencv打开摄像头失败!\n endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像Mat equalizeFrame; //直方图while (true){capture frame; //从capture中取数据将画面输出到frame矩阵里面if (frame.empty()){cout 读取摄像头数据失败!\n endl;return -1;}imshow(摄像头, frame); //显示图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRGimshow(灰度化, grayFrame); //显示图像//直方图均衡化用来增强图像对比度从而让轮廓更加明显equalizeHist(grayFrame, equalizeFrame);imshow(直方图, equalizeFrame);if (waitKey(30) 27) //ESC键{break;}}return 0; }运行程序效果如下所示最右边的是经过直方图均衡化处理后的 6. 加载级联分类器 级联分类器CascadeClassifier的作用是进行目标检测。它是一种基于机器学习的分类器通过训练多个弱分类器来识别目标物体。这些弱分类器层层级联形成一个级联分类器能够快速准确地检测出图像中的目标物体。 级联分类器通常用于人脸检测可以通过训练来识别人的面部特征如眼睛、鼻子、嘴巴等从而识别人脸并定位人脸的位置。在OpenCV中CascadeClassifier类提供了一个方便的接口可以加载预训练的级联分类器并进行目标检测操作。 首先我们要去加载级联分类器文件(xml文件)这些文件位于D:\Developer\opencv4.8.0\opencv\build\etc目录下这里我们用的是haarcascade这种基于梯度提升决策树的分类器 (另一种lbpcascade是一种基于局部二值模式LBP的分类器) 在haarcascade目录下我们可以看到haarcascade_frontalface_alt.xml这个文件就是我们需要的用于人脸识别的级联分类器了。 所以我们加载级联分类器的时候去指定这个路径D:\Developer\opencv4.8.0\opencv\build\etc\haarcascades\haarcascade_frontalface_alt.xml需要注意的是放到代码里这里的要将\改为/ (或者改为\\也行)。如果不改那么路径不对级联分类器会读取出错。 具体代码如下 int main() {CascadeClassifier face_CascadeClassifier;if (!face_CascadeClassifier.load(D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml)) {cout 级联分类器加载失败!\n endl;return -1;}//这里省略了原本其他的代码 ... }7. 进行人脸检测 接下来我们就要进行人脸检测了人脸检测需要调用detectMultiScale方法第一个参数 image 需要传入我们刚才处理后的直方图第二个参数objects会返回所有检测出来的人脸的坐标。 void detectMultiScale( InputArray image,CV_OUT std::vectorRect objects,double scaleFactor 1.1,int minNeighbors 3, int flags 0,Size minSize Size(),Size maxSize Size() );还有一个rectangle方法用来在得到人脸坐标之后进行画框。第一个参数img代表要在哪个图像上画框第二个参数rec表示框的坐标第三个参数color表示画框的颜色。 void rectangle(InputOutputArray img, Rect rec,const Scalar color, int thickness 1,int lineType LINE_8, int shift 0);主要代码如下所示 std::vectorRect faces; face_CascadeClassifier.detectMultiScale(grayFrame, faces); //检测人脸for (size_t i 0; i faces.size(); i) {rectangle(frame,faces[i],Scalar(0,0,255)); //在人脸的位置画红色的框 }来看一下完整代码 #include OpenCVTest.h #include opencv2/opencv.hppusing namespace std; using namespace cv;int main() {//加载级联分类器CascadeClassifier face_CascadeClassifier;if (!face_CascadeClassifier.load(D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml)) {cout 级联分类器加载失败!\n endl;return -1;}VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout opencv打开摄像头失败!\n endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像Mat equalizeFrame; //直方图while (true){capture frame; //从capture中取数据将画面输出到frame矩阵里面if (frame.empty()){cout 读取摄像头数据失败!\n endl;}//imshow(摄像头, frame); //显示图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRG//imshow(灰度化, grayFrame); //显示图像//直方图均衡化用来增强图像对比度从而让轮廓更加明显equalizeHist(grayFrame, equalizeFrame);//imshow(直方图, equalizeFrame);std::vectorRect faces;face_CascadeClassifier.detectMultiScale(grayFrame, faces); //检测人脸for (size_t i 0; i faces.size(); i){rectangle(frame,faces[i],Scalar(0,0,255));}imshow(摄像头, frame); //显示图像if (waitKey(30) 27) //ESC键{break;}}return 0; }运行程序来看一下效果 可以看到人脸已经检测出来了并对人脸进行了画框。但是可以画面非常的卡顿因为人脸检测是非常耗时的可能需要500毫秒甚至1-2秒时间这里每一帧都去检测人脸导致了异常卡顿。所以这种方式只适合用来检测静态图像并不适合用作实时的摄像头人脸跟踪检测。 8. 实现实时人脸跟踪检测 8.1 OpenCV Android Demo 那我们需要来怎么做呢 ? 其实我们可以来看一下官方的示例我们要去下载官方的Android包里面有Android的官方示例。 8.2 DetectionBasedTracker_jni.cpp 我们下载解压后可以在OpenCV-android-sdk\samples\face-detection\jni目录下找到DetectionBasedTracker_jni.cpp这个文件 在里面的nativeCreateObject方法里我们可以发现其调用了这几句代码 8.3 CascadeDetectorAdapter CascadeDetectorAdapter是一个适配器类用于将CascadeClassifier与Detector接口适配起来从而用于检测人脸。 再来看一下CascadeDetectorAdapter这个类里面的detect方法就是用来检测人脸的 8.4 DetectorAgregator 然后来看一下第三行代码中的DetectorAgregator这里面有tracker makePtrDetectionBasedTracker(mainDetector, trackingDetector, DetectorParams);这行代码是我们需要的用来传入mainDetector和trackingDetector生成一个tracker对象。 8.5 开始重新编写代码 这里我们将原来写的人脸检测的代码删除了代码恢复到了刚配置好OpenCV的初始状态然后将CascadeDetectorAdapter这个类的代码复制到我们的项目中 class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector { public:CascadeDetectorAdapter(cv::Ptrcv::CascadeClassifier detector):IDetector(),Detector(detector){CV_Assert(detector);}void detect(const cv::Mat Image, std::vectorcv::Rect objects){Detector-detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);}virtual ~CascadeDetectorAdapter(){}private:CascadeDetectorAdapter();cv::Ptrcv::CascadeClassifier Detector; };声明 tracker这个对象。 cv::PtrDetectionBasedTracker tracker;然后创建tracker并调用run()方法会启动一个异步线程后面的人脸检测会在这个异步线程进行检测了。 string stdFileName D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml; //创建一个主检测适配器 cv::PtrCascadeDetectorAdapter mainDetector makePtrCascadeDetectorAdapter(makePtrCascadeClassifier(stdFileName)); //创建一个跟踪检测适配器 cv::PtrCascadeDetectorAdapter trackingDetector makePtrCascadeDetectorAdapter(makePtrCascadeClassifier(stdFileName)); //创建跟踪器 DetectionBasedTracker::Parameters DetectorParams; tracker makePtrDetectionBasedTracker(mainDetector, trackingDetector, DetectorParams); tracker-run();然后在人脸检测的使用调用tracker-process(grayFrame);进行人脸检测并调用tracker-getObjects(faces);获得识别出来的人脸。 tracker-process(grayFrame); tracker-getObjects(faces);核心代码就是如上所示接下来我们再来看一下完整的代码 #include OpenCVTest.h #include opencv2/opencv.hppusing namespace std; using namespace cv;class CascadeDetectorAdapter : public DetectionBasedTracker::IDetector { public:CascadeDetectorAdapter(cv::Ptrcv::CascadeClassifier detector) :IDetector(),Detector(detector){CV_Assert(detector);}void detect(const cv::Mat Image, std::vectorcv::Rect objects){Detector-detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize);}virtual ~CascadeDetectorAdapter(){}private:CascadeDetectorAdapter();cv::Ptrcv::CascadeClassifier Detector; };cv::PtrDetectionBasedTracker tracker;int main() {string stdFileName D:/Developer/opencv4.8.0/opencv/build/etc/haarcascades/haarcascade_frontalface_alt.xml;//创建一个主检测适配器cv::PtrCascadeDetectorAdapter mainDetector makePtrCascadeDetectorAdapter(makePtrCascadeClassifier(stdFileName));//创建一个跟踪检测适配器cv::PtrCascadeDetectorAdapter trackingDetector makePtrCascadeDetectorAdapter(makePtrCascadeClassifier(stdFileName));//创建跟踪器DetectionBasedTracker::Parameters DetectorParams;tracker makePtrDetectionBasedTracker(mainDetector, trackingDetector, DetectorParams);tracker-run();VideoCapture capture;capture.open(0);if (!capture.isOpened()){cout opencv打开摄像头失败!\n endl;return -1;}Mat frame; //摄像头彩色图像Mat grayFrame; //摄像头灰度图像Mat equalizeFrame; //直方图while (true){capture frame; //从capture中取数据将画面输出到frame矩阵里面if (frame.empty()){cout 读取摄像头数据失败!\n endl;return -1;}//imshow(摄像头, frame); //显示图像//灰度化处理cvtColor(frame, grayFrame, COLOR_BGR2GRAY); //注意 : OpenCV中是BRG//imshow(灰度化, grayFrame); //显示图像//直方图均衡化用来增强图像对比度从而让轮廓更加明显equalizeHist(grayFrame, equalizeFrame);//imshow(直方图, equalizeFrame);std::vectorRect faces;tracker-process(grayFrame);tracker-getObjects(faces);for (size_t i 0; i faces.size(); i){rectangle(frame, faces[i], Scalar(0, 0, 255));}imshow(摄像头, frame); //显示图像if (waitKey(30) 27) //ESC键{break;}}tracker-stop();return 0; }8.6 运行效果 运行程序我们就可以看到本文开头给出的效果了 至此我们就使用OpenCV完成实时人脸跟踪识别了。 9. 本文源码下载 使用OpenCV实现人脸识别示例Demo
http://www.pierceye.com/news/764315/

相关文章:

  • 试玩app推广网站建设广州网站维护制作
  • 2018年网站设计公司阿里巴巴网官方网站
  • 英文网站常用字体icp备案的网站名称
  • 扬州恒通建设网站镇江润州区建设局网站
  • 关于网站制作的论文网站注册时间
  • 一个人可以备案几个网站做图去哪个网站找素材
  • 江苏建设管理信息网站自己可以做装修效果图的网站
  • html网站欣赏杭州战争网站建设
  • 乐清市做淘宝网站公司网站支付体现功能怎么做
  • 做网站公司促销海报本网站只做信息展示
  • 网站建设商城模板仿我喜欢网站源码免费
  • 工商服务网优化网站推广
  • 嘉兴网站系统总部做一个网站一般要多少钱
  • win10电脑做网站网站为什么有价值是
  • 凡科网站建设视频impreza 4 wordpress
  • 北京大兴地区网站建设国外网站设计欣赏分析
  • 如何在网站中加入百度地图广东深圳软件开发公司
  • 诸城网站建设报价兰州网站建设公司有哪些
  • 技术网站的费用怎么做会计分录潍坊模板开发建站
  • 男生女生在床上做的那个网站公众号推广一个6元
  • 湛江做网站设计公司北京婚恋网站哪家最好
  • 大型网站建设的难点是什么物联网技术
  • 怎么免费建个免费的站点写作网站5妙不写就删除
  • 深圳网站建设软件开发公司排名网站做301的坏处
  • ai网站制作的图片
  • 自己想开个网站怎么弄移动端网站设计欣赏
  • 国外网站建站上海品牌策划设计
  • 郑州网站制作选择乐云seo网站建设误区图
  • 湖南智能网站建设多少钱会声会影免费模板网站
  • 社区网站建设方案书建站之星官方网站