【辅助驾驶】透视变换(包含鸟瞰图、俯视图、正视图)小结_附仿射变换

版权声明:欢迎转载,请注明来源 https://blog.csdn.net/linghugoolge/article/details/85090440

一、目的

应用1:实现扫描功能,类似“扫描全能王APP”

应用2:辅助驾驶(行车记录仪)

二、原理

1、仿射变换

 1)定义:

仿射变换是一种二维坐标到二维坐标之间的线性变换。它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。

仿射变换可以直观理解为旋转、平移、缩放等操作。

2)效果:

3)原理:

4)数学

任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式.

2、透视变换

1)定义

透视变换是将图片投影到一个新的视平面,也称作投影映射.它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射。其中不要求投影平面与图像平面互相平行。由此,得到的投影图像将可能不会再是平行四边形,而有可能出现梯形。 

2)效果

3)原理

4)数学

相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形).它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换.

三、代码

1、透视变换“扫描全能王”代码实现

1)python代码,基于opencv库和imutils库

来源:https://blog.csdn.net/qq_34199383/article/details/79571318

from imutils import perspective
from skimage.filters import threshold_local
import cv2
import imutils
 
# 边缘扫描
image = cv2.imread("./picture/5.png")
ratio = image.shape[0] / 500.0                                 # 比例
orig = image.copy()
image = imutils.resize(image, height = 500)
 
# 灰度转换及边缘查找
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 75, 200)                               # 边缘检测
 
# 只保留轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)#通过边缘图像找到轮廓
cnts = cnts[0] if imutils.is_cv2() else cnts[1]                # 用以区分OpenCV2.4和OpenCV3
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5] # 保留最大轮廓
 
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)            # 轮廓点    
    if len(approx) == 4:                                       # 表明找到四个轮廓点
        screenCnt = approx
        break
    
# 转为鸟瞰图
warped = perspective.four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)
warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)              # 灰度转换
T = threshold_local(warped, 11, offset = 10, method = "gaussian")
warped = (warped > T).astype("uint8") * 255
 
cv2.imshow("Original", imutils.resize(orig, height = 650))
cv2.imshow("Scanned", imutils.resize(warped, height = 650))
cv2.waitKey(0)

2)C++实现,基于opencv的getPerspectiveTransform()函数和warpPerspective()函数

代码:https://blog.csdn.net/t6_17/article/details/78729097

效果:

2、辅助驾驶(行车记录仪)实现

//TODO

猜你喜欢

转载自blog.csdn.net/linghugoolge/article/details/85090440
今日推荐