python前视图转换为俯视图

Python019

python前视图转换为俯视图,第1张

想要把前视图转化为鸟瞰图,有两种做法

1.在没有标定的情况下,只能选取四个点对了

在有标定的情况下,可以直接使用标定的参数

这里主要介绍1

1.没有标定的情况下,主要用到了两个函数

M = cv2.getPerspectiveTransform(src, dst)

warped = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0] + 1080))

cv2.getPerspectiveTransform 从四个点对中计算透视变换,返回值为3*3的透视变换矩阵

cv2.warpPerspective 计算透视变换后的图像

这里自己遇到的坑是,在计算透视变换矩阵的时候,怎么获取那四个点对,翻了很多blog,都没搞清,最后认认真真的找了一个认认真真的阅读之后,总算摸到门道了,有了一种融会贯通的感觉。

现在的目标是将图像由前视图转化为鸟瞰图,根据先验知识,在鸟瞰图下,长方形物体显示出来肯定是长方形,因此,我们只要在前视图中找到一个正方形的物体,并指定他在俯视图中的坐标就可以了,这里有个但是,由于先验信息里面只有矩形这个信息,具体的长宽比什么的,以及实际的大小未知,所以转化到鸟瞰图下并不能反应物体的真实长度。

这里怎么定义转化后的坐标要自己把握

790ec7dc8aa1

原图

比如说转化到黄色的坐标(内接矩形),这时候就会内缩,图像出现黑边

790ec7dc8aa1

转化到黄色坐标

如果转化到蓝色的,那么能看到的方位就很小了,只有当前车道了(外接矩形)

790ec7dc8aa1

转化到蓝色坐标

dst的坐标也可以自己写,想要转成多大的图像也可以自己填

比如说根据车道的宽度和虚线的长度,可以大概估算出实际长宽比,一个车道宽度为3.75米 这种城市道路一般虚线是两米,间隔4米(高速一般是69,也就是15米)大概估计一下,高度是12米,也就是说长宽比为12:7,想要显示出4个车道,图像的宽度为1920,折算了一下,目标图像的坐标大概是(这里要注意,图像的坐标是从左上角开始算的)

790ec7dc8aa1

自定义

坐标定义代码:

src = np.float32([(1242,1949),(1961,1949), (2695, 2542), (133, 2542)])

#内接矩形

dst = np.float32([(1242, 1949), (1961, 1949), (1961, 2542), (1242, 2542)])

#外接矩形

dst = np.float32([(132, 1949), (2695, 1949), (2695, 2542), (133, 2542)])

#自定义

dst = np.float32([(480,1560-1080), (1440,1560-1080), (1440,3096-1080), (480,3096-1080)])

2.使用标定参数来转化

这个转化就是真实的了,因为知道相机的内参,还有相机的pitch角以及相机距离地面的高度

matlab里面转的,要标定的参数

可以参考的透视变换

上一节介绍了如何openCV的透视转换方法的应用,并构建了一个基于给定四角点转换鸟瞰图的方法函数,这一节将继续这个运用,通过查找边缘的方法实现自动转换的功能。 实现步骤实际上很简单,只需要三步: 第一步:查找文档的边缘 第二步:通过边缘查找文档轮廓并找到四个角点的坐标 第三步:使用透视转换函数完成图像转换 下面的代码基于openCV/python的版本:openCV2.4/3+, python2.7/3+ 上一章节我们完成了transform.py模块的构建,我们将在接下来的涉及图像四角点处理的问题中均会使用到。打开你的python编辑器,创建一个新的文档,并命名为scan.py。 接下来就是第一步:边缘查找: 测试一下效果: shell虽然背景有点不干净但是文档的边缘还是很明显的,接下来我们想办法查找文档的边缘并生成轮廓。 第二步:寻找轮廓: 事实上,在构建文档扫描器时,有一个非常重要的前提:扫描仪只是在一张纸上扫描。一张纸被假定为长方形,矩形有四条边。因此,我们可以创建一个简单的方法来帮助我们构建文档扫描器。我们假设图像中最大的轮廓恰好有四个点,这就是我们要扫描的那张纸。这也是一个相当安全的假设——当然,也可以人为的给定文档轮廓。 运行一下代码测试效果:shell中输入正如您所看到的,我们已经成功地利用边缘检测图像找到了文档的轮廓(outline),我的收据周围的绿色矩形显示了轮廓(outline)。最后,让我们进入步骤3,这将是用到four_point_transform函数。 第三步:转换图像:构建移动文档扫描器的最后一步是取代表文档大纲的四个点,并应用透视图转换来获得自顶向下的图像“鸟瞰图”。 我们将把两个参数传递给four_point_transform:第一个参数是我们从磁盘加载的原始图像(不是调整大小的图像),第二个参数是表示文档的轮廓线,乘以调整大小的比例。 你可能会想,为什么要乘以调整后的比例? 我们乘以调整后的比例,因为我们进行了边缘检测,在调整后的高度=500像素的图像上发现了轮廓。但是,我们希望对原始图像进行扫描,而不是对调整大小的图像进行扫描,因此我们将轮廓点乘以调整大小的比例。 为了获得图像的黑白感觉,我们将扭曲后的图像转换为灰度图像,并应用自适应阈值。 好的,我们来运行一下效果: shell好了,到目前为止,扫描图像到文档提取鸟瞰图的过程实现完成了。遗留问题: 实际上这个程序还有不少地方需要你的改进,比如要求转换的文档本身是规则的四边形,拍摄时尽量放在对比度明显的桌面背景,这样做的目的是为了避免边缘查找时出现多于四边的情况,多于四边的边缘后续轮廓查找会出现问题。也就是找不到合适的四边轮廓来匹配。 解决方案:可以采用人工标注四个角点的方式来提取轮廓更为可靠。因为在实际应用场景往往是不规则的文档。下一节我们来探讨这个方案实现过程。

用rhino画三点圆的方法

首先打开rhino,找到圆工具集合。其中就有三点圆工具,点击它。在俯视图界面点击鼠标,确定第一个点的位置。在主视图界面确定第二个点的位置。在左视图界面里面确定第三个点的位置。这样,三点圆就绘制完成了。

选中曲线,然后F10,就可以显示三点圆的控制点,可以拖动改变圆的位置和形状。

END

用python实现

用下面的python代码,可以绘制三个点,并画出对应的三点圆。

rs.AddCircle3Pt([0,0,0],[0,1,10],[2,3,6])

当三点共线的时候,程序会报错,因为不能作出这个三点圆。

rs.AddCircle3Pt([0,0,0],[0,1,10],[0,2,20])