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之赋值,简单也不简单
Sep 24 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
Jun 14 Python
python使用zip将list转为json的方法
Dec 31 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
python入门之基础语法学习笔记
Feb 08 Python
基于Python测试程序是否有错误
May 16 Python
Python自带的IDE在哪里
Jul 01 Python
python绘制雷达图实例讲解
Jan 03 Python
python blinker 信号库
May 04 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
文件上传类
2006/10/09 PHP
php中的MVC模式运用技巧
2007/05/03 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
JavaScript获取图片的原始尺寸以宽度为例
2014/05/04 Javascript
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
Bootstrap中定制LESS-颜色及导航条(推荐)
2016/11/21 Javascript
详解js的六大数据类型
2016/12/27 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
Python实现网站文件的全备份和差异备份
2014/11/30 Python
总结Python编程中三条常用的技巧
2015/05/11 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
Python获取统计自己的qq群成员信息的方法
2019/11/15 Python
Python socket聊天脚本代码实例
2020/01/02 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
Expedia泰国:预订机票、酒店和旅游包(航班+酒店)
2016/09/27 全球购物
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
数学专业毕业生自荐信
2013/11/10 职场文书
国际贸易专业求职信
2014/06/04 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
给老婆的保证书
2015/01/16 职场文书
个人简历求职信范文
2015/03/20 职场文书
全国助残日活动总结
2015/05/11 职场文书
干部培训工作总结2015
2015/05/25 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript