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中for循环的使用方法
May 14 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
带你认识Django
Jan 15 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
Python实现多进程的四种方式
Feb 22 Python
Python数据类型之List列表实例详解
May 08 Python
Django 表单模型选择框如何使用分组
May 16 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
Apr 27 Python
通用的Django注册功能模块实现方法
Feb 05 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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与SQL注入攻击[一]
2007/04/17 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
3种不同方式的焦点图轮播特效分享
2013/10/30 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
基于javascript处理nginx请求过程详解
2020/07/07 Javascript
vue 出现data-v-xxx的原因及解决
2020/08/04 Javascript
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python科学画图代码分享
2017/11/29 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
2017/12/09 Python
windows环境下tensorflow安装过程详解
2018/03/30 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
财务与信息服务专业推荐信
2013/11/28 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
班级团队活动方案
2014/08/14 职场文书
校园广播稿100字
2014/10/06 职场文书
学生打架检讨书
2014/10/20 职场文书
2016年学校招生广告语
2016/01/28 职场文书
oracle重置序列从0开始递增1
2022/02/28 Oracle
vue实现列表拖拽排序的示例代码
2022/04/08 Vue.js
Win11跳过联网界面创建本地管理账户的3种方法
2022/04/20 数码科技
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python