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中逻辑运算符的使用
May 13 Python
Python的MongoDB模块PyMongo操作方法集锦
Jan 05 Python
简述:我为什么选择Python而不是Matlab和R语言
Nov 14 Python
Python读取MRI并显示为灰度图像实例代码
Jan 03 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 Python
查看Python依赖包及其版本号信息的方法
Aug 13 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
基于nexus3配置Python仓库过程详解
Jun 15 Python
Django Form设置文本框为readonly操作
Jul 03 Python
如何利用Python实现一个论文降重工具
Jul 09 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中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
yepnope.js使用详解及示例分享
2014/06/23 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
常用python数据类型转换函数总结
2014/03/11 Python
Python实现的Excel文件读写类
2015/07/30 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
基于Django实现日志记录报错信息
2019/12/17 Python
构建高效的python requests长连接池详解
2020/05/02 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
python time()的实例用法
2020/11/03 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
兼职业务员岗位职责
2014/01/01 职场文书
遗失说明具结保证书
2015/02/26 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
海底两万里读书笔记
2015/06/26 职场文书