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获得图片base64编码示例
Jan 16 Python
Django中使用group_by的方法
May 26 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
分析python切片原理和方法
Dec 19 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
详解Python使用Plotly绘图工具,绘制甘特图
Apr 02 Python
PyQt5 实现给窗口设置背景图片的方法
Jun 13 Python
解决python 上传图片限制格式问题
Oct 30 Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
Apr 05 Python
python函数的两种嵌套方法使用
Apr 02 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
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
php猜单词游戏
2015/09/29 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
laravel邮件发送的实现代码示例
2020/01/31 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
javascript写的一个链表实现代码
2009/10/25 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
vue mounted组件的使用
2018/06/18 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
Python新手实现2048小游戏
2015/03/31 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
Python3实现的判断环形链表算法示例
2019/03/07 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
python datetime中strptime用法详解
2019/08/29 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
Django websocket原理及功能实现代码
2020/11/14 Python
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
员工薪酬福利制度
2014/01/17 职场文书
法制教育演讲稿
2014/09/10 职场文书
中学生2014国庆节演讲稿:不屈的民族
2014/09/21 职场文书
优秀团员自我评价
2015/03/10 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
消防宣传标语大全
2015/08/03 职场文书
信息技术课教学反思
2016/02/23 职场文书