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


Posted in Python onApril 11, 2019

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()

运行效果:

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

控制:

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

总结

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

Python 相关文章推荐
python检查指定文件是否存在的方法
Jul 06 Python
Python的Django框架安装全攻略
Jul 15 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
Python自定义线程池实现方法分析
Feb 07 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
flask session组件的使用示例
Dec 25 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Python Collatz序列实现过程解析
Oct 12 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
Python 如何在字符串中插入变量
Aug 01 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 #Python
详解python执行shell脚本创建用户及相关操作
Apr 11 #Python
python中aioysql(异步操作MySQL)的方法
Apr 11 #Python
很酷的python表白工具 你喜欢我吗
Apr 11 #Python
2019 Python最新面试题及答案16道题
Apr 11 #Python
【python】matplotlib动态显示详解
Apr 11 #Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 #Python
You might like
php中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
在浏览器中获取当前执行的脚本文件名的代码
2011/07/19 Javascript
简单实用jquery版三级联动select示例
2013/07/04 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
js实现轮播图的两种方式(构造函数、面向对象)
2017/09/30 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
浅谈关于iview表单验证的问题
2018/09/29 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
如何使用Python破解ZIP或RAR压缩文件密码
2020/01/09 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
夏威夷灵感服装及配饰:Reyn Spooner
2018/09/18 全球购物
手工制作的意大利皮革运动鞋:KOIO
2020/01/05 全球购物
应届生护士求职信
2013/11/01 职场文书
一名女生的自荐信
2013/12/08 职场文书
yy司仪主持词
2014/03/22 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2014年个人委托书范本
2014/10/13 职场文书
销售员态度差检讨书
2014/10/26 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
新员工入职感言范文!
2019/07/04 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技