图像处理之逆透视变换
- 格式:ppt
- 大小:139.00 KB
- 文档页数:54
ipm特征空间转换方法
IPM(逆透视映射)是一种用于消除透视效应的变换方法,也称为逆透视。
其核心思想是将一个平面投影到另一个平面,从而消除透视效应。
IPM特征空间转换方法的基本步骤如下:
1. 确定输入和输出平面:选择要进行投影变换的输入平面和输出平面,通常是地图或传感器图像平面。
2. 确定投影变换参数:使用至少四个对应点对,不能有三点及以上共线,不需要知道摄相机参数或者平面位置的任何信息。
通过求解透视变换矩阵,可以确定投影变换参数。
3. 进行投影变换:利用确定的投影变换参数,将输入平面的图像投影到输出平面。
这一步可以使用仿射变换或者单应性变换来实现。
4. 特征提取:在输出平面上提取图像特征,包括边缘、角点、纹理等。
这些特征可以用于识别、匹配等任务。
5. 匹配与识别:将提取的特征与已知特征进行匹配和识别,以实现目标检测、跟踪、识别等功能。
IPM特征空间转换方法具有简单、快速、适用于复杂场景等优点,广泛应用于智能交通、自动驾驶、机器人等领域。
自适应逆透视变换(IPM)算法自适应逆透视变换(IPM)算法作为计算机视觉和图像处理领域的重要技术,近年来备受关注。
它是一种能够校正图像透视失真、实现几何校正的算法,对于实时道路检测、智能驾驶等领域具有重要意义。
本文将从IPM算法的原理、实现和应用等方面进行全面探讨,希望能帮助读者深入理解并掌握这一重要的技术。
一、IPM算法原理简介IPM算法是一种通过对图像进行逆透视变换,将图像中的平行线转化为平行线,从而校正图像透视失真的算法。
它主要包括摄像机标定、透视转换和透视矩阵计算等步骤。
在摄像机标定过程中,需要确定摄像机的内参和外参,以便后续的透视转换。
透视转换则是通过透视矩阵将原始图像中的像素映射到校正后的图像中,实现透视校正的效果。
透视矩阵的计算则是通过对摄像机的内参和外参进行运算得到,包括了相机矩阵、旋转矩阵和平移矩阵等。
通过这些步骤,IPM算法能够有效地校正图像的透视失真,提高图像的几何质量和视觉效果。
二、IPM算法实现与优化在实际应用中,IPM算法需要考虑图像质量、处理速度和算法稳定性等方面的问题。
为了实现高质量的透视校正,需要对摄像机进行精确的标定,以提供准确的内参和外参参数。
在透视转换的过程中,需要考虑到图像的畸变问题,对图像进行去畸变处理,以获得更准确的透视校正效果。
另外,为了提高算法的处理速度,可以采用GPU加速、多线程并行处理等技术,以实现实时的透视校正效果。
对于算法的稳定性和鲁棒性也需要进行充分的考虑,避免图像噪声、光照变化等因素对算法的影响,以提高算法的适用性和稳定性。
三、IPM算法在智能驾驶中的应用随着智能驾驶技术的发展,IPM算法在这一领域的应用也变得越来越重要。
通过IPM算法可以实现对车辆周围环境的实时监测和分析,包括道路标识的识别、车道线的检测等。
通过逆透视变换,可以将车载摄像头捕获的图像校正为鸟瞰图,提供更直观、更清晰的道路信息。
这对于提高自动驾驶系统的环境感知能力、实现智能驾驶和车辆自主导航具有重要意义。
IPM逆透射变换介绍IPM(Inverse Perspective Mapping)逆透射变换是一种在计算机视觉中常用的技术,用于将车辆驾驶员视角下的图像转换为鸟瞰图。
通过逆透射变换,可以更好地理解场景并进行车辆控制、目标检测等任务。
本文将介绍IPM逆透射变换的原理和实现方法,以及如何使用Python代码实现。
原理逆透射变换的原理是通过将视角下的图像映射到鸟瞰图上,从而消除透视畸变。
透视畸变是由于相机与物体之间的距离不同而导致的图像形变现象。
通过将图像进行逆透射变换,可以将图像中的平行线变为平行线,从而更好地理解场景。
逆透射变换的过程如下:1.确定逆透射变换的目标区域,即鸟瞰图的大小和位置。
2.根据相机内参和外参,计算透视变换矩阵。
3.对于输入图像的每个像素点,通过透视变换矩阵计算其在鸟瞰图中的对应位置。
4.根据计算得到的对应位置,将像素值从输入图像复制到鸟瞰图中的对应位置。
实现下面是使用Python代码实现IPM逆透射变换的示例:import cv2import numpy as npdef ipm_inverse_transform(image, src_points, dst_points, output_size): # 计算透视变换矩阵M = cv2.getPerspectiveTransform(src_points, dst_points)# 进行逆透射变换ipm_image = cv2.warpPerspective(image, M, output_size, flags=cv2.INTER_LIN EAR)return ipm_image# 读取输入图像image = cv2.imread('input_image.jpg')# 定义逆透射变换的目标区域output_size = (400, 600)dst_points = np.float32([[0, 0], [output_size[0], 0], [output_size[0], output_ size[1]], [0, output_size[1]]])# 定义视角下的四个点src_points = np.float32([[100, 200], [500, 200], [700, 400], [0, 400]])# 进行逆透射变换ipm_image = ipm_inverse_transform(image, src_points, dst_points, output_size)# 显示结果cv2.imshow('Input Image', image)cv2.imshow('IPM Image', ipm_image)cv2.waitKey(0)cv2.destroyAllWindows()在上述代码中,首先通过cv2.getPerspectiveTransform()函数计算透视变换矩阵M,然后使用cv2.warpPerspective()函数进行逆透射变换,得到鸟瞰图ipm_image。
Python 车道线逆透视变换一、概述车道线检测是自动驾驶技术中的重要一环,通过对车道线的检测可以帮助自动驾驶车辆保持在正确的车道行驶,提高行驶的安全性和稳定性。
逆透视变换是一种常用的图像处理技术,可以对图像进行修正和校正,使得车道线的检测更加准确和可靠。
本文将介绍如何使用Python进行车道线的逆透视变换。
二、透视变换简介透视变换是一种将平面上的图像投影到另一个平面上的变换方法。
在车道线检测中,透视变换常常被用来将道路的图像投影到一个新的视角下,从而可以更好地检测车道线的位置和形状。
逆透视变换则是透视变换的逆过程,可以将投影过的图像恢复到原始的视角下。
三、逆透视变换的原理逆透视变换的原理是通过寻找透视变换的逆变换矩阵来实现的。
逆变换矩阵可以将投影到新平面上的图像恢复到原始平面上。
在实际应用中,可以使用OpenCV库提供的函数来计算逆变换矩阵,并对图像进行逆透视变换。
四、使用Python进行逆透视变换的步骤1. 导入所需的库在进行逆透视变换之前,首先需要导入所需的库,包括NumPy、OpenCV和Matplotlib等。
这些库可以帮助我们完成图像的处理和显示。
2. 读取图像使用OpenCV库的函数读取待处理的图像文件,并将其转换为灰度图像。
灰度图像可以减少计算量,加快处理速度。
3. 计算逆变换矩阵使用OpenCV库的函数计算逆变换矩阵,该矩阵可以将投影到新平面上的图像投影恢复到原始平面。
通过实验和调整参数,可以找到最合适的逆变换矩阵。
4. 对图像进行逆透视变换使用OpenCV库的函数对图像进行逆透视变换,将投影到新平面上的图像恢复到原始平面上。
通过逆透视变换,可以更加清晰地显示车道线的位置和形状。
5. 显示处理结果使用Matplotlib库的函数将处理后的图像显示出来,可以直观地观察逆透视变换的效果。
通过调整参数和算法,可以得到更加准确和可靠的车道线检测结果。
五、结论逆透视变换是一种常用的图像处理技术,可以帮助我们更加准确地检测车道线的位置和形状。
逆透视变换ipm原理
逆透视变换(Inverse Perspective Mapping,简称IPM)是一种用于纠正图像中的透视畸变的技术。
在摄影学中,透视畸变是由于观察点与拍摄物体之间的相对位置引起的。
当观察点位于离物体很近的位置时,物体的上部分会显得比下部分更加窄小,造成所谓的“倾斜效应”。
IPM原理是通过将原始图像进行透视反变换,使得物体的上部分与下部分保持相同的比例和大小。
具体步骤如下:
1. 首先需要确定摄像头与物体之间的相对位置和角度关系。
这可以通过标定摄像头参数,如焦距、投影矩阵等来实现。
2. 计算透视变换矩阵,这可以通过使用透视变换的参数以及图像的宽度和高度计算得出。
3. 对图像进行透视反变换,将图像中的每个像素点从透视投影到平面上。
这可以通过将透视变换矩阵应用于每个像素点的坐标来实现。
4. 最后,对反变换后的图像进行裁剪和缩放操作,以得到最终的纠正透视畸变后的图像。
逆透视变换通常用于计算机视觉和自动驾驶领域中,以纠正车辆前方摄像头的透视畸变,以便更准确地进行距离估计和目标检测。
逆透视变换原理
逆透视变换是一种图像处理技术,它可以将一个透视变换后的图像恢复到原始的平面视图中。
透视变换是由于摄像机成像的特性而产生的,当物体离摄像机较远时,其投影在图像上较小,当物体离摄像机较近时,其投影在图像上较大。
这种投影变换可以通过逆透视变换来逆转。
逆透视变换的原理是根据透视变换的几何关系来计算逆变换矩阵,然后将逆变换矩阵应用于透视变换后的图像上,从而恢复到原始的平面视图中。
逆变换矩阵的计算涉及到摄像机的内部参数和外部参数,例如摄像机的焦距、相机与物体的距离等。
通过这些参数,可以计算出透视变换矩阵的逆矩阵,从而实现逆透视变换。
逆透视变换在许多应用中具有广泛的应用。
例如,在计算机视觉领域,逆透视变换可以用于校正摄像机捕捉的实际场景图像,使其恢复到原始的平面视图中。
在增强现实中,逆透视变换可以用于将虚拟对象与实际场景进行融合,使其看起来更加真实。
此外,逆透视变换还可以在图像处理和计算机图形学中用于消除透视投影引起的畸变、校正图像的透视变形等。
总结而言,逆透视变换是一种将透视变换后的图像恢复到原始平面视图的图像处理技术。
其原理是根据透视变换的几何关系计算逆变换矩阵,然后将逆变换矩阵应用于透视变换后的图像上。
逆透视变换在许多应用中具有广泛的应用,并且在计算机视觉、增强现实以及图像处理和计算机图形学中发挥着重要作用。
基于逆透视投影变换的图像拼接方法
袁启平;宋金泽;吴涛
【期刊名称】《微计算机信息》
【年(卷),期】2010(026)021
【摘要】为了得到大视角图像较好的拼接效果,本文提出了一种新的图像拼接方法.该方法利用逆透视投影变换的方法解决了大视角图像间视差过大的问题,利用多分辨率匹配来提高图像匹配速度,利用选取特征区域的方法来提高模板匹配的精度.实验证明了该方法能有效解决简单环境下大视角图像的拼接问题.
【总页数】3页(P208-210)
【作者】袁启平;宋金泽;吴涛
【作者单位】410073,湖南长沙,国防科学技术大学;410073,湖南长沙,国防科学技术大学;410073,湖南长沙,国防科学技术大学
【正文语种】中文
【中图分类】TP391
【相关文献】
1.一种基于改良逆投影变换的道路斑马线识别方法 [J], 王一丁;徐超
2.动态图像逆透视映射方法在路面图像拼接中的应用 [J], 曹毓;冯莹;魏立安;雷兵;王彦辉
3.基于逆透视变换的车辆排队长度检测方法及硬件实现 [J], 王闯;贺莹
4.基于约束逼近投影变换的全景图像拼接方法 [J], 余清洲;陈水利;蔡国榕;苏松志;
吴云东
5.一种基于逆透视变换的车道线检测方法 [J], 李海华;万热华;陈小玲;范娟
因版权原因,仅展示原文概要,查看原文内容请购买。
专利名称:一种基于逆透视变换的图像获取方法及装置专利类型:发明专利
发明人:杨帅
申请号:CN201910449877.1
申请日:20190528
公开号:CN112017246A
公开日:
20201201
专利内容由知识产权出版社提供
摘要:公开了一种基于逆透视变换的图像获取方法、装置、计算机可读存储介质及电子设备,该方法包括:获取至少一帧图像的特征点的像素坐标;根据所述特征点的像素坐标和初始相机参数,获取所述特征点的初始空间坐标;根据所述特征点的像素坐标和所述特征点的初始空间坐标,获得经过优化的相机参数;根据所述至少一帧图像的像素坐标和经过优化的相机参数,获取所述至少一帧图像的空间坐标,以获得所述至少一帧图像对应的逆透视变换图像。
本公开的技术方案充分考虑了汽车行驶过程中的状态变化以及路况变化等对相机参数的影响,对相机参数进行优化,根据优化后的相机参数获得逆透视变换图像,从而使得所获得的逆透视变换图像更加准确。
申请人:北京地平线机器人技术研发有限公司
地址:100086 北京市海淀区中关村大街1号3层318
国籍:CN
代理机构:北京嘉科知识产权代理事务所(特殊普通合伙)
代理人:杨波
更多信息请下载全文后查看。
opencv 逆透视变换原理
逆透视变换(inverse perspective transform)也称为鱼眼矫正,
是指将透视变换后的图像还原成原始视角的图像。
在计算机视觉中,逆透视变换被广泛应用于自动驾驶、机器人导航等领域。
逆透视变换的实现要用到相机模型和坐标变换。
相机模型可以描述相机的内参(标定矩阵、畸变参数等)和外参(相机的位置和姿态等),而坐标变换则可以将图像坐标转换为世界坐标或相机坐标。
具体来说,逆透视变换的实现步骤如下:
1. 读取原始图像,并提取感兴趣区域(ROI)。
2. 根据相机模型,计算出透视变换矩阵。
3. 对ROI进行逆透视变换。
4. 使用缩放和平移等操作将变换后的ROI放回原始图像的位置。
5. 将整张图像中不相关的区域填充为黑色,从而得到逆透视变换后的图像。
逆透视变换的原理比较复杂,需要涉及到很多数学知识和图像处理技术。
但是,OpenCV提供了丰富的函数和类库,使得开
发者可以快速地实现逆透视变换,并将其应用于各种实际应用场景中。
透视变换:改变图像角度和视角透视变换是一种强大的图像处理技术,可以改变图像的角度和视角,使得平面上的物体在图像中呈现出不同的透视效果。
PhotoShop软件提供了丰富的工具和功能,可以帮助我们进行透视变换,下面我将介绍其中一种常用的方法。
首先,打开你想要进行透视变换的图像。
确保你已经熟悉了PhotoShop的基本操作,包括打开图片、选择工具和调整图层等。
1. 选择“矩形选框工具”或者“多边形选框工具”。
在工具栏中找到这两个工具,并选择其中一个。
这些工具将帮助我们选择图像中需要进行透视变换的区域。
2. 在图像中选择一个矩形或多边形区域,该区域应该是你想要进行透视变换的物体或场景。
确保你选择的区域尽可能准确地包围了你想要调整的部分。
3. 在菜单栏中选择“编辑”>“变换”>“透视”。
这将打开“透视变换”对话框,其中包含了透视变换的各种控制选项和调整参数。
4. 在透视变换对话框中,你将看到一个四个角点的网格。
这些角点可以用来调整图像的角度和视角。
你可以点击并拖动这些角点来调整图像的形状和大小。
5. 调整角点的位置,直到你满意为止。
你可以通过拖动角点来改变图像的倾斜度和透视效果。
根据你的需求,你可以将角点拉伸或收缩,使图像呈现出不同的透视形状。
6. 完成角点的调整后,点击对话框右上角的“确定”按钮,以应用透视变换。
你会发现图像的角度和视角已经发生了改变。
透视变换是一种非常有用的功能,可以用于许多不同的应用,比如改变图像的观察角度、修复倾斜的建筑物或者扭曲的物体等等。
通过合理地利用这个功能,你可以轻松地改变图像的角度和视角,使其看起来更加逼真和立体。
尽管这只是透视变换的基本操作,但相信通过这个简单的教程,你已经掌握了如何在PhotoShop中进行透视变换的方法。
希望你能将这个技巧应用到你的图像处理工作中,创造出更加令人惊艳的作品!。
逆透视变换原理
透视变换是指将三维空间的物体映射为二维平面上的图像,而逆透视变换是将二维平面上的图像恢复为三维空间中的物体。
它的原理在于针孔相机模型,即假设光线从物体经过针孔进入相机中,形成的图像就只能是二维平面上的了,而逆透视变换就是通过对这个平面上的图像进行处理,来还原出原来的三维物体。
逆透视变换的实现过程一般包括以下几个步骤:
1. 确认变换矩阵。
逆透视变换矩阵包括相机内参矩阵和相机外参矩阵,需要通过摄像机的参数进行计算出来。
2. 对输入图像进行处理,比如去除畸变。
3. 通过将图像上的点坐标乘以逆透视变换矩阵,得到物体上的点坐标。
4. 对得到的三维物体进行滤波、表面重建等处理,得到最终的三维模型。
逆透视变换常用于计算机视觉和机器人领域中,例如用于计算物体深度、姿态、形状等,或者用于机器人的自主导航和定位等。
但需要注意的是,逆透视变换只能对透视变换后的图像进行还原,对于其他投影方式的图像如正射投影等是无法应用的。
Adobe Photoshop软件中的图像矫正与透视变换技巧Adobe Photoshop软件是一款功能强大的图像处理工具,它不仅可以对图片进行基本的编辑和调整,还能进行高级的图像矫正和透视变换。
本文将介绍一些在Adobe Photoshop中实现图像矫正和透视变换的技巧。
第一部分:图像矫正技巧1. 透视矫正透视矫正是一种常用于修复因镜头偏斜或透视畸变导致的图像失真的技术。
在Adobe Photoshop中,我们可以通过“滤镜”菜单下的“镜头校正”来进行透视矫正。
首先选择“自动校正”,软件会根据图像的特征自动调整透视角度。
如果效果不理想,可以通过手动调整来完善矫正效果。
2. 纠正畸变在一些特殊的拍摄条件下,如广角镜头拍摄或摄影机位偏移,图像中的直线可能会出现弯曲或变形的现象。
Adobe Photoshop提供了“滤镜”菜单下的“变换”功能来修复这种畸变。
通过调整参数,可以将弯曲或变形的直线纠正为真实的直线。
3. 垂直矫正在摄影中,由于拍摄角度或设备问题,图像中的建筑物或其他垂直线可能会倾斜。
倾斜的垂直线会给观看者带来不稳定感。
Adobe Photoshop中的“变换”工具可以轻松解决这个问题。
通过选择相应的区域,然后点击“编辑”菜单下的“变换”选项,在弹出的变换工具中调整线条的角度,即可轻松实现垂直矫正。
第二部分:透视变换技巧1. 图像元素扭曲透视变换功能不仅可以用于矫正图像,还可以用于扭曲和变换图像元素,以创造出独特的效果。
在Adobe Photoshop中,可以选择要变换的图层或选择区域,然后点击“编辑”菜单下的“变换”选项,通过点击鼠标并拖拽来调整元素的形状和透视效果。
2. 车载广告透视变换不仅可以用于二维图像的变换,还可以用于三维物体的透视效果。
比如,如果你想在一辆汽车上放置一个广告牌,你可以使用透视变换来模拟广告牌在特定视角的投射效果。
选择广告牌图层,在“编辑”菜单下选择“变换”,然后通过调整顶点位置来改变广告牌的透视效果。
Photoshop中的图像矫正和透视变换一直以来,图像处理软件Photoshop在各个行业都占据着重要的地位。
其强大的图像编辑和处理功能为用户提供了广阔的创作空间。
其中,图像矫正和透视变换是两个常用的功能,可以使照片或图像更加逼真和真实。
在本文中,我将探讨Photoshop中的图像矫正和透视变换的应用和原理。
首先,图像矫正是一种技术,用于对图像进行修正和调整,以使其看起来更加准确和真实。
这种技术主要应用于修正图像中的畸变、透视和形状失真等问题。
例如,当我们拍摄建筑物或景观时,由于拍摄角度或镜头变形等因素,可能导致图像中的建筑物出现倾斜或变形的情况。
通过使用Photoshop的矫正工具,我们可以轻松地对这些问题进行修正,使图像看起来更加直立和真实。
其次,透视变换是一种常用的技术,用于在二维平面上重建三维物体的透视效果。
通过使用透视变换工具,我们可以在Photoshop中对图像进行透视调整,使其具有更加逼真的立体感。
透视变换常被应用于建筑设计、室内设计和广告制作等领域。
例如,在室内设计中,我们可以通过透视变换将平面图转换为立体效果,以帮助客户更好地预览和理解设计方案。
那么,具体如何在Photoshop中进行图像矫正和透视变换呢?下面我将简要介绍一些常用的方法和步骤。
首先,对于图像矫正,我们可以通过使用“自动匹配”功能来自动调整图像的透视和倾斜问题。
在Photoshop中打开需要矫正的图像后,点击“编辑”菜单下的“自动校正图像”选项即可。
这个功能会自动检测并矫正图像中的透视和倾斜问题,使其看起来更加直立和真实。
其次,对于透视变换,我们可以使用“变换”工具进行调整。
在Photoshop中打开需要进行透视变换的图像后,选择“编辑”菜单下的“变换”选项,然后在弹出的变换框中进行调整。
通过拖动各个角落的控制点,我们可以改变图像的透视关系,并实现不同角度和比例的调整。
此外,Photoshop还提供了其他一些专门的工具和插件,用于更精确和高级的图像矫正和透视变换。
《图像处理实例》之透视变换⽬的:将以下的图⽚转正显⽰opencv⾃带的函数“透视变换”,但是有⼀点,四个交点的值我们是不知道的,有⼏种办法: 1.直接⽤⿏标去Image watch去查看四个交点的值。
2.⽤⾓点检测算法。
我现在还没学到。
3.使⽤数学知识,求四条直线然后进⾏求取。
第⼀种很简单,分分钟实现了。
第⼆种等以后学到再⽤。
本⽂主要介绍第三种。
第⼀种⽅法实现:1 Point p1; // 左上⾓2 p1.x = 13;3 p1.y = 65;4 Point p2; // 右上⾓5 p2.x = 474;6 p2.y = 58;7 Point p3; // 左下⾓8 p3.x = 48;9 p3.y = 310;10 Point p4; // 右下⾓11 p4.x = 461;12 p4.y = 317;1314// 透视变换15 vector<Point2f> src_corners(4);16 src_corners[0] = p1;17 src_corners[1] = p2;18 src_corners[2] = p3;19 src_corners[3] = p4;20int width, height;21 width = SourseImage.cols;22 height = SourseImage.rows;2324 vector<Point2f> dst_corners(4);25 dst_corners[0] = Point(0, 0);26 dst_corners[1] = Point(width, 0);27 dst_corners[2] = Point(0, height);28 dst_corners[3] = Point(width, height);2930// 获取透视变换矩阵31 Mat warpmatrix = getPerspectiveTransform(src_corners, dst_corners);32 warpPerspective(SourseImage, OutputImage, warpmatrix, SourseImage.size(), INTER_LINEAR);33 imshow("123", SourseImage);效果图如下:就是⼿⼯输⼊有点牵强~~⾼斯滤波-->>灰度-->>⼆值化形态学计算-->>反转边缘检测:直线检测:(这个参数得适当的调整,不然效果很差)数学⽅法求直线交点:透视变换:代码:1int main(int argc, char** argv)2 {3 SourseImage = imread("1.png");4if (SourseImage.empty()) return -1;5 imshow("sourse", SourseImage);6//-------------------预处理----------------------//7 GaussianBlur(SourseImage, MiddleImage, Size(3, 3), 3, 3);8 cvtColor(MiddleImage, MiddleImage, CV_BGR2GRAY);9 threshold(MiddleImage, MiddleImage, 0, 255, THRESH_BINARY | THRESH_OTSU);10 imshow("threImage", MiddleImage);11//-------------------形态学操作-----------------//12 Mat kernel = getStructuringElement(MORPH_RECT, Size(27, 27));13 morphologyEx(MiddleImage, MiddleImage, MORPH_OPEN, kernel);14 morphologyEx(MiddleImage, MiddleImage, MORPH_OPEN, kernel);15 bitwise_not(MiddleImage, MiddleImage, Mat());16 imshow("morphology", MiddleImage);17//----------------------边缘检测-----------------------------//18 vector<vector<Point>> contours;19 vector<Vec4i> hierarchy;20 Mat testImage = Mat::zeros(MiddleImage.size(), MiddleImage.type());21 findContours(MiddleImage, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);22for (size_t i = 0; i < contours.size(); i++)23 {24 drawContours(testImage, contours, i, Scalar(255, 255, 255), 1);25 }26 imshow("contours", testImage);2728int width = SourseImage.cols;29int height = SourseImage.rows;30//--------------------------霍夫直线检测------------------------//31 vector<Vec4i> lines;32int accu = min(width*0.3, height*0.3);33 HoughLinesP(testImage, lines, 1, CV_PI / 360, accu, accu, 40);//参数最好⽤图⽚的长宽变换来的,容易移植34 Mat lineImage = Mat::zeros(MiddleImage.size(), MiddleImage.type());35for (size_t i = 0; i < lines.size(); i++)36 {37 line(lineImage, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), Scalar(255, 255, 255), 1, 8, 0);38 }39 imshow("lines", lineImage);40//-----------------查找线段对应的矩形边界------------------//41 Vec4i topline, bottomline, leftline, rightline;42for (size_t i = 0; i < lines.size(); i++)43 {44double roti = abs(lines[i][3] - lines[i][1]);45//判断是平⾏X轴还是平⾏Y轴-->>|y2-y1|46if (roti < SourseImage.cols / 3)//平⾏X轴(上下两条边)47 {48if (lines[i][1] < SourseImage.rows / 2 && lines[i][3] < SourseImage.rows / 2) topline = lines[i];49else bottomline = lines[i];50 }51else//左右两条边52 {53if (lines[i][0] < SourseImage.cols / 2 && lines[i][2] < SourseImage.cols / 2) leftline = lines[i];54else rightline = lines[i];55 }56 }57//--------------------计算四条线段的交点-----------------------//58double b_top, b_bot, b_rit, b_lef;59double k_top, k_bot, k_rit, k_lef;60 Point lef_top, rit_top, lef_bot, rit_bot;61//直线斜率62 k_top = (topline[3] - topline[1]) / (topline[2] - topline[0]);63 k_bot = (bottomline[3] - bottomline[1]) / (bottomline[2] - bottomline[0]);64 k_rit = (rightline[3] - rightline[1]) / (rightline[2] - rightline[0]);65 k_lef = (leftline[3] - leftline[1]) / (leftline[2] - leftline[0]);66//直线表达式因⼦,推到⼀遍就知道了67 b_top = topline[3] - k_top*topline[2];68 b_bot = bottomline[3] - k_bot*bottomline[2];69 b_rit = rightline[3] - k_rit*rightline[2];70 b_lef = leftline[3] - k_lef*leftline[2];71//计算交点值72 lef_top.x = abs((b_top - b_lef) / (k_top - k_lef));73 rit_top.x = abs((b_top - b_rit) / (k_top - k_rit));74 lef_bot.x = abs((b_bot - b_lef) / (k_bot - k_lef));75 rit_bot.x = abs((b_bot - b_rit) / (k_bot - k_rit));7677 lef_top.y = abs(k_top*lef_top.x + b_top);78 rit_top.y = abs(k_top*rit_top.x + b_top);79 lef_bot.y = abs(k_bot*lef_bot.x + b_bot);80 rit_bot.y = abs(k_bot*rit_bot.x + b_bot);81//画出交点82 Mat lastImage = Mat::zeros(MiddleImage.size(), CV_8UC3);83 circle(lastImage, lef_top, 5, Scalar(0, 0, 255));84 circle(lastImage, rit_top, 5, Scalar(0, 0, 255));85 circle(lastImage, lef_bot, 5, Scalar(0, 0, 255));86 circle(lastImage, rit_bot, 5, Scalar(0, 0, 255));87 imshow("circle", lastImage);88//-------------------------透视变换------------------------//89//存储需要变换的四点90 vector<Point2f> srcPoint(4), dstPoint(4);91 srcPoint[0] = lef_top;92 srcPoint[1] = rit_top;93 srcPoint[2] = lef_bot;94 srcPoint[3] = rit_bot;9596 dstPoint[0] = Point2f(0, 0);97 dstPoint[1] = Point2f(SourseImage.cols, 0);98 dstPoint[2] = Point2f(0, SourseImage.rows);99 dstPoint[3] = Point2f(SourseImage.cols, SourseImage.rows);100101 Mat Change = getPerspectiveTransform(srcPoint,dstPoint);102 warpPerspective(SourseImage, OutputImage, Change, OutputImage.size());103 imshow("test",OutputImage);104 waitKey(0);105return0;106 }其实那个阈值化也可以⾃⼰⼿动去调节:g_Value =95;void on_AdaptThreshold(int, void*){ int k = 2 * g_Value + 1; adaptiveThreshold(MiddleImage, OutputImage, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, k, 0); imshow("AdaptThreshold", OutputImage);}参考:贾志刚opencv系列。