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中的元类编程入门指引
Apr 15 Python
python中利用队列asyncio.Queue进行通讯详解
Sep 10 Python
Python中执行存储过程及获取存储过程返回值的方法
Oct 07 Python
Python列表解析配合if else的方法
Jun 23 Python
python操作日志的封装方法(两种方法)
May 23 Python
Django项目中使用JWT的实现代码
Nov 04 Python
pandas实现将日期转换成timestamp
Dec 07 Python
Python生成器传参数及返回值原理解析
Jul 22 Python
Python3合并两个有序数组代码实例
Aug 11 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
python实现股票历史数据可视化分析案例
Jun 10 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
Apr 28 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
IIS6的PHP最佳配置方法
2007/03/19 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
dojo随手记 gird组件引用
2011/02/24 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
JS中的进制转换以及作用
2016/06/26 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
Vue组件模板的几种书写形式(3种)
2020/02/19 Javascript
Linux下Python获取IP地址的代码
2014/11/30 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
Python利用Django如何写restful api接口详解
2018/06/08 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
python实现ip代理池功能示例
2019/07/05 Python
GWT都有什么特性
2016/12/02 面试题
办理房产过户的委托书
2014/09/14 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
Z-Order加速Hudi大规模数据集方案分析
2022/03/31 Servers
尝试使用Python爬取城市租房信息
2022/04/12 Python