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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
python和ruby,我选谁?
Sep 13 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
Django rest framework基本介绍与代码示例
Jan 26 Python
使用Django和Python创建Json response的方法
Mar 26 Python
基于Django与ajax之间的json传输方法
May 29 Python
python实现音乐下载的统计
Jun 20 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 Python
Python数据库小程序源代码
Sep 15 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 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
基于MySQL到MongoDB简易对照表的详解
2013/06/03 PHP
PHP代码优化之成员变量获取速度对比
2014/02/28 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
浅谈js数组和splice的用法
2016/12/04 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
jquery实现侧边栏左右伸缩效果的示例
2017/12/19 jQuery
JavaScript迭代器的含义及用法
2019/06/21 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
python基础教程之面向对象的一些概念
2014/08/29 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
Python如何生成树形图案
2018/01/03 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
python2.7实现爬虫网页数据
2018/05/25 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
jupyter notebook插入本地图片的实现
2020/04/13 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
Super-Pharm波兰:药房和香水在一个地方
2020/08/18 全球购物
戴森比利时官方网站:Dyson BE
2020/10/03 全球购物
设计模式的基本要素是什么
2014/04/21 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
十岁生日父母答谢词
2014/01/18 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
Python中的pprint模块
2021/11/27 Python