我是OpenCV和dlib的新手,我不确定我的设计是否正确。我想写安卓手机的C++人脸检测器,它应该可以检测不同手机方向和旋转角度的人脸。当手机方向是纵向和横向时,让我们留下来。我使用OpenCV来旋转/编辑图像,使用dlib来检测人脸。dlib形状预测是用shape_predictor_68_face_landmarks.dat初始化的,它只能在正确的手机方向上检测人脸(这意味着如果我将手机旋转90度,它就不能检测人脸)。为了能够检测人脸,我从加速计中读取轴并旋转源图像以校正方向,然后将其发送到dlib人脸检测器,它检测到ok,但输出的dlib::full_object_detection形状的坐标当然与旋转的图片匹配,但不是原始的。因此,这意味着我必须转换(旋转地标)回到原始图像。
dlib或OpenCV中是否有任何现有的API可以实现指定角度的旋转地标(dlib::full_object_detection)?如果你能提供一些例子,那就更好了。
发布于 2017-07-25 09:15:23
对于iPhone应用程序,使用iPhone摄像头捕获的图像中的EXIF数据可以首先用于旋转图像。但我不能保证Android手机能做到这一点。
在大多数实际情况下,当原始图像中的人脸检测没有返回任何结果(或者返回非常小的人脸等奇怪的结果)时,旋转图像和执行人脸检测会更容易。我已经在几个Android应用程序中看到了这一点,并在几个项目中使用了myseklf。
发布于 2018-11-05 16:12:46
据我所知,您希望将检测到的地标旋转到原始图像的坐标系中。如果是这样,您可以使用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);https://stackoverflow.com/questions/45279535
复制相似问题