Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV、dlib地标旋转_Opencv_Dlib - Fatal编程技术网

OpenCV、dlib地标旋转

OpenCV、dlib地标旋转,opencv,dlib,Opencv,Dlib,我是OpenCV和dlib的新手,我不确定我的设计是否正确。我想写一个C++人脸检测器,Android手机应该检测不同的电话方向和旋转角度。当手机方向为纵向和横向时,让我们留下来。我使用OpenCV旋转/编辑图像,使用dlib检测人脸。dlib形状谓词使用shape_predictor_68_face_landmarks.dat初始化,它只能在正确的手机方向上检测人脸(这意味着如果我将手机旋转90度,它就无法检测人脸) 为了能够检测到人脸,我从accelerometor读取轴,将源图像旋转到正确

我是OpenCV和dlib的新手,我不确定我的设计是否正确。我想写一个C++人脸检测器,Android手机应该检测不同的电话方向和旋转角度。当手机方向为纵向和横向时,让我们留下来。我使用OpenCV旋转/编辑图像,使用dlib检测人脸。dlib形状谓词使用shape_predictor_68_face_landmarks.dat初始化,它只能在正确的手机方向上检测人脸(这意味着如果我将手机旋转90度,它就无法检测人脸) 为了能够检测到人脸,我从accelerometor读取轴,将源图像旋转到正确的方向,然后将其发送到dlib人脸检测器,它检测到ok,但dlib::full_object_检测形状中的输出坐标当然与旋转的图片匹配,但不是原始图像。所以这意味着我必须转换(旋转地标)回到原始图像


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

对于iPhone应用程序,使用iPhone摄像头拍摄的图像中的EXIF数据可以首先用于旋转图像。但我不能保证Android手机能做到这一点


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

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

例如: 您的图像围绕中心点(图像的中点)向右旋转了90度,现在您需要围绕中心点将地标点向后旋转90度。代码是

//中心点
点2F中心=(宽度/2,高度/2)
//要旋转的角度,以辐射为单位
//你的情况是-90度
双θ度=角度梯度*180/M_π;
//让矩阵旋转
Mat rotateMatrix=getRotationMatrix2D(中心,θu度,1.0);
//获取地标点的向量
std::矢量输入;
std::矢量输出;
//我们使用相同的旋转矩阵和变换
cv::transform(inputLandmark、outputLandmark、rotateMatrix);
// 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);