opencv实现坐标旋转(教你框住小姐姐)

 

一、项目背景

最近在做一个人脸检测项目,需要接入百度AI的系统进行识别和检测。主要流程就是往指定的URLpost图片上去,之后接收检测结果就好了。

百度的检测结果包含这样的信息:

  left - 人脸区域离左边界的距离

  top - 人脸区域离上边界的距离

  width - 人脸区域的宽度

  height - 人脸区域的高度

  ratation 人脸框相对于竖直方向的顺时针旋转角[-180, 180].

 如果我想把人脸框出来,很容易想到的是以(left, top)为左上顶点,以width 为宽,height为高,画一个矩形就好了。但其实这样是不合理的,如果人头是倒着的,这样画出来是不合理的。就像下面这样:

 

所以必须考虑把旋转角加上去。于是我想的策略是先把框画出来,再逆时针旋转ratation 就可以了。

 

二、如何旋转

大致策略就是:先算出四个点的左标,再以左上角的点为原点,逆时针旋转ratation ok了。四个点的左标比较容易确定,利用起点左标加宽高就能算出来。

这里主要讲解如何算旋转后的左标,如下图:

 

 

已知x1x2y1y2和∠a,求x,和y’。这时候就需要用到高中的三角函数的知识了。

假设,(x1, y1) 到 (x2, y2)的长度为r,再画一个∠b

x’ = x1 + r * cos(a + b);

x’ = x1 + r * cos(a) * cos(b) - r * sin(a) * sin(b);

又因为:

r * cos(b) = x2 - x1;

r * sin(b) = (y2 - y1);

最终可以求出:

x’ = x1 + cos(a) * (x2 - x1) - sin(a) * (y2 - y1);

同理求出:

y’ = y1 + sin(a) * (x2 - x1) - cos(a) * (y2 - y1);

啊,这真是用了我毕生所学的数学知识,真没想到工作后还会用到三角函数的知识。还是要多学点数学知识才好啊。

 

三、源码

下面就是真正画图的东西了,为了测试这个公式是否可行,我用opencv画了一个四根线(其实就是一个方形),然后以左上角为顶点旋转。

下面的具体的代码,比较简单,主要是那个公式,所以也没什么注释。需要包含opencv头文件,以及链接opencv的库。

复制代码
/*  * @author:xcywt  * @date:2018-08-10  * @contact me: https://www.cnblogs.com/xcywt/ */ #include<iostream> #include "opencv2/highgui/highgui.hpp"using namespace cv; #define PI 3.14159265#define<
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信