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】:据我了解,您希望将检测到的地标旋转到原始图像的坐标系。如果是这样,您可以使用 getRotationMatrix2D 和 transform 来旋转点列表。
例如: 您的图像围绕中心点(图像的中间点)向右旋转 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 地标旋转的主要内容,如果未能解决你的问题,请参考以下文章
训练模型以实现 DLib 的面部特征点,例如手的特征点及其地标