基于Deepsocial做社交安全距离监测时,先使用目标检测器检测出画面中的行人,然后建立从摄像机—透视图到逆透视—鸟瞰图的坐标映射,将摄像机拍摄画面中的行人坐标转换为鸟瞰图上的坐标,从而计算行人之间的距离。
先看一下原图:

想要把透视图转化为鸟瞰图,有两种做法:
1.在没有标定的情况下,只能选取四个点对
2.在有标定的情况下,可以直接使用标定的参数**
先不讲理论细节,先看第一个方法,直接看opencv的操作(使用图片Deepsocial使用的视频图片,以及Deepsocial中的标定坐标),首先需要以下条件:
1、在摄像机拍摄的图像上,比如在960*540的图像上选取四个角点,例如:

# 左上角、右上角、左下角、右下角
source = np.float32([[0, 0],[960, 0], [0, 540], [960,540]]

如图所示:

2、测量出四个点的实际坐标,例如:

target = np.float32([[180,162],[618,0],[552,540],[682,464]])

测量方式如下:
(待考究!!!)

先看一下转换后的鸟瞰图:

具体过程如下:
1、上述角点设置完毕后,通过pts1、pts2求出透视变换矩阵:
cv2.getPerspectiveTransform(source, target) 通过变换前后的四点坐标关系,获取透视变换的变换矩阵。
参数 source 为原图片中的四点坐标
参数 target 为目标图片中的四点坐标
数据格式如: [(x1,y1), (x2,y2),(x3,y3),(x4,y4)]

M = cv2.getPerspectiveTransform(source, target)

2、cv2.warpPerspective(image, M, dsize, flags, borderMode, borderValue) 依据变换矩阵 M 对图像 image 做透视变换:
参数 image 输入图像
参数 M变换矩阵
参数 dsize 变换后的目标图片大小, 元素顺序为 (width, height)
参数 flags 插值方式,cv2.INTER_LINEAR 或 cv2.INTER_NEAREST
参数 borderMode 边界补偿模式,cv2.BORDER_CONSTANT 或 cv2.BORDER_REPLICATE
参数 borderValue 边界补偿值,默认为0

warp_img = cv2.warpPerspective(image, M, (width, height), cv2.INTER_LINEAR ,cv2.BORDER_REPLICATE)

3、cv2.perspectiveTransform(point, M) 依据变换矩阵 M 对点 p 做透视变换,得到透视变换后的点坐标;
参数 point 原坐标点,如 (x,y)
参数 M 变换矩阵

#二维变三维, float型,
point = point.reshape(-1, 1, 2).astype(np.float32)
new_points = cv2.perspectiveTransform(points, trans_mat)

整体代码如下:

# -*- coding: utf-8 -*-
"""
Time    : 2022/5/27 10:12
Author  : cong
"""
import cv2
import numpy as np
#读入图片
img = cv2.imread('1.jpg')
H, W = img.shape[:2]
width = W
height = H# 原图中的四个角点pts1(对应好即可,左上、右上、左下、右下),与变换后矩阵位置pts2
pts1 = np.float32([[0, 0], [width, 0], [0, height], [width, height]])
# pts2 = np.float32([[180, 162], [618, 0], [552, 540], [682, 464]])
pts2 = np.float32([[180, 162], [618, 0], [552, 540], [682, 464]])# 生成透视变换矩阵;
## 说明获取逆透视变换矩阵函数各参数含义 ;src:源图像中待测矩形的四点坐标;  sdt:目标图像中矩形的四点坐标
# cv2.getPerspectiveTransform(src, dst) → retvalM = cv2.getPerspectiveTransform(pts1, pts2)
print(M)# cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
# src:输入图像;   M:变换矩阵;    dsize:目标图像shape;    flags:插值方式,interpolation方法INTER_LINEAR或INTER_NEAREST;
# borderMode:边界补偿方式,BORDER_CONSTANT or BORDER_REPLICATE;   borderValue:边界补偿大小,常值,默认为0
dst = cv2.warpPerspective(img, M, (width, height), cv2.INTER_LINEAR)#显示图片
for i in range(4):cv2.circle(img, (int(pts1[i][0]), int(pts1[i][1])), 10, (0, 0, 255), -1)
cv2.imwrite('ori_img.jpg', img)cv2.imshow("img", img)for i in range(4):cv2.circle(dst, (int(pts2[i][0]), int(pts2[i][1])), 10, (0, 0, 255), -1)
cv2.imshow("dst", dst)cv2.imwrite('wrap.jpg', dst)
cv2.waitKey(0)
#二维变三维, float型,
point = np.array([0,0])
point = point.reshape(-1, 1, 2).astype(np.float32)
new_points = cv2.perspectiveTransform(point, M)

参考链接:
https://blog.csdn.net/weixin_39863759/article/details/112115966
https://www.cnblogs.com/rabitvision/p/14044150.html

逆透视变换IPM:将摄像机拍摄的图片转换为鸟瞰图相关推荐

  1. 逆透视变换(IPM)多种方式及代码总结

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 来源丨古月居 作者丨lovely_yoshino 1.背景 在自动/辅助驾驶中,车道线的检测非常重要. ...

  2. 逆透视变换IPM模型

    公众号致力于分享点云处理,SLAM,三维视觉,高精地图相关的文章与技术,欢迎各位加入我们,一起每交流一起进步,有兴趣的可联系微信:920177957.本文来自点云PCL博主的分享,未经作者允许请勿转载 ...

  3. 逆透视变换车道线检测

    摘要 随着社会的进步和发展,安全驾驶和汽车的简便操作越来越受到人们的重视.苹果.谷歌和特斯拉等公司相继推出了无人驾驶系统,国内的厂商也对此领域产生了高度兴趣.基于人工智能和大数据的无人驾驶技术,被认为 ...

  4. 【智能驾驶】车道线检测中的新IPM(逆透视变换)算法实验效果

    1.实验内容 在车道保持LKA功能实现时,需要对车道线进行精准检测:①.计算曲率半径,②.保证测距精度.因此需要对相机的透视图persImg进行IPM逆透视变换,得到俯视图birdImg,在birdI ...

  5. IPM逆透视变换问题(1):Vanish Point

    IPM逆透视变换问题(1):Vanish Point !!!重要提醒:首先确定坐标系朝向,简化步骤必须做出说明. 1. 坐标系 world coord [x-right,y-front,z-up] c ...

  6. IPM逆透视变换问题(2):Image --> Ground

    IPM逆透视变换问题(2):Image --> Ground 1. 如果前置条件如下: 坐标系坐标系定义为:世界(右-前-上),相机(右-下-前),像素(右-下): 旋转角度表示为:绕zzz轴为 ...

  7. 消失点计算逆透视变换(IPM)

    当我们看火车轨道的时候总在某个距离上看到两条轨道重合到一起后消失. 原图四个点选择: 下面的代码是智能驾驶系统项目中的源码,这里把Opencv中的接口稍微封装了一下,其中有些与透视变换无关的参数,可以 ...

  8. 基于自适应逆透视变换的车道线SLAM

    公众号致力于分享点云处理,SLAM,三维视觉,高精地图相关的文章与技术,欢迎各位加入我们,一起每交流一起进步,有兴趣的可联系微信:920177957.本文来自点云PCL博主的分享,未经作者允许请勿转载 ...

  9. 逆透视变换与SIFT算法

    1. 逆透视变换(Inverse Perspective Mapping -- IPM) 后续会补充逆透视变换的名词和原理的解析. 在自动/辅助驾驶中,车道线的检测非常重要.在前视摄像头拍摄的图像中, ...

最新文章

  1. 她92年的,27岁,当上浙大博导。
  2. 科研助力|计算机科学方向一对一科研项目
  3. ROCK 聚类算法‏
  4. php 格式化 sub,PHP DateTime sub()用法及代码示例
  5. codeforce 457DIV2 C题
  6. 关于《停止学习框架》 - 讨论
  7. 带你入门HTML+CSS网页设计,编写网页代码的思路
  8. 太原计算机专业学校在哪里,太原信息技术学校在哪里
  9. 选择适合esx服务器的性能,VMWare ESX Server性能调整
  10. 3D激光雷达SLAM算法学习02——3D激光雷达传感器
  11. 《三体1》7.三体1、周文王、长夜
  12. 一行命令查看Linux系统重启时间和相关记录
  13. 1.5极限存在准则和重要极限
  14. 宋晓丽20190912-1 每周例行报告
  15. RN终止所有节点进程并启动npm服务器命令
  16. 一文说清 GIS、GPS、RS、LBS 区别与联系
  17. 世界上最好用的免费动态数码相册
  18. 10年嵌入式工程师总结的Bug调试经验
  19. Spring Cloud Alibaba (一) 之Nacos
  20. c语言单片机字符串,51单片机的C语言数字和字符串互相转化的详细资料说明

热门文章

  1. 夸克浏览器触屏模式开启de方法
  2. 代码随想录day9|实现strStr()、重复的子字符串
  3. LeetCode 127. 单词接龙(C++)*
  4. React.js读书与总结:《react-tutorial》
  5. 关于tensorly中的unfold
  6. 《增长黑客》的背后逻辑是什么?(二)
  7. OCaml语言开发(1)
  8. 拉丁方阵C语言csdn,C语言:拉丁方阵
  9. 实战小例子 | 经典坦克大战的python实现
  10. ado.net/dapper 的多sql语句执行的疑惑