Opencv-Python图像透视变换cv2.warpPerspective的示例


Posted in Python onApril 11, 2019

Opencv-Python图像透视变换cv2.warpPerspective

代码如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np
import sys
img = cv2.imread('test.jpg')
# 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
r = 0
def rad(x):
  return x * np.pi / 180
def get_warpR():
  global anglex,angley,anglez,fov,w,h,r
  # 镜头与图像间的距离,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)
  return warpR
def control():
  global anglex,angley,anglez,fov,r
  # 键盘控制
  if 27 == c: # Esc quit
    sys.exit()
  if c == ord('w'):
    anglex += 1
  if c == ord('s'):
    anglex -= 1
  if c == ord('a'):
    angley += 1
    print(angley)
    # 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('e'):
    print("======================================")
    print('Rotation Matrix:')
    print(r)
    print('angle alpha(anglex):')
    print(anglex)
    print('angle beta(angley):')
    print(angley)
    print('dz(anglez):')
    print(anglez)
while True:
  warpR = get_warpR()
  result = cv2.warpPerspective(img, warpR, (h, w))
  cv2.namedWindow('result',2)
  cv2.imshow("result", result)
  c = cv2.waitKey(30)
  control()
cv2.destroyAllWindows()

运行效果:

Opencv-Python图像透视变换cv2.warpPerspective的示例

控制:

  • s控制垂直方向上的形变
  • a和d控制水平方向上的行变
  • u和p控制角度旋转
  • e 输出当前旋转矩阵参数

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
python的dataframe转换为多维矩阵的方法
Apr 11 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
Python Numpy库安装与基本操作示例
Jan 08 Python
Django REST framework视图的用法
Jan 16 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
python 内置函数汇总详解
Sep 16 Python
python 链接sqlserver 写接口实例
Mar 11 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
python 抓取知乎指定回答下视频的方法
Jul 09 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 #Python
详解python执行shell脚本创建用户及相关操作
Apr 11 #Python
python中aioysql(异步操作MySQL)的方法
Apr 11 #Python
很酷的python表白工具 你喜欢我吗
Apr 11 #Python
2019 Python最新面试题及答案16道题
Apr 11 #Python
【python】matplotlib动态显示详解
Apr 11 #Python
python爬虫之验证码篇3-滑动验证码识别技术
Apr 11 #Python
You might like
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
轮播图组件js代码
2016/08/08 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
2016/12/20 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
Python中的类学习笔记
2014/09/23 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
Python学习之用pygal画世界地图实例
2017/12/07 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
施华洛世奇韩国官网:SWAROVSKI韩国
2018/06/05 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
捐书寄语赠言
2014/01/18 职场文书
采购意向书范本
2014/03/31 职场文书
教师个人自我剖析材料
2014/09/29 职场文书
毕业生个人总结
2015/02/28 职场文书
2015年高考寄语或鼓励的话
2015/03/23 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
六年级数学教学反思
2016/02/16 职场文书
2016年幼儿园教研活动总结
2016/04/05 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android
HTML怎么设置下划线?html文字加下划线方法
2021/12/06 HTML / CSS
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server
windows server2012 R2下安装PaddleOCR服务的的详细步骤
2022/09/23 Servers