<强>一,需求分析强>
首先是需求:
1,利用OpenCV里面的仿射变换函数实现对图像进行一些基本的变换,如平移,旋转,缩放
2、学习透视变换原理,对一个矩形进行透视变换,并将变换结果绘制出来。先调用OpenCV函数实现透视变换,自己编写代码实现透视变换。
3、识别一张倾斜拍摄的纸张,找出轮廓,提取出该纸张的位置
4、假设你已通过图像处理的算法找到发生形变的纸张的位置,那么对这个倾斜纸张进行变换,得到纸张的垂直视图,实现文档校准。
然后是分析:
1,首先要调用OpenCV的函数对图像进行平移,旋转,缩放变换,然后要进行仿射变换和透视变换。
2、编程实现仿射变换和透视变换,注意到仿射变换是透视变换的一种,因此只需实现透视变换
3,实现文档校准:
(1)滤波。考虑到文档中的字(噪点),同时采用均值滤波和闭运算滤波。
(2)边缘提取。利用库函数提取边缘信息
(3)边缘识别。利用经典霍夫变换,获得边界方程,并且计算出文档的四个角的坐标
(4)透视变换。调用库函数,实现文档校准
5,由于前三个需求与最后一个需求的源码放在同一个工程中显得不合适,因此,我将前三个需求的代码和注释放在了工程:作业2 _2中,开发环境是win10 vs2017, openCV3.43
<强>二,实现强>
注意:
以下的函数全部写在标头. h文件中,要在主要在中调用标头。h文件中的函数才能完成功能
还有就是图片输入的路径要改好。
1,工程:作业2 _2的实现
(1)调用OpenCV内的函数,编写了一个main_transform函数,在主函数调用它,输入图片后,同时将图片缩小,平移,旋转,透视和仿射变换,并且将图片展示和保存下来(实际上后来OpenCV的仿射,透视我注释掉了,不用它自带的函数了)
都是直接调用函数,没什么好说的。
下面分别是旋转,透视,平移,缩小,仿射的效果图:
(2)手动实现仿射,透视变换函数toushibianhuan和toushibianhuan_gai_fangshebianhuan,并在main_transform中调用他们。
注意到仿射变换是透视变换的特殊情况,因此只要实现了透视就可以实现仿射。
首先使用getPerspectiveTransform来获取变换矩阵,然后看透视函数
toushibianhuan函数需要三个输入参数:
-
<李>第一个参数:透视变换输入的图像矩阵,垫李>
<李>第二个参数:输出图像容器矩阵,垫李>
<李>第三个参数:变换矩阵,垫
李>
进入函数后,首先定义出一个位置矩阵position_maxtri用以刻画变换前图像的位置,利用矩阵元素积,乘以变换矩阵后算出变换后的四个角的位置矩阵。
用最大值、最小值函数计算出图像最高点,最低的点,进而算出图像的高和宽
然后,重点来了,定义,更新计算出两个重映射矩阵.Map1是从原图的x→新图x的映射,Map2是从原图y→新图y的映射。
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 版权(C), 2018 - - - - - -, HUST刘 文件名称:image_solve.h 作者:刘峻源版本:1日期:2018.10.3 ------------------------------------------------------------------------------------------------------------------ 描述: 文档矫正项目. cpp的主要函数储存在这里 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 函数说明:comMatC用于连接矩阵 toushibianhuan_gai_fangshebianhuan用于仿射变换 toushibianhuan用于仿射变换 main_transform调用函数来处理图像,包括平移,缩小,旋转,仿射变换和透视变换 input_solve用以矫正文档,包括打开图像,滤波,提取边缘,绘制边缘,透视变换矫正文档 -------------------------------------------------------------------------------- 其他:没有 功能列表:comMatC、toushibianhuan toushibianhuan_gai_fangshebianhuan input_solve -------------------------------------------------------------------------------- 历史:没有 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *//* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 标准openCV开头— 引用头文件和命名空间— - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */# include & lt; opencv2/opencv.hpp> # include & lt; iostream> # include & lt; opencv2/highgui/highgui.hpp> # include & lt; opencv2/imgproc/imgproc.hpp> # include & lt; imgproc.hpp> 使用名称空间性病; 使用名称空间的简历;/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 功能:comMatC 描述:上下连接矩阵,并输出 -------------------------------------------------------------------------------- 电话:创建、copyTo 称为:main_transform 表访问:没有 表更新:没有 -------------------------------------------------------------------------------- 输入: 第一个参数:上面的矩阵,垫子上 第二个参数:下面的矩阵,垫子上 第三个参数:连接后的输出容器,垫子上 输出:输出连接后的矩阵 返回:输出矩阵 其他:列数不一致会报的错! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */垫comMatC(垫Matrix1垫Matrix2,垫子,MatrixCom) { CV_Assert (Matrix1。关口==Matrix2.cols); MatrixCom.create (Matrix1。行+ Matrix2。行,Matrix1。关口,Matrix1.type ()); 垫temp=MatrixCom。rowRange (0, Matrix1.rows); Matrix1.copyTo(临时); 垫temp1=MatrixCom.rowRange (Matrix1。行,Matrix1。行+ Matrix2.rows); Matrix2.copyTo (temp1); 返回MatrixCom; }/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 功能:toushibianhuan 描述:实现透视变换功能,将input_image按tp_Transform_maxtri矩阵变换后输出至另一图像容器中 ------------------------------------------------------------------------------- 电话:最大值、最小值 称为:main_transform 表访问:没有 表更新:没有 ---------------------------------------------------------------------------------- 输入: 第一个参数:透视变换输入的图像矩阵,垫子上 第二个参数:输出图像容器矩阵,垫子上 第三个参数:变换矩阵,垫子上 输出:无返回值。在控制台上打印出原图的位置矩阵,变换后的图像坐标矩阵,变换矩阵 返回:无 其他:没有 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */空白toushibianhuan(垫input_image垫和输出,垫tp_Translater_maxtri) { int qiu_max_flag; int j; int我;//定义顶点位置矩阵 垫position_maxtri (3、4、CV_64FC1标量(1)); position_maxtri。在& lt;双祝辞(0,0)=0; position_maxtri。在& lt;双祝辞(1,0)=0; position_maxtri。在& lt;双祝辞(1,1)=0; position_maxtri。在& lt;双祝辞(0,2)=0; position_maxtri。在& lt;双祝辞(1、2)=input_image.rows; position_maxtri。在& lt;双祝辞(0,3)=input_image.cols; position_maxtri。在& lt;双祝辞(1、3)=input_image.rows; null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null nullOpenCV实现图像校正功能