博客
关于我
OpenCV 人脸识别 C++实例代码
阅读量:791 次
发布时间:2023-02-23

本文共 3438 字,大约阅读时间需要 11 分钟。

OpenCV人脸检测与图像处理实例

本文将详细介绍如何利用OpenCV库实现人脸检测和图像处理功能。通过本文的步骤指导,您可以轻松完成目标检测和图像分析任务。

开发环境配置

在开始编写代码之前,确保您的开发环境已正确配置。以下是必要的软件版本:

  • 操作系统:Windows 10或更高版本
  • OpenCV库:安装最新版本的OpenCV,确保支持所需功能
  • 开发工具:Visual Studio Code或其他支持C++的开发工具

项目文件结构

创建一个新的项目文件夹,文件结构如下:

project├── src│   └── main.cpp└── build    └── Debug        └── main.exe

代码实现

#include 
#include
#include
#include
#include
#include
#include
using namespace cv;using namespace std;void detectAndDraw(Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip) { 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) }; Mat gray, smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1); cvtColor(img, gray, CV_BGR2GRAY); resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR); equalizeHist(smallImg, smallImg); cascade.detectMultiScale(smallImg, faces, 1.1, 2, 0, Size(30, 30)); if (tryflip) { flip(smallImg, smallImg, 1); cascade.detectMultiScale(smallImg, faces2, 1.1, 2, 0, Size(30, 30)); for (auto r : faces2.begin(), auto rEnd : faces2.end()) { faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height)); } } for (auto r : faces.begin(), auto rEnd : faces.end()) { int i++; Point center; Scalar color = colors[i % 8]; double aspect_ratio = 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); int radius = cvRound((r.width + r.height) * 0.25 * scale); circle(img, center, radius, color, 3, 8, 0); } else { rectangle(img, Point(cvRound(r.x * scale), cvRound(r.y * scale)), Point(cvRound((r.x + r.width - 1) * scale), cvRound((r.y + r.height - 1) * scale)), color, 3, 8, 0); } Mat smallImgROI = smallImg(r); if (!nestedCascade.empty()) { vector
nestedObjects; nestedCascade.detectMultiScale(smallImgROI, nestedObjects, 1.1, 2, 0, Size(30, 30)); for (auto nr : nestedObjects.begin(), auto nrEnd : nestedObjects.end()) { center.x = cvRound((r.x + nr.x + nr.width * 0.5) * scale); center.y = cvRound((r.y + nr.y + nr.height * 0.5) * scale); int radius = cvRound((nr.width + nr.height) * 0.25 * scale); circle(img, center, radius, color, 3, 8, 0); } } } imshow("识别结果", img);}int main() { CascadeClassifier cascade, nestedCascade; string cascade_path = "D:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"; string nested_path = "D:/opencv/sources/data/haarcascades/haarcascade_eye.xml"; VideoCapture cap(0); if (!cap.isOpened()) { return -1; } Mat frame; namedWindow("输入图像", WINDOW_AUTOSIZE); while (true) { cap >> frame; detectAndDraw(frame, cascade, nestedCascade, 2, 0); if (waitKey(30) >= 0) { break; } } return 0;}

代码解释

  • 代码结构:代码主要包括两部分,detectAndDraw函数负责检测人脸和眼部,main函数负责程序的运行逻辑。

  • 预处理步骤

    • 灰度转换:将输入图像转换为灰度图,适用于Harr特征检测。
    • 图像缩小:通过双线性插值缩小图像以加快检测速度。
    • 直方图均值化:对缩小后的图像进行直方图均值化处理,增强对比度。
  • 人脸检测

    • 使用detectMultiScale函数进行多尺度人脸检测。
    • 由于图像缩小,需将检测结果转换回原图像尺寸标注。
  • 图像显示:使用imshow函数显示检测结果。

  • 性能优化:通过计算算法执行时间,供开发和调试参考。

  • 运行结果

    运行上述代码,您将看到以下结果:

  • 灰度图像:显示原始图像的灰度版本。
  • 缩小图像:显示缩小后的图像。
  • 直方图均值化:展示直方图均值化处理后的图像。
  • 人脸检测结果:标注人脸的位置和颜色。
  • 眼部检测结果:标注人眼的位置和颜色。
  • 注意事项

  • 依赖管理:确保所有OpenCV库路径正确,避免动态链接错误。
  • 图像读取:使用VideoCapture读取图像,确保摄像头权限。
  • 性能调优:根据实际需求调整缩放比例和检测参数,以提高检测速度。
  • 通过本文的指导,您可以根据实际需求对OpenCV人脸检测和图像处理进行更深入的定制和优化。

    转载地址:http://nlsfk.baihongyu.com/

    你可能感兴趣的文章
    On Error GOTO的好处
    查看>>
    onclick事件的基本操作
    查看>>
    oncopy和onpaste
    查看>>
    onCreate中的savedInstanceState作用
    查看>>
    onCreate()方法中的参数Bundle savedInstanceState 的意义用法
    查看>>
    One good websit for c#
    查看>>
    One-Shot学习/一次学习(One-shot learning)
    查看>>
    OneASP 安全公开课,深圳站, Come Here, Feel Safe!
    查看>>
    OneBlog Shiro 反序列化漏洞复现
    查看>>
    oneM2M
    查看>>
    Oneplus5重装攻略
    查看>>
    one_day_one--mkdir
    查看>>
    ONI文件生成与读取
    查看>>
    Vue 项目中实现高效的消息提示与确认对话框功能(模版)
    查看>>
    Online PDF to PNG、JPEG、WEBP、 TXT - toolfk
    查看>>
    onlstm时间复杂度_CRF和LSTM 模型在序列标注上的优劣?
    查看>>
    onlyoffice新版5.1.2版解决中文汉字输入重复等问题
    查看>>
    onnx导出动态输入
    查看>>
    onnx导出动态输入
    查看>>
    onScrollStateChanged无效
    查看>>