OpenCV,dlib 地标旋转

Posted

技术标签:

【中文标题】OpenCV,dlib 地标旋转【英文标题】:OpenCV, dlib landmarks rotation 【发布时间】:2017-12-29 23:27:16 【问题描述】:

我是 OpenCV 和 dlib 的新手,我不确定我的设计是否正确。我想为 android 手机编写 C++ 人脸检测器,它应该检测具有不同手机方向和旋转角度的人脸。当手机方向是纵向和横向时,让我们留下来。我正在使用 OpenCV 旋转/编辑图像和 dlib 来检测人脸。使用 shape_predictor_68_face_landmarks.dat 初始化的 dlib 形状谓词,它只能在正确的手机方向上检测人脸(这意味着如果我将手机旋转 90 度,它就无法检测到人脸。) 为了使检测面部成为可能,我从加速度计读取轴并将源图像旋转到正确的方向,然后将其发送到 dlib 面部检测器并且它检测到正常,但 dlib::full_object_detection 形状中的输出坐标当然与旋转的图片匹配,但不是原始的。所以这意味着我必须将(旋转地标)转换回原始图像。

dlib 或 OpenCV 中是否有任何现有的 API 可以为指定角度旋转地标 (dlib::full_object_detection)?能举个例子就好了。

【问题讨论】:

【参考方案1】:

据我了解,您希望将检测到的地标旋转到原始图像的坐标系。如果是这样,您可以使用 getRotationMatrix2Dtransform 来旋转点列表。

例如: 您的图像围绕中心点(图像的中间点)向右旋转 90 度,现在您需要围绕中心点将地标点向后旋转 -90 度。代码是

// the center point 
Point2f center=(width/2,height/2)

//the angle to rotate, in radiant 
// in your case it is -90 degree
double theta_deg= angleInDegree * 180 /M_PI;

// get the matrix to rotate
Mat rotateMatrix = getRotationMatrix2D(center, theta_deg, 1.0);

// the vector to get landmark points
std::vector<cv::Point> inputLandmark;
std::vector<cv::Point> outputLandmark;

// we use the same rotate matrix and use transform
cv::transform(inputLandmark, outputLandmark, rotateMatrix);

【讨论】:

【参考方案2】:

对于 iPhone 应用程序,使用 iPhone 相机拍摄的图像中的 EXIF 数据可用于首先旋转图像。但我不能保证这适用于 Android 手机。

在大多数实际情况下,当原始图像中的人脸检测没有返回任何结果(或返回奇怪的结果,如非常小的人脸)时,旋转图像并执行人脸检测会更容易。我已经在几个 Android 应用程序中看到了这一点,并且我已经在几个项目中使用了它。

【讨论】:

以上是关于OpenCV,dlib 地标旋转的主要内容,如果未能解决你的问题,请参考以下文章

我将如何通过仿射变换在opencv中实现这一点?

训练模型以实现 DLib 的面部特征点,例如手的特征点及其地标

使用 OpenCV 从图像中识别地标和裁剪嘴的脚本看不到人脸

opencv图像融合(给人脸添加一个眼镜)

使用 dlib 检测眼睛地标

如何利用opencv进行图形的旋转以及画出一个旋转的矩形