任务需求
有一张图片人脸是朝着左边横过来的,这样的图片一般用人脸检测很难检测到其中的位置,而且难以进行特征点检测. 所以需要把原图A,顺时针旋转90度(逆时针270)得到图片B,然后检测B的特征点的位置Blm,然后再通过Blm得到Alm.
图片旋转
第一次找的不合适,
#include<vector>
using namespace cv;
using namespace std;
void imrotate(Mat& img, Mat& newIm, double angle){
int len = max(img.cols, img.rows);
Point2f pt(len/2.,len/2.);
Mat r = getRotationMatrix2D(pt,angle,1.0);
warpAffine(img,newIm,r,Size(len,len));
}
然后看到一个关于这种 90度倍数旋转比较好的网站
https://amin-ahmadi.com/2017/06/01/how-to-rotate-andor-flip-mirror-images-in-opencv/
找到了符合我需求的旋转,
transpose(img, img);
flip(img, img, 1);
补充一个逆时针90度的, 正好和上面的过程相反
img = cv.flip(img, 1).transpose(1, 0, 2)
恢复特征点的位置
如图B到A的旋转, 特征点需要乘以的旋转矩阵为
(
0
1
−
1
0
)
\begin{pmatrix} 0 & 1\\ -1 & 0 \end{pmatrix}
(0−110)
由于比较简单所以
A
l
m
=
(
B
l
m
[
:
,
1
]
,
−
B
l
m
[
:
,
0
]
)
A_{lm} = (B_{lm}[:, 1], -B_{lm}[:, 0] )
Alm=(Blm[:,1],−Blm[:,0])
但是可以看到这样得到在A下的特征点的位置并不是以A为图片坐标系的位置, 主要是纵坐标应该变为
( imgA.rows-1 - B_{lm}[:, 0])
python 实现顺时针旋转
img=img.transpose(1, 0, 2)[:, ::-1].copy()
lm=lm[:, ::-1].copy()
lm[:, 0] = img.shape[1] -1 - lm[:, 0]