OpenCV学习代码记录——人脸检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录。
代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest
效果#
代码#
我是直接使用OpenCV自带的分类器。如果有数据,可以自己训练得到。
#include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/objdetect.hpp> #include <opencv2/imgproc.hpp> #include <cstdio> // g++ face.cpp -o face -std=c++11 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_objdetect // 文件在opencv的安装目录下有 static const char* cascade_name = "D:\\OpenCV\\share\\OpenCV\\haarcascades\\" "haarcascade_frontalface_alt2.xml"; // http://wiki.opencv.org.cn/index.php/%E4%BA%BA%E8%84%B8%E6%A3%80%E6%B5%8B void frameFaceDetection(cv::Mat& src, cv::CascadeClassifier& cascade, const char* showWindowName); int FaceDetection(int c,char**v) { //cv::Mat src,gray; // 源图像,灰度图像 cv::VideoCapture capture; // 视频捕获对象 cv::Mat frame; // 视频帧 cv::CascadeClassifier cascade; //级联分类器 /** // 加载源图像 const char* picpath = "../Image/sisy.jpg"; if (c > 1) { picpath = v[1]; } src = cv::imread(picpath); if (src.empty()) { puts("图片加载失败!!!"); return -1; } */ // 打开视频文件 if (!capture.open("../Image/video.mov")) { puts("打开视频文件失败!!!"); return -1; } // 加载人脸识别级联分类器文件 if (!cascade.load(cascade_name)){ puts("人脸识别级联分类器文件加载失败!!!"); return 0; } // 创建显示窗口 cv::namedWindow("src"); cv::Mat src_scale; src_scale.create(cv::Size(480, 320), CV_8SC3); // 循环取帧并显示 while (capture.read(frame)) { // 进行缩放 cv::resize(frame, src_scale, src_scale.size()); // 检测并显示 frameFaceDetection(src_scale, cascade, "src"); // 等待按键事件 // 此处等待也为显示图像函数提供足够的时间完成显示 // 等待事件可以按照CPU速度进行调节 if (cv::waitKey(1) >= 0) { break; // 按键就退出 } } //cv::waitKey(); cv::destroyAllWindows(); return 0; } void frameFaceDetection(cv::Mat& src, cv::CascadeClassifier& cascade, const char* showWindowName) { std::vector<cv::Rect> faces; cv::Mat gray; // 获取源图像的灰度图像 gray.create(src.size(), CV_8UC1); cv::cvtColor(src, gray, CV_BGR2GRAY); // 使灰度图象直方图均衡化 cv::equalizeHist(gray, gray); // 获取初步检测结果 cascade.detectMultiScale( gray/*源图像*/, faces/*检测出的物体边缘(得到被检测物体的矩形框向量组)*/, 1.1/*每一个图像尺度中的尺度参数,默认值为1.1*/, 2/*每一个级联矩形应该保留的邻近个数*/, CV_HAAR_SCALE_IMAGE, cv::Size(30, 30)/*最小可能的对象的大小,小于的对象将被忽略*/); // 将检测得到的结果,绘制到原图像上 for (auto face : faces) { // 绘制红色矩形 cv::rectangle(src, face, cv::Scalar(0, 0, 255), 3); } // 显示图像 cv::imshow(showWindowName, src); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理