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实现调用其他python脚本的方法
Oct 05 Python
Python写的一个简单监控系统
Jun 19 Python
Python增量循环删除MySQL表数据的方法
Sep 23 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
python3人脸识别的两种方法
Apr 25 Python
python使用flask与js进行前后台交互的例子
Jul 19 Python
python gdal安装与简单使用
Aug 01 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
Python2手动安装更新pip过程实例解析
Jul 16 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 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
提问的智慧
2006/10/09 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
laravel清除视图缓存的代码
2019/10/23 PHP
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
2015/01/01 NodeJs
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
jQuery满意度星级评价插件特效代码分享
2015/08/19 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
基于BootStrap实现简洁注册界面
2017/07/20 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
中药学自荐信
2014/06/15 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
导游词之海南天涯海角
2019/12/05 职场文书