下面详细讲解一下C++利用OpenCV实现人脸检测的完整攻略。
确定使用的OpenCV版本
首先,需要确认使用的OpenCV版本。当前最新版本为4.5.1,可以从官网下载并安装。也可以通过包管理器等方式安装,如:
sudo apt-get install libopencv-dev
创建C++工程
接着,需要创建一个C++工程。可以使用任何C++开发工具来创建,通常使用的是Visual Studio等IDE。
引入OpenCV库文件
在创建好C++工程后,需要将OpenCV库文件引入到工程中。具体引入步骤与不同的IDE或环境有关,这里以Visual Studio 2019为例,介绍一下简单的引入方法:
在工程属性中的VC++目录选项卡中,添加OpenCV的include路径和lib路径。在VC++目录下的include目录中添加OpenCV的include目录,在library目录中添加OpenCV的库文件目录。
在项目属性中的配置属性中的链接器-输入目录中,添加需要使用的OpenCV库文件,如:
opencv_calib3d450d.lib
opencv_core450d.lib
opencv_dnn450d.lib
opencv_features2d450d.lib
opencv_flann450d.lib
opencv_gapi450d.lib
opencv_highgui450d.lib
opencv_imgcodecs450d.lib
opencv_imgproc450d.lib
opencv_ml450d.lib
opencv_objdetect450d.lib
opencv_photo450d.lib
opencv_stitching450d.lib
opencv_video450d.lib
opencv_videoio450d.lib
加载OpenCV并实现人脸检测
引入库文件后,就可以开始加载OpenCV并编写人脸检测的代码了。以下是两个示例:
示例1:利用Haar特征实现人脸检测
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
// 加载Haar特征分类器
cv::CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_alt.xml");
// 加载图片并处理
cv::Mat img = cv::imread("image.jpg");
if (img.empty()) {
std::cout << "图片未找到" << std::endl;
return -1;
}
// 将图片转为灰度图
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
// 检测人脸
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
// 显示结果
for (size_t i = 0; i < faces.size(); ++i) {
cv::rectangle(img, faces[i], cv::Scalar(0, 0, 255), 2, 8, 0);
}
cv::imshow("result", img);
cv::waitKey(0);
return 0;
}
示例2:利用Deep Learning实现人脸检测
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <iostream>
int main()
{
// 定义模型文件路径
std::string prototxt_file = "deploy.prototxt";
std::string model_file = "res10_300x300_ssd_iter_140000_fp16.caffemodel";
// 加载模型
cv::dnn::Net net = cv::dnn::readNetFromCaffe(prototxt_file, model_file);
// 加载图片并处理
cv::Mat img = cv::imread("image.jpg");
if (img.empty()) {
std::cout << "图片未找到" << std::endl;
return -1;
}
// 图片预处理
cv::Mat inputBlob = cv::dnn::blobFromImage(img, 1.0, cv::Size(300, 300), cv::Scalar(104, 177, 123), false, false);
net.setInput(inputBlob, "data");
// 运行模型
cv::Mat detection = net.forward("detection_out");
// 解析结果并显示
cv::Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());
for (int i = 0; i < detectionMat.rows; ++i) {
float confidence = detectionMat.at<float>(i, 2);
if (confidence > 0.5) {
int x1 = static_cast<int>(detectionMat.at<float>(i, 3) * img.cols);
int y1 = static_cast<int>(detectionMat.at<float>(i, 4) * img.rows);
int x2 = static_cast<int>(detectionMat.at<float>(i, 5) * img.cols);
int y2 = static_cast<int>(detectionMat.at<float>(i, 6) * img.rows);
cv::rectangle(img, cv::Rect(cv::Point(x1, y1), cv::Point(x2, y2)), cv::Scalar(0, 0, 255), 2);
}
}
cv::imshow("result", img);
cv::waitKey(0);
return 0;
}
以上是两个简单的OpenCV人脸检测示例,希望可以对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++利用opencv实现人脸检测 - Python技术站