【輔助駕駛】透視變換(包含鳥瞰圖、俯檢視、正檢視)小結_附仿射變換
一、目的
應用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