簡體   English   中英

立體聲系統-使用OpenCv獲得3D位置

[英]Stereo system - Get 3d position usind OpenCv

我有一個帶2個攝像機的立體聲系統。 我校准了這些相機。 我嘗試計算每個指尖之間的距離。在左圖上,我發現了使用凸包的指尖。 我計算這些點的上皮線。在正確的圖像上繪制上皮線。 如何計算每個指尖的3d位置? 我使用了c ++和opencv。

圖像下方有5個窗口。 它們是:右圖像,左圖像,在右圖像上使用凸包找到指尖,在左圖像上繪制極線,在左圖像上找到對應點

在此處輸入圖片說明

立體聲校准后,我的.yml文件在下面

%YAML:1.0
CM1: !!opencv-matrix
 rows: 3
 cols: 3
 dt: d
 data: [ 1.4947330489959640e+02, 0., 8.5026435902438408e+01, 0.,
   1.7045159164506524e+02, 6.8513237416979280e+01, 0., 0., 1. ]
CM2: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 1.4947330489959640e+02, 0., 7.6063817190941975e+01, 0.,
   1.7045159164506524e+02, 6.9869364400956655e+01, 0., 0., 1. ]
D1: !!opencv-matrix
rows: 1
cols: 5
dt: d
data: [ 4.6664660489275862e+00, -9.5605452982913761e+01, 0., 0.,
   4.4411083031870203e+02 ]
D2: !!opencv-matrix
rows: 1
cols: 5
dt: d
data: [ -2.6243438145377401e-01, 3.1158182596121313e+00, 0., 0.,
   -6.9555261934841601e+00 ]
R: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ -9.9870707407742809e-01, 5.0820157566619700e-02,
   1.2213814337059467e-03, -4.6584627039081256e-02,
   -9.2456021193091820e-01, 3.7817758664136281e-01,
   2.0348285218473684e-02, 3.7763173343769685e-01,
   9.2573226215224258e-01 ]
T: !!opencv-matrix
rows: 3
cols: 1
dt: d
data: [ -5.0257191774306198e-01, -5.1791340062890008e+00,
   -1.7104054803114692e+00 ]
E: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ -1.8506509733057530e-01, -3.5371782058656147e+00,
   -4.1476544229091719e+00, 1.7184205294528965e+00,
   1.0286402846218139e-01, 4.6315798080871423e-01,
   -5.1490256443274198e+00, 7.2786240503729882e-01,
   -1.8373573684783620e-01 ]
 F: !!opencv-matrix
  rows: 3
 cols: 3
 dt: d
 data: [ -2.0635586643392613e-06, -3.4586914187982223e-05,
   -4.3677532717492718e-03, 1.6802903312164187e-05,
   8.8202517402136951e-07, -8.1218529743132760e-04,
   -9.5988974549000728e-03, 3.6330053228360980e-03, 1. ]

由於您不確定使用兩種方法都能獲得確切的指尖,因此我將使用另一種方法:

  • 首先使用3D圖像重建來獲取手部的深度圖像。
  • 然后使用現有算法在深度圖像中獲取指尖。
  • 最后,使用深度信息重建指尖的3D位置。

您可能需要一些基於3D-2D點對應的非常快速簡單的解決方案。 然后您將點擬合到3D模型中,可以自由找到很多手的3D模型,即: http ://www.turbosquid.com/3d-model/anatomy/hand OpenCV提供了一種不錯的方法-solvePnP -可以進行擬合步驟。 我們需要執行以下操作:

  1. 下載免費模型。
  2. 使用任何3D編輯器編輯模型(即MeshLab
  3. 標記每個指尖的位置,我們將獲得五個3D點
  4. 將它們保存在文件中作為參考模型
  5. 您的opencv程序將為您找到五個2D點。
  6. 現在您有了模型點(3d)和真實圖像點(2D),您必須使用solvePnP函數對其進行擬合:resolvePnP(model_points,image_points,cameraMatrix ..some_calibration_params)
  7. 我們將得到一個3x3矩陣,您可以將其定義為:double calMat [9] = {x_center,0,x_shift,0,y_center,y_shift,0,0,1}; //“校准矩陣”:x_center,y_center點是考慮焦距即的圖像中心。 x_center = y_center = 30 cameraMatrix = Mat(3,3,CV_64FC1,calMat);
  8. 通過這些步驟,您可以在移動手時隨時估計每個指尖的3D位置

使用cv::undistortPoints() 2D點cv::undistortPoints() 將兩個相機的未失真點傳遞到cv::triangulatePoints() (以及相機投影矩陣)和cv::Mat來存儲(均勻的)3D坐標。 調用convertPointsFromHomogenous()獲得普通(不均勻)3D點。 注意:投影矩陣是來自cv::stereoRectify和/或<opencv-dir>/samples/cpp/stereo_calib.cpp P1和P2。 您可能會發現如何正確使用cv :: triangulatePoints()很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM