openCV进阶之二:自动校准扫描图像生成鸟瞰图

openCV进阶之二:自动校准扫描图像生成鸟瞰图,第1张

上一节介绍了如何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

好了,到目前为止,扫描图像到文档提取鸟瞰图的过程实现完成了。遗留问题:

实际上这个程序还有不少地方需要你的改进,比如要求转换的文档本身是规则的四边形,拍摄时尽量放在对比度明显的桌面背景,这样做的目的是为了避免边缘查找时出现多于四边的情况,多于四边的边缘后续轮廓查找会出现问题。也就是找不到合适的四边轮廓来匹配。

解决方案:可以采用人工标注四个角点的方式来提取轮廓更为可靠。因为在实际应用场景往往是不规则的文档。下一节我们来探讨这个方案实现过程。

(一) opencv里面摄像机标定计算内参数矩阵用的是张正友标定法,非常经典,MATLAB标定工具箱也是用的该方法。具体的标定过程可以参见张正友的原文: http://research.microsoft.com/en-us/um/people/zhang/Papers/TR98-71.pdf。或者参考博文:http://hi.baidu.com/chb_seaok/item/62179235eef8873c2e20c40b

(二) 基于opencv的摄像机标定用的主要函数有:

cvFindChessboardCorners:提取一幅图片上的所有角点。

cvFindCornerSubPix:亚像素精确化。

cvDrawChessboardCorners:显示角点。

cvCalibrateCamera2:标定摄像机参数,求出内参数矩阵,畸变系数,旋转向量和平移向量。

校正主要用的函数有2个:

cvInitUndistortMap:根据cvCalibrateCamera2计算出来的内参数矩阵和畸变系数计算畸变映射。

cvRemap:根据畸变映射校正图像。

(三)详细的过程及参考书籍:

1、《基于OpenCV的计算机视觉技术实现》 陈胜勇,刘盛编著 科学出版社,2008;(该书用OpenCV 1.0库,第14章详细介绍如何用opencv进行摄像机标定,包括摄像机标定的原理,opencv相关库函数详细的介绍以及例子)

2、《学习OpenCV(中文版)》拍桐 于仕琪译 清华大学出版社,2009;(OpenCV 2.0库,第11、12章详细介绍如何进行摄纳李像机标定以及三维重建)

3、OpenCV的标定参数中,对于镜头畸变采用的方法是Brown博士在71年发表的文章中提到的。

(四)MATLAB标定也在这里提一下:

http://www.vision.caltech.edu/bouguetj/calib_doc/index.html#examples,该网站有很详细的使用说明

matlab标定工具箱来进行标定,它也是基于张正友的平面标定方法的,有误差分析、标定结果三维重建、重投影计算角点等功能 。

Matlab中的镜头畸变参数采用基于Heikkil博士提出的方法,将非线性干扰因素引入到内外参数的求解过程。标定的过程需要手动选取四个角点,标定图片拍摄的多的话,比较麻烦。

(五)实验袭茄坦结果

自己买了个手机鱼眼镜头,拍摄了16幅标定板图片。注意拍摄的角度不要和成像平面平行。

示例程序049--摄像机标定和鱼眼校正


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12400181.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存