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的迭代器与生成器实例详解
Jul 16 Python
Python学习笔记之os模块使用总结
Nov 03 Python
Python实现包含min函数的栈
Apr 29 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
Python爬虫爬取一个网页上的图片地址实例代码
Jan 16 Python
python 识别图片中的文字信息方法
May 10 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
Python hexstring-list-str之间的转换方法
Jun 12 Python
python scipy卷积运算的实现方法
Sep 16 Python
Python3常用内置方法代码实例
Nov 18 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 Python
python学习之panda数据分析核心支持库
May 07 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入门速成教程
2007/03/19 PHP
探讨php中header的用法详解
2013/06/07 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
PHP查询分页的实现代码
2017/06/09 PHP
js获取单选按钮的数据
2006/11/27 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
node基于async/await对mysql进行封装
2019/06/20 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python实现的计数排序算法示例
2017/11/29 Python
Python中的元组介绍
2019/01/28 Python
详解Python装饰器
2019/03/25 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python获取一个用户名的组ID过程解析
2019/09/03 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
CSS3为背景图设置遮罩并解决遮罩样式继承问题
2020/06/22 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
3个CCIE对一个工程师的面试题
2012/05/06 面试题
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
大学生优秀的自我评价分享
2013/10/22 职场文书
祖国在我心中演讲稿
2014/01/15 职场文书
小学庆六一活动方案
2014/02/28 职场文书
年终晚会主持词
2014/03/25 职场文书
房产买卖委托公证书
2014/04/04 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
java泛型通配符详解
2021/07/25 Java/Android