将图片的中心移动到坐标原点
由于旋转一般是以图片的中心点旋转的,但图片的左上角的坐标是00,所以我们需要将图片的00点移动到图片的中心来,这里进行一个坐标转换,乘以如下矩阵即可。
进行旋转
旋转也是很简单,在上面的基础上再乘以如下的矩阵即可
坐标还原
在上面的时候,我们将图片的图片的中心点坐标设置为了00,所以在最后,我们要将图片的坐标还原为左上角为00的坐标,再乘以如下矩阵
结果上面的三个矩阵的相乘后,最后得到的表达式为,也就是x,y上的像素值要显示为X1和Y1上面的像素值,还要判断一下X1和Y1是否在图片区域内
python程序测试
import cv2 import math import numpy as np angle = 180/np.pi*5 image = cv2.imread("203_1920x1080.jpg",0) image = cv2.resize(image,(200,100)) dst = np.zeros([100,200],dtype=np.uint8) for x in range(0,100): for y in range(0,200): dst_x = int((y) * math.cos(angle) - (x) * math.sin(angle) + 50 * math.sin(angle) - 100 *math.cos(angle) + 100) dst_y = int((x) * math.cos(angle) + (y) * math.sin(angle)-100*math.sin(angle)-50*math.cos(angle)+ 50) if(dst_x >=0 and dst_x < 200 and dst_y >=0 and dst_y <100): dst[dst_y][dst_x] = image[x][y] cv2.imshow("a",dst) cv2.imshow("b",image) cv2.waitKey(0)
FPGA中实现思路
从表达式中可以看出,旋转的运算是由加减乘来运算的,
sin和cos的值不好计算且设计小数,但我们可以事先将各个角度对应的值存入rom中以及将sin和cos的值扩大256再取整,这样值的误差比较小,最后只要在第二步的矩阵运算后除以一个256即可
由于这里涉及到符号问题,我们采取这样的策略,正负号与数值分离,都采取数值大的减去小的,然后用一个寄存器来判断结果是正还是负,然后接着往下计算
完整项目下载
上板效果
1.180°
2.45°在这里插入图片描述
0-360°都可以,不过都要整数
公众号:FPGA之旅