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操作excel文件的实例代码
Oct 15 Python
基于python 处理中文路径的终极解决方法
Apr 12 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
Apr 20 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
python中eval与int的区别浅析
Aug 11 Python
pytorch使用指定GPU训练的实例
Aug 19 Python
Python Django 封装分页成通用的模块详解
Aug 21 Python
使用python实现回文数的四种方法小结
Nov 24 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
Pycharm配置lua编译环境过程图解
Nov 28 Python
Python代码实现双链表
May 25 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
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
javascript 二进制运算技巧解析
2012/11/27 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
iframe实用操作锦集
2014/04/22 Javascript
JavaScript限定图片显示大小的方法
2015/03/11 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
JS实现的抛物线运动效果示例
2018/01/30 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
Centos7 安装Node.js10以上版本的方法步骤
2019/10/15 Javascript
[02:31]《DAC最前线》之选手酒店现场花絮
2015/01/30 DOTA
Python sys.path详细介绍
2013/10/17 Python
python微信跳一跳游戏辅助代码解析
2018/01/29 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
Pytorch的mean和std调查实例
2020/01/02 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
python 制作网站小说下载器
2021/02/20 Python
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
教育孩子心得体会
2014/01/01 职场文书
代理商会议邀请函
2014/01/27 职场文书
军训学生自我鉴定
2014/02/12 职场文书
学校与家长安全责任书
2014/07/23 职场文书
装修施工安全责任书
2014/07/24 职场文书
党组织领导班子整改方案
2014/10/25 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
同乡会致辞
2015/07/30 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
导游词之秦皇岛燕塞湖
2020/01/03 职场文书