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 相关文章推荐
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
python机器学习之神经网络(三)
Dec 20 Python
Python Tkinter实现简易计算器功能
Jan 30 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 Python
简单了解django索引的相关知识
Jul 17 Python
Mac安装python3的方法步骤
Aug 09 Python
django商品分类及商品数据建模实例详解
Jan 03 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
Django实现前台上传并显示图片功能
May 29 Python
Python 程序员必须掌握的日志记录
Aug 17 Python
Pycharm Git 设置方法
Sep 15 Python
python3 os进行嵌套操作的实例讲解
Nov 19 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常量的详解
2013/06/09 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
Java中final关键字详解
2015/08/10 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
JS实现根据当前文字选择返回被选中的文字
2014/05/21 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
JS实现静态页面搜索并高亮显示功能完整示例
2017/09/19 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
Python中if __name__ == "__main__"详细解释
2014/10/21 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
Python实现控制台进度条功能
2016/01/04 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
拉丁舞学习者的自我评价
2013/10/27 职场文书
会计电算化专业毕业生自荐信
2013/12/20 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
上课迟到检讨书
2014/02/19 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
学生打架检讨书
2014/10/20 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
旅游投诉信范文
2015/07/02 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书