Opencv-Python图像透视变换cv2.warpPerspective的示例

Opencv-Python图像透视变换cv2.warpPerspective

代码如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np
import sys
img = cv2.imread('test.jpg')
# cv2.imshow("original", img)
# 可选,扩展图像,保证内容不超出可视范围
img = cv2.copyMakeBorder(img, 200, 200, 200, 200, cv2.BORDER_CONSTANT, 0)
w, h = img.shape[0:2]
anglex = 0
angley = 30
anglez = 0 # 是旋转
fov = 42
r = 0
def rad(x):
  return x * np.pi / 180
def get_warpR():
  global anglex,angley,anglez,fov,w,h,r
  # 镜头与图像间的距离,21为半可视角,算z的距离是为了保证在此可视角度下恰好显示整幅图像
  z = np.sqrt(w ** 2 + h ** 2) / 2 / np.tan(rad(fov / 2))
  # 齐次变换矩阵
  rx = np.array([[1, 0, 0, 0],
          [0, np.cos(rad(anglex)), -np.sin(rad(anglex)), 0],
          [0, -np.sin(rad(anglex)), np.cos(rad(anglex)), 0, ],
          [0, 0, 0, 1]], np.float32)
  ry = np.array([[np.cos(rad(angley)), 0, np.sin(rad(angley)), 0],
          [0, 1, 0, 0],
          [-np.sin(rad(angley)), 0, np.cos(rad(angley)), 0, ],
          [0, 0, 0, 1]], np.float32)
  rz = np.array([[np.cos(rad(anglez)), np.sin(rad(anglez)), 0, 0],
          [-np.sin(rad(anglez)), np.cos(rad(anglez)), 0, 0],
          [0, 0, 1, 0],
          [0, 0, 0, 1]], np.float32)
  r = rx.dot(ry).dot(rz)
  # 四对点的生成
  pcenter = np.array([h / 2, w / 2, 0, 0], np.float32)
  p1 = np.array([0, 0, 0, 0], np.float32) - pcenter
  p2 = np.array([w, 0, 0, 0], np.float32) - pcenter
  p3 = np.array([0, h, 0, 0], np.float32) - pcenter
  p4 = np.array([w, h, 0, 0], np.float32) - pcenter
  dst1 = r.dot(p1)
  dst2 = r.dot(p2)
  dst3 = r.dot(p3)
  dst4 = r.dot(p4)
  list_dst = [dst1, dst2, dst3, dst4]
  org = np.array([[0, 0],
          [w, 0],
          [0, h],
          [w, h]], np.float32)
  dst = np.zeros((4, 2), np.float32)
  # 投影至成像平面
  for i in range(4):
    dst[i, 0] = list_dst[i][0] * z / (z - list_dst[i][2]) + pcenter[0]
    dst[i, 1] = list_dst[i][1] * z / (z - list_dst[i][2]) + pcenter[1]
  warpR = cv2.getPerspectiveTransform(org, dst)
  return warpR
def control():
  global anglex,angley,anglez,fov,r
  # 键盘控制
  if 27 == c: # Esc quit
    sys.exit()
  if c == ord('w'):
    anglex += 1
  if c == ord('s'):
    anglex -= 1
  if c == ord('a'):
    angley += 1
    print(angley)
    # dx=0
  if c == ord('d'):
    angley -= 1
  if c == ord('u'):
    anglez += 1
  if c == ord('p'):
    anglez -= 1
  if c == ord('t'):
    fov += 1
  if c == ord('r'):
    fov -= 1
  if c == ord(' '):
    anglex = angley = anglez = 0
  if c == ord('e'):
    print("======================================")
    print('Rotation Matrix:')
    print(r)
    print('angle alpha(anglex):')
    print(anglex)
    print('angle beta(angley):')
    print(angley)
    print('dz(anglez):')
    print(anglez)
while True:
  warpR = get_warpR()
  result = cv2.warpPerspective(img, warpR, (h, w))
  cv2.namedWindow('result',2)
  cv2.imshow("result", result)
  c = cv2.waitKey(30)
  control()
cv2.destroyAllWindows()

运行效果:

控制:

  • s控制垂直方向上的形变
  • a和d控制水平方向上的行变
  • u和p控制角度旋转
  • e 输出当前旋转矩阵参数

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • python opencv实现任意角度的透视变换实例代码

    本文主要分享的是一则python+opencv实现任意角度的透视变换的实例,具体如下: # -*- coding:utf-8 -*- import cv2 import numpy as np def rad(x): return x * np.pi / 180 img = cv2.imread("6.jfif") cv2.imshow("original", img) # 扩展图像,保证内容不超出可视范围 img = cv2.copyMakeBorder(img,

  • Opencv透视变换综合实例详解

    本文实例为大家分享了Opencv透视变换综合实例的具体代码,供大家参考,具体内容如下 案例背景:对下面发生畸变的图像进行校正 方案思路:灰度二值化分割,闭操作,寻找轮廓,霍夫直线检测,直线排序,直线方程,直线交点,透视矩阵,透视变换. #include<opencv2\opencv.hpp> using namespace cv; using namespace std; int main(int arc, char** argv) { Mat src = imread("1.jpg

  • Opencv实现对象提取与测量

    本文实例为大家分享了Opencv3实现对象提取与测量的具体代码,供大家参考,具体内容如下 案例背景:下图为一张卫星拍摄的图片,要获取其中岛屿的周长和面积 方案思路:高斯模糊去噪,灰度二值化提取轮廓,闭操作填充缝隙 或小的孔洞,寻找轮廓,通过轮廓特征选择轮廓 #include<opencv2\opencv.hpp> using namespace cv; using namespace std; int main(int arc, char** argv) { Mat src = imread(

  • OpenCV图像几何变换之透视变换

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1. 基本原理 透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为: (u,v)为原始图像像素坐标,(x=x'/w',y=y'/w')为变换之后的图像像素坐标.透视变换矩阵图解如下: 仿射变换(Affine Transformation)可以理解为透视变换的特殊形式.透视变换的数学表达式为: 所以,给定透视变换对应的四对像素点坐标,即可求得透视变

  • Opencv-Python图像透视变换cv2.warpPerspective的示例

    Opencv-Python图像透视变换cv2.warpPerspective 代码如下: # -*- coding:utf-8 -*- import cv2 import numpy as np import sys img = cv2.imread('test.jpg') # cv2.imshow("original", img) # 可选,扩展图像,保证内容不超出可视范围 img = cv2.copyMakeBorder(img, 200, 200, 200, 200, cv2.B

  • opencv python图像梯度实例详解

    这篇文章主要介绍了opencv python图像梯度实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一阶导数与Soble算子 二阶导数与拉普拉斯算子 图像边缘: Soble算子: 二阶导数: 拉普拉斯算子: import cv2 as cv import numpy as np # 图像梯度(由x,y方向上的偏导数和偏移构成),有一阶导数(sobel算子)和二阶导数(Laplace算子) # 用于求解图像边缘,一阶的极大值,二阶的零点

  • OpenCV+python实现膨胀和腐蚀的示例

    1,概念及原理: 膨胀(Dilating) (或) (1)将图像 A 与任意形状的内核 (B),通常为正方形或圆形,进行卷积. (2)内核 B 有一个可定义的 锚点, 通常定义为内核中心点. (3)进行膨胀操作时,将内核 B 划过图像A,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素.显然,这一最大化操作将会导致图像中的亮区开始"扩展" (因此有了术语膨胀 dilation ). 以3*3的内核为例: 腐蚀(Eroding) (与) (1)腐蚀在形态学操作家族里是膨胀操作的

  • Opencv python 图片生成视频的方法示例

    本文主要介绍了Opencv图片生成视频,分享给大家,具体如下: 生成视频 import random as rd import cv2 as cv import numpy as np # 保存视频 class RecordMovie(object): def __init__(self, img_width, img_height): self.video_writer = None # 视频对象 self.is_end = False # 结束保存视频 self.img_width = im

  • Python图像的增强处理操作示例【基于ImageEnhance类】

    本文实例讲述了Python图像的增强处理操作.分享给大家供大家参考,具体如下: python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,不仅可以增强(或减弱)图像的亮度.对比度.色度,还可以用于增强图像的锐度. 具体见下面的例子: #-*- coding: UTF-8 -*- from PIL import Image from PIL import ImageEnhance #原始图像 image = Image.open('lena.jpg') imag

  • opencv python 图像轮廓/检测轮廓/绘制轮廓的方法

    图像的轮廓检测,如计算多边形外界.形状毕竟.计算感兴趣区域等. Contours : Getting Started 轮廓 简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度. 轮廓是形状分析和物体检测和识别的有用工具 NOTE 为获得更好的准确性,请使用二值图,在找到轮廓之前,应用阈值法或canny边缘检测 从OpenCV 3.2开始,findContours()不再修改源图像,而是将修改后的图像作为三个返回参数中的第一个返回 在OpenCV中,查找轮廓是从黑色背景中查找白色对

  • Opencv+Python实现图像运动模糊和高斯模糊的示例

    运动模糊:由于相机和物体之间的相对运动造成的模糊,又称为动态模糊 Opencv+Python实现运动模糊,主要用到的函数是cv2.filter2D(): # coding: utf-8 import numpy as np import cv2 def motion_blur(image, degree=12, angle=45): image = np.array(image) # 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高 M = cv2.getRotat

  • OpenCV+Python几何变换的实现示例

    几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内.有缩放.翻转.仿射变换.透视.重映射等操作. 1 缩放 使用cv2.resize()函数实现对图像的缩放,但要注意cv2.resize()函数内的dsize参数与原图像的行列属性是相反的,也就是:目标图像的行数是原始图像的列数,目标图像的列数是原始图像的行数. 下面举例说明cv2.resize()函数的用法: import cv2 img=cv2.imread('E:/python_opencv/tupian.jpg') rows,col

  • Python+OpenCV实现图像的全景拼接

    本文实例为大家分享了Python+OpenCV实现图像的全景拼接的具体代码,供大家参考,具体内容如下 环境:python3.5.2 + openCV3.4 1.算法目的 将两张相同场景的场景图片进行全景拼接. 2.算法步骤 本算法基本步骤有以下几步: 步骤1:将图形先进行桶形矫正 没有进行桶形变换的图片效果可能会像以下这样: 图片越多拼接可能就会越夸张. 本算法是将图片进行桶形矫正.目的就是来缩减透视变换(Homography)之后图片产生的变形,从而使拼接图片变得畸形. 步骤2:特征点匹配 本

  • 基于Python和openCV实现图像的全景拼接详细步骤

    基本介绍 图像的全景拼接,即"缝合"两张具有重叠区域的图来创建一张全景图.其中用到了计算机视觉和图像处理技术有:关键点检测.局部不变特征.关键点匹配.RANSAC(Random Sample Consensus,随机采样一致性)和透视变形. 具体步骤 (1)检测左右两张图像的SIFT关键特征点,并提取局部不变特征 : (2)使用knnMatch检测来自右图(左图)的SIFT特征,与左图(右图)进行匹配 : (3)计算视角变换矩阵H,用变换矩阵H对右图进行扭曲变换: (4)将左图(右图)

随机推荐