首页 文章

OpenCV,dlib地标旋转

提问于
浏览
0

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

dlib或OpenCV中是否有任何现有的API可以为指定的角度旋转地标(dlib :: full_object_detection)?如果你能提供一些例子,那就太好了 .

2 回答

  • 0

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

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

  • 0

    据我所知,您希望将检测到的地标旋转到原始图像的坐标系 . 如果是这样,您可以使用getRotationMatrix2D并转换以旋转点列表 .

    例如:您的图像围绕中心点(图像的中间点)向右旋转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);
    

相关问题