几何变换
1、变换
OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,
使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是
2 × 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 × 3 的变换矩
阵。
2、扩展缩放(只是改变图像的尺寸大小)
OpenCV 提供的函数 cv2.resize()
可以实现这个功能。图像的尺寸可以自己手动设置,你也可以指定缩放因子。我
们可以选择使用不同的插值方法。
在缩放时我们推荐使用 cv2.INTER_AREA,在扩展时我们推荐使用 v2.INTER_CUBIC(慢) 和 v2.INTER_LINEAR。
默认情况下所有改变图像尺寸大小的操作使用的插值方法都是 cv2.INTER_LINEAR。
你可以使用下面任意一种方法改变图像的尺寸
import cv2 import numpy as np img=cv2.imread('messi5.jpg') # 下面的 None 本应该是输出图像的尺寸,但是因为后边我们设置了缩放因子 # 因此这里为 None res=cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC) #OR # 这里呢,我们直接设置输出图像的尺寸,所以不用设置缩放因子 height,width=img.shape[:2] res=cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC) while(1): cv2.imshow('res',res) cv2.imshow('img',img) if cv2.waitKey(1) & 0xFF == 27: break cv2.destroyAllWindows()
2、平移
平移就是将对象换一个位置。如果你要沿(x,y)方向移动,移动的距离
是(tx,ty),你可以以下面的方式构建移动矩阵:
你可以使用 Numpy 数组构建这个矩阵(数据类型是 np.flfloat32),然
后把它传给函数 cv2.warpAffiffiffine()。看看下面这个例子吧,它被移动了
(100,50)个像素。
import cv2 import numpy as np cap=cv2.VideoCapture(0) while(1): # 获取每一帧 ret,frame=cap.read() # 转换到 HSV hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) # 设定蓝色的阈值 lower_blue=np.array([110,50,50]) upper_blue=np.array([130,255,255]) # 根据阈值构建掩模 mask=cv2.inRange(hsv,lower_blue,upper_blue) # 对原图像和掩模进行位运算 res=cv2.bitwise_and(frame,frame,mask=mask) # 显示图像 cv2.imshow('frame',frame) cv2.imshow('mask',mask) cv2.imshow('res',res) k=cv2.waitKey(5)&0xFF if k==27: break # 关闭窗口 cv2.destroyAllWindows()
警告:函数 cv2.warpAffiffiffine() 的第三个参数的是输出图像的大小,它的格式
应该是图像的(宽,高)。应该记住的是图像的宽对应的是列数,高对应的是行
数。
4、旋转
![](https://img2018.cnblogs.com/i-beta/1766866/202002/1766866-20200207114210038-159418565.png)
import cv2 import numpy as np img=cv2.imread('messi5.jpg',0) rows,cols=img.shape # 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 # 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题 M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6) # 第三个参数是输出图像的尺寸中心 dst=cv2.warpAffine(img,M,(2*cols,2*rows)) while(1): cv2.imshow('img',dst) if cv2.waitKey(1)&0xFF==27: break cv2.destroyAllWindows()
5、仿射变换
6、透视变换