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和php通信乱码问题解决方法
Apr 15 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
python用opencv批量截取图像指定区域的方法
Jan 24 Python
python实现杨氏矩阵查找
Mar 02 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
浅析Django中关于session的使用
Dec 30 Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
pycharm 关掉syntax检查操作
Jun 09 Python
python如何查看安装了的模块
Jun 23 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 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
Dedecms常用函数解析
2008/02/01 PHP
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php join函数应用
2011/05/04 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
Js+XML 操作
2006/09/20 Javascript
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
window.onload使用指南
2015/09/13 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
ES6函数和数组用法实例分析
2020/05/23 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
python 字典(dict)按键和值排序
2016/06/28 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
python groupby 函数 as_index详解
2019/12/16 Python
pytorch之添加BN的实现
2020/01/06 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
几个常见的软件测试问题
2016/09/07 面试题
求职自荐书范文
2013/12/04 职场文书
施工资料员岗位职责
2014/01/06 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
村党支部书记四风问题个人对照检查材料思想汇报
2014/10/06 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫
Java版 单机五子棋
2022/05/04 Java/Android