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 struct.unpack
Sep 06 Python
python3.3教程之模拟百度登陆代码分享
Jan 16 Python
Python迭代器和生成器介绍
Mar 06 Python
Python设计模式之抽象工厂模式
Aug 25 Python
对python:循环定义多个变量的实例详解
Jan 20 Python
python pytest进阶之fixture详解
Jun 27 Python
python基于socket实现的UDP及TCP通讯功能示例
Nov 01 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
python 负数取模运算实例
Jun 03 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
用pushplus+python监控亚马逊到货动态推送微信
Jan 29 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
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
ThinkPHP5.1的权限控制怎么写?分享一个AUTH权限控制
2021/03/09 PHP
[JS]点出统计器
2020/10/11 Javascript
javascript Excel操作知识点
2009/04/24 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
js密码强度校验
2015/11/10 Javascript
jq stop()和:is(:animated)的用法及区别(详解)
2017/02/12 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
分析javascript中9 个常见错误阻碍你进步
2017/09/18 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
Python读写ini文件的方法
2015/05/28 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
python 中文件输入输出及os模块对文件系统的操作方法
2018/08/27 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
Python深拷贝与浅拷贝用法实例分析
2019/05/05 Python
python里dict变成list实例方法
2019/06/26 Python
Django框架视图介绍与使用详解
2019/07/18 Python
python实现经纬度采样的示例代码
2020/12/10 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
澳洲本土太阳镜品牌:Quay Australia
2019/07/29 全球购物
喷漆工的岗位职责
2014/03/17 职场文书
运动会400米加油稿(8篇)
2014/09/22 职场文书
个人职业及收入证明
2014/10/13 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书
施工安全责任协议书
2016/03/23 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers