【问题标题】:OpenCV, dlib landmarks rotationOpenCV,dlib 地标旋转
【发布时间】: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)?能举个例子就好了。

【问题讨论】:

    标签: opencv dlib


    【解决方案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 应用程序中看到了这一点,并且我已经在几个项目中使用了它。

      【讨论】:

        猜你喜欢
        • 2019-02-01
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多