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中http请求方法库汇总
Jan 06 Python
利用Python开发微信支付的注意事项
Aug 19 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Python3模拟curl发送post请求操作示例
May 03 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
linux环境中没有网络怎么下载python
Jul 07 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
python使用ctypes调用扩展模块的实例方法
Jan 28 Python
Python爬虫后获取重定向url的两种方法
Jan 19 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 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面向对象分析设计的经验原则
2008/09/20 PHP
php 日期时间处理函数小结
2009/12/18 PHP
让的PHP代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
JavaScript实现给按钮加上双重动作的方法
2015/08/14 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
JS实现canvas简单小画板功能
2020/06/23 Javascript
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
2018/08/10 Python
python利用proxybroker构建爬虫免费IP代理池的实现
2021/02/21 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
公司年会抽奖活动主持词
2014/03/31 职场文书
合作经营协议书范本
2014/04/17 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
学生个人总结范文
2015/02/15 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android
生命的关键成分来自太空?陨石说是的
2022/04/29 数码科技