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 相关文章推荐
Django学习笔记之Class-Based-View
Feb 15 Python
Python实现基于C/S架构的聊天室功能详解
Jul 07 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
python实现图片筛选程序
Oct 24 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
Django在pycharm下修改默认启动端口的方法
Jul 26 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
Python目录和文件处理总结详解
Sep 02 Python
Pandas-Cookbook 时间戳处理方式
Dec 07 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
Django执行源生mysql语句实现过程解析
Nov 12 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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
福利彩票幸运号码自动生成器
2006/10/09 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
php获取开始与结束日期之间所有日期的方法
2016/11/29 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
JavaScript 高级语法介绍
2009/06/15 Javascript
让你的网站可编辑的实现js代码
2009/10/19 Javascript
解决jquery1.9不支持browser对象的问题
2013/11/13 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
2015/08/05 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
Vue.js实现价格计算器功能
2020/03/30 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
[47:03]完美世界DOTA2联赛PWL S3 access vs LBZS 第一场 12.20
2020/12/23 DOTA
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
在python3.5中使用OpenCV的实例讲解
2018/04/02 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
大学新生入学教育方案
2014/05/16 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
西柏坡导游词
2015/02/05 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
Pytorch实现图像识别之数字识别(附详细注释)
2021/05/11 Python