十五天掌握OpenCV——几何变换


Aim:变换动作(移动,旋转,仿射变换)cv2.getPerspectiveTransfrom() ——解释:实现所有类型的变换。
cv2.warpAffine() ——解释:参数是 2 3变换矩阵。
cv2.warpPerspective() ——解释:参数是 3
3变换矩阵。

扩展缩放——改变图像的尺寸大小

  1. cv2.resize(src,dst,interpolation=CV_INTER_LINEAR) ——解释:改变图像的尺寸大小。
  2. cv2.INTER_AREA()
  3. cv2.INTER_CUBIC() [慢]
  4. cv2.INTER_LINEAR() ——解释:改变图像尺寸大小的操作使用的插值方法。

代码演示

# coding=utf-8

import cv2
import numpy as np

img=cv2.imread('222.jpg')
res=cv2.resize(img,None,fx=0.5,fy=0.5,interpolation=cv2.INTER_CUBIC)
# None为输出图像的尺寸
height,width=img.shape[0.5]
res=cv2.resize(img,(1*width,1*height),interpolation=cv2.INTER_CUBIC)

while(1):
    # cv2.imshow('res',res)
    cv2.imshow('img',img)

    if cv2.waitKey(1) &0xFF == 27:
        break
cv2.destroyAllWindows()

平移

  1. 沿(x,y)方向移动图像,则移动距离是(tx,ty)。移动矩阵:第一行 1 0 tx 第二行 0 1 ty。
  2. 使用Numpy数组构建矩阵,数据类型np.float32。传值cv2.warpAffine()。

代码演示

# coding=utf-8
import cv2
import numpy as np
cap=cv2.VideoCapture(0)
while(1):
    ret,frame=cap.read() #获取图像
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) #转换为hsv
    # 设置颜色阈值
    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()

旋转

  1. 对一个图像旋转角度θ:旋转矩阵 M = 第一行 cosθ -sinθ 第二行 sinθ cosθ。
  2. 任意位置旋转(opencv平台):旋转矩阵 第一行 α β (1-α)·center.x - β·center.x 第二行 -β α β·center.x+(1-α)·center.x 其中:α=scale·cosθ β=scale·sinθ。
  3. cv2.getRotationMatrix2D ——解释:构建旋转矩阵。

代码演示

# 图像旋转90°
# coding = utf-8
import cv2
import numpy as np
img=cv2.imread('123.jpg')
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('dst',dst)
    if cv2.waitKey(1)&0xFF==27:
        break
cv2.destroyAllWindows()

原图
图

仿射变换

  1. 特点:原图中所有的平行弦在结果图中同样平行。
  2. Aim:找出原图中三个点以及输出图像中的位置。
  3. cv2.getAffineTransform:创建2*3的矩阵。

代码演示

# 绿色标点
# coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('123.jpg')
rows,cols,ch=img.shape
pts1=np.float32([[50,50],[200,50],[50,200]])
pts2=np.float32([[10,100],[200,50],[100,250]])
M=cv2.getAffineTransform(pts1,pts2)
dst=cv2.warpAffine(img,M,(cols,rows))
plt.subplot(12,plt.imshow(img),plt.title('input'))
plt.subplot(12,plt.imshow(img),plt.title('output'))
plt.show()

透视变换

  1. 视角变换:需求 3*3变换矩阵。在图上找4个点,以及其在输出图像上对应位置。任意三点不能共线。cv2.getPerspectiveTransform(),传值cv2.warpPerspective()。

代码演示

# coding=utf8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('123.jpg')
rows,cols,ch=img.shape
pts1=np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2=np.float32([[0,0],[300,0],[0,300],[300,300]])
M=cv2.getPerspectiveTransform(pts1,pts2)
dst=cv2.warpAffine(img,M,(300,300))
plt.subplot(121,plt.imshow(img),plt.title('xiaoyin'))
plt.subplot(121,plt.imshow(img),plt.title('hhh'))
plt.show()

1
未知错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值