c++ opencv4.6 做人脸矫正的代码
时间: 2023-12-31 14:05:48 浏览: 65
openCV人脸检测的C++代码
以下是一个使用 OpenCV 4.6 实现人脸矫正的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
try
{
// 加载人脸检测器和人脸关键点检测器
String face_detector_path = "haarcascade_frontalface_default.xml";
CascadeClassifier face_detector;
face_detector.load(face_detector_path);
String landmarks_detector_path = "shape_predictor_68_face_landmarks.dat";
dlib::shape_predictor landmarks_detector;
dlib::deserialize(landmarks_detector_path) >> landmarks_detector;
// 加载需要处理的图像
Mat img = imread("test.jpg");
// 检测人脸
vector<Rect> faces;
face_detector.detectMultiScale(img, faces, 1.1, 3, 0, Size(100, 100));
// 对每个人脸进行处理
for (auto&& face : faces)
{
// 提取人脸关键点
Mat face_roi = img(face);
dlib::cv_image<dlib::bgr_pixel> dlib_face(face_roi);
dlib::full_object_detection shape = landmarks_detector(dlib_face);
// 计算人脸矩阵
Point2f src_points[3];
Point2f dst_points[3];
src_points[0] = Point2f(shape.part(36).x(), shape.part(36).y());
src_points[1] = Point2f(shape.part(45).x(), shape.part(45).y());
src_points[2] = Point2f(shape.part(30).x(), shape.part(30).y());
dst_points[0] = Point2f(0, img.rows - 1);
dst_points[1] = Point2f(img.cols - 1, img.rows - 1);
dst_points[2] = Point2f(img.cols / 2, img.rows / 2);
Mat M = getAffineTransform(src_points, dst_points);
// 进行仿射变换
Mat warped_face;
warpAffine(face_roi, warped_face, M, img.size());
// 将处理后的人脸区域替换原图中的人脸区域
warped_face.copyTo(img(face));
}
// 保存处理后的图像
imwrite("result.jpg", img);
}
catch (exception& e)
{
cout << e.what() << endl;
}
}
```
在本例中,我们使用 OpenCV 的人脸检测器和 dlib 库的人脸关键点检测器来检测人脸和提取人脸关键点。然后通过计算人脸矩阵,使用 `cv::getAffineTransform()` 函数来进行仿射变换,将人脸区域矫正到指定的位置。最后将处理后的人脸区域替换原图中的人脸区域,并保存处理后的图像。
需要注意的是,本例中使用的人脸检测器和人脸关键点检测器可能不是最优的选择。在实际应用中,你可以根据实际需求来选择适合的检测器和检测方法。
阅读全文