opencv 图片旋转及对应特征点旋转

任务需求

有一张图片人脸是朝着左边横过来的,这样的图片一般用人脸检测很难检测到其中的位置,而且难以进行特征点检测. 所以需要把原图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)

恢复特征点的位置

BtoA
如图B到A的旋转, 特征点需要乘以的旋转矩阵为
( 0 1 − 1 0 ) \begin{pmatrix} 0 & 1\\ -1 & 0 \end{pmatrix} (0110)
由于比较简单所以
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值