OpenCV,dlib地标轮换

时间:2017-07-24 11:32:50

标签: opencv dlib

我是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)?如果你能提供一些例子,那就太好了。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

据我了解,您想将检测到的界标旋转到原始图像的坐标系。如果是这样,可以使用 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);