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的Django框架上部署ORM库的教程
Apr 20 Python
python psutil库安装教程
Mar 19 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
Python开发网站目录扫描器的实现
Feb 21 Python
Python实现插入排序和选择排序的方法
May 12 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
python 一个figure上显示多个图像的实例
Jul 08 Python
分享PyCharm的几个使用技巧
Nov 10 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
Python调用JavaScript代码的方法
Oct 27 Python
Python中的xlrd模块使用整理
Jun 15 Python
Python函数式编程中itertools模块详解
Sep 15 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
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
php简单的会话类代码
2011/08/08 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
JavaScript基本对象
2007/01/11 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
深入理解关于javascript中apply()和call()方法的区别
2016/04/12 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
JS实现简单的右下角弹出提示窗口完整实例
2016/06/21 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
[34:41]夜魇凡尔赛茶话会 第二期02:你画我猜
2021/03/11 DOTA
python让图片按照exif信息里的创建时间进行排序的方法
2015/03/16 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
2016/06/30 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
Python遍历numpy数组的实例
2018/04/04 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
python如何编写win程序
2020/06/08 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
财务副总经理工作职责
2013/11/25 职场文书
工作表现评语
2014/01/19 职场文书
策划创业计划书
2014/02/06 职场文书
旅游市场营销方案
2014/03/09 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js