5分钟更新你的图像处理小技巧(1)opencv旋转矩阵的不同之处

力求5分钟直接了当的说明一个实际问题

cv2.getRotationMatrix2D 简介

用于生成图像旋转的仿射变换矩阵
参数包括:
	center: 旋转的中心点,通常是图像的中心。
	angle: 旋转角度,以度(°)为单位。正值表示逆时针旋转。
	scale: 缩放比例,表示在旋转时图像的缩放程度。
函数返回一个2x3的仿射变换矩阵,与cv2.warpaffine 连用较多

opencv中给出的仿射变换矩阵

[ α β ( 1 − α ) ⋅ center.x − β ⋅ center.y − β α β ⋅ center.x + ( 1 − α ) ⋅ center.y ] α = scale ⋅ cos ⁡ ( angle ) , β = scale ⋅ sin ⁡ ( angle ) \begin{bmatrix} \alpha & \beta & (1 - \alpha) \cdot \text{center.x} - \beta \cdot \text{center.y} \\ -\beta & \alpha & \beta \cdot \text{center.x} + (1 - \alpha) \cdot \text{center.y} \end{bmatrix}\\ \alpha = \text{scale} \cdot \cos(\text{angle}),\quad\beta = \text{scale} \cdot\sin(\text{angle}) [αββα(1α)center.xβcenter.yβcenter.x+(1α)center.y]α=scalecos(angle),β=scalesin(angle)

这与旋转矩阵有何不同?

在中学时,我们学到向量(x,y)以原点为中心旋转一个角度A,则它的新坐标是:

( x ′ y ′ ) = ( cos ⁡ ( A ) − sin ⁡ ( A ) sin ⁡ ( A ) cos ⁡ ( A ) ) ( x y ) \begin{pmatrix} x' \\y'\end{pmatrix} =\begin{pmatrix} \cos(A) & -\sin(A) \\ \sin(A) & \cos(A) \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} (xy)=(cos(A)sin(A)sin(A)cos(A))(xy)

可以看到旋转矩阵的正负号与仿射变换不同
且,旋转角为弧度,不是度(°)

真相就是!

opencv中仿射变换矩阵按照 图像坐标系,即左上角为原点(0,0)
而中学所熟悉的公式是按照 自然坐标系,即左下角为原点(0,0),也就是笛卡尔坐标系

图像处理中,初学者很容忽视这个问题,导致实操时卡bug

如果你还有时间,可以浏览 opencv官方文档

看看可以应用的地方

当我们已知图像上一点,且知图像中心和旋转角弧度,要求图像上一点围绕图像中心旋转,需要做一些变换才正确。

细节,dAngle是弧度

Point2f ptRotatePt2f (Point2f ptInput, Point2f ptOrg, double dAngle)
{	// ptOrg:旋转中心
	// ptInput:旋转点
	double dWidth = ptOrg.x * 2;
	double dHeight = ptOrg.y * 2;
	// 将图像坐标系(左上角原点)转换为笛卡尔坐标系(左下角原点)。只需要变y坐标
	double dY1 = dHeight - ptInput.y;
	double dY2 = dHeight - ptOrg.y;
	double dX = (ptInput.x - ptOrg.x) * cos (dAngle) - (dY1 - ptOrg.y) * sin (dAngle) + ptOrg.x;
	double dY = (ptInput.x - ptOrg.x) * sin (dAngle) + (dY1 - ptOrg.y) * cos (dAngle) + dY2;
	//  把计算后的 Y 坐标从笛卡尔坐标系转换回图像坐标系。
	dY = -dY + dHeight;
	return Point2f ((float)dX, (float)dY);
}
  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值