首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >立体声系统-使用OpenCv获取3d位置

立体声系统-使用OpenCv获取3d位置
EN

Stack Overflow用户
提问于 2014-12-15 03:39:33
回答 3查看 1.4K关注 0票数 2

我有一个带两个摄像头的立体声系统。我校准了这些相机。我尝试计算每个fingertip.On左侧图像之间的距离,我使用凸包找到指尖。我计算这些点的外极线。我在右边的图像上画极线。如何计算每个指尖的3d位置?我使用了c++和opencv。

下图有5个窗口。它们是:右图像,左图像,在右图像上用凸包查找指尖,在左图像上画极线,在左图像上找对应点。

我的.yml文件在立体声校准后如下

代码语言:javascript
复制
%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. ]
EN

回答 3

Stack Overflow用户

发布于 2014-12-15 04:41:57

由于您不能确保使用您的方法对两个图像都能获得准确的指尖,因此我将使用不同的方法:

  • 首先使用3D image reconstruction获取手的深度图像。
  • 然后使用现有算法获取深度图像中的指尖。
  • 最后使用深度信息重建指尖的3D位置。
票数 0
EN

Stack Overflow用户

发布于 2014-12-15 18:16:21

您可能需要一些基于3D-2D点对应的非常快速和简单的解决方案。然后你对3D模型进行点的拟合,可以自由地找到很多手部的3D模型,即:http://www.turbosquid.com/3d-model/anatomy/hand OpenCV提供了一个很好的方法- solvePnP -可以完成拟合步骤。我们需要做以下工作:

  1. 下载免费模型。
  2. 使用任何3D编辑器编辑模型(即:MeshLab)
  3. Mark每个指尖的位置,我们将获得五个三维点
  4. 将它们保存在一个文件中作为参考模型
  5. 您的opencv程序将为您找到五个二维点。

<>H113>现在您有了模型点( 3D )和真实图像点( 2D ),您必须使用solvePnP function对它们进行拟合: solvePnP (model_points,image_points,cameraMatrix and )将获得一个3x3矩阵,可以定义为: double calMat9 ={ x_center,0,x_shift,0,y_center,y_shift,0,0,1 };//“校准矩阵”:x_center,y_center点是考虑焦距为ie的图像中心。x_center=y_center=30 cameraMatrix = Mat(3,3,CV_64FC1,calMat);

  1. 通过这些步骤,您可以在移动

时随时估计每个指尖的3D位置

票数 0
EN

Stack Overflow用户

发布于 2018-07-26 04:30:23

使用cv::undistortPoints()消除2D点的扭曲。将未失真的点从两个摄影机传递到cv::triangulatePoints() (以及摄影机投影矩阵)和cv::Mat以存储(同源) 3D坐标。调用convertPointsFromHomogenous()来获取普通的(非均匀的) 3D点。注意:投影矩阵是来自cv::stereoRectify和/或<opencv-dir>/samples/cpp/stereo_calib.cpp的P1和P2。您可能会发现How to correctly use cv::triangulatePoints()很有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27473257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档