我正在做一個激光掃描專案。為此,我正在關注這篇
計算/找到內在相機矩陣之后
cv.findChessboardCorners()
cv.cornerSubPix()
按照opencv.org的本教程,我正在使用
cv.solvePnP()
函式獲取平面的旋轉和平移向量。使用以下代碼,我現在按照作者的公式計算距相機中心的法線距離和有符號距離:
normalvector = rotationmatrix * [[0][0][1]]
distance = (normalvector * -1)T * translational vector
(T = 向量轉置)
import numpy as np
import cv2 as cv
with np.load("vectorsRT.npz", "r") as file:
rvecs, tvecs = [file[i] for i in ("rotationVectors", "translationVectors")]
rot_matrix = cv.Rodrigues(rvecs)[0]
mult_matrix = np.array([[0],[0],[1]])
normal_vector = np.matmul(rot_matrix, mult_matrix)
normal_vector_neg = normal_vector * -1
normal_vector_neg_transposed = np.transpose(normal_vector_neg)
signed_distance = np.matmul(normal_vector_neg_transposed, tvecs)
print("normal_vector:", normal_vector)
print("signed_distance:", signed_distance)
有了這個,我現在得到一個法線向量和距相機中心的距離,例如: normal_vector:
[[-0.0604253 ]
[ 0.16923283]
[ 0.98372203]]
簽名距離:
[[[-51.67514398]]]
從攪拌機我得到以下正常
[[-0.00117647]
[-0.00333335]
[-0.01939508]]
法線或多或少是等價的,但是,現在有符號距離如何轉換為世界坐標系中平面的支持向量,所以我可以得到完整的平面方程?
uj5u.com熱心網友回復:
我想我找到了答案:在這篇文章之后,我為有符號距離引入了一個比例因子 s,將距離轉換為真實世界的距離(以毫米為單位)。
calc_distance_camera_plane = signed_distance * s
這個比例因子是通過將已知距離與平面的距離(例如:棋盤在世界坐標系中的 Z = 0 上,相機固定在一個位置,例如:Z = 25 mm,向下看)除以該精確影像的signed_distance
scale_factor = dist_camera_world_orign / signed_distance
使用該比例因子,可以將每個 signed_distance 轉換為真實世界距離(相機平面),并獲得真實世界距離(世界原平面)
dist_world_orign_plane = dist_camera_world_orign - calc_distance_camera_plane
然后我尋找的平面方程由計算的法線和一個點給出
(0, 0, dist_world_orign_plane)
由于我有原始平面的確切值(影像是用攪拌機計算的),我可以將 camera_plane 的計算距離與實際距離(實際距離/計算距離)進行比較:
n = 10
mean difference: 1.005
standard deviation: 0.0281
我認為這是進一步測驗的良好起點。希望這個答案也可以幫助其他人,干杯
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/430354.html
上一篇:最近鄰搜索對于多個資料來說太長了
下一篇:SwiftUI[Presentation]Attempttopresent...on...其視圖不在視窗層次結構中
