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


Posted in Python onJanuary 12, 2018

本文主要分享的是一则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, 200, 200, 200, 200, cv2.BORDER_CONSTANT, 0)
w, h = img.shape[0:2]

anglex = 0
angley = 30
anglez = 0 #是旋转
fov = 42
while 1:
  # 镜头与图像间的距离,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)

  result = cv2.warpPerspective(img, warpR, (h, w))
  cv2.imshow("result", result)
  c = cv2.waitKey(30)

  # anglex += 3      #auto rotate
  # anglez += 1       #auto rotate
  # angley += 2      #auto rotate

  # 键盘控制
  if 27 == c: # Esc quit
    break;
  if c == ord('w'):
    anglex += 1
  if c == ord('s'):
    anglex -= 1
  if c == ord('a'):
    angley += 1
    # 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('q'):
    print("======================================")
    print('旋转矩阵:\n', r)
    print("angle alpha: ", anglex, 'angle beta: ', angley, "dz: ", anglez, ": ", z)

cv2.destroyAllWindows()

总结

以上就是本文关于python opencv实现任意角度的透视变换实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python调用短信猫控件实现发短信功能实例
Jul 04 Python
深入源码解析Python中的对象与类型
Dec 11 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
Python应用领域和就业形势分析总结
May 14 Python
python pygame实现方向键控制小球
May 17 Python
解决yum对python依赖版本问题
Jul 05 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
详解Python中第三方库Faker
Sep 25 Python
python pymysql库的常用操作
Oct 16 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 Python
Manjaro、pip、conda更换国内源的方法
Nov 17 Python
Python数字图像处理之霍夫线变换实现详解
Jan 12 #Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 #Python
微信跳一跳python自动代码解读1.0
Jan 12 #Python
Tornado 多进程实现分析详解
Jan 12 #Python
快速了解Python相对导入
Jan 12 #Python
Python实现翻转数组功能示例
Jan 12 #Python
Python实现求数列和的方法示例
Jan 12 #Python
You might like
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
php计算年龄精准到年月日
2015/11/17 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
封装的原生javascript弹出层代码
2010/09/24 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
2014/05/20 Javascript
对比分析json及XML
2014/11/28 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
连接Python程序与MySQL的教程
2015/04/29 Python
用Python编写web API的教程
2015/04/30 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
分享一下如何编写高效且优雅的 Python 代码
2017/09/07 Python
python使用opencv驱动摄像头的方法
2018/08/03 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
python list数据等间隔抽取并新建list存储的例子
2019/11/27 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
使用Python实现微信拍一拍功能的思路代码
2020/07/09 Python
计算机开发个人求职信范文
2013/09/26 职场文书
中职应届生会计求职信
2013/10/23 职场文书
写好求职信第一句话的技巧
2013/10/26 职场文书
学校欢迎标语
2014/06/18 职场文书
家庭财产分割协议范文
2014/11/24 职场文书
在职证明格式样本
2015/06/15 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书