代码之家  ›  专栏  ›  技术社区  ›  Fedir Tsapana

OpenCV三角:查找离摄影机最近的对象

  •  0
  • Fedir Tsapana  · 技术社区  · 7 年前

    我认为这是基本的三角函数任务,但我的三角函数不是很好。我已经校准了相机,所以我知道相机矩阵和失真系数。我还能够检测aruco板(使用opencv的aruco contrib模块)及其位置,因此我有板的旋转向量和平移向量(在相机空间?)。所以我也可以使用相对于电路板的坐标来定义电路板中心周围的黄色圆圈,并使用函数来绘制它们 cv::projectPoints (黄色标记点、rvec、tvec、camMatrix、DistCoefs、imagePoints);和cv::圆。现在我需要计算离相机最近的圆。我不知道该怎么做!

    所以我有:

    Mat camMatrix, distCoeffs;
    Vec3d rvec, tvec;//board pose
    vector< Point3f > yellowMarkerPoints;//yellow circles positions
    

    situation

    或者类似的问题:如何从这些数据中获得电路板相对于相机的角度(也称为“偏航”旋转角度)?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Catree    7 年前

    solvePnP() 文件编号:

    enter image description here

    该图表示要估计旋转和平移的姿势估计问题,该旋转和平移允许将世界帧中表示的坐标转换为相机帧。

    您需要的是每 yellowMarkerPoints 将Aruco板框架表示为摄像头框架,并计算到摄像头框架的距离。类似于:

    cv::Mat R;
    cv::Rodrigues(rvec, R);
    cv::Mat cTw(4,4,CV_64F);
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        cTw.at<double>(i,j) = R.at<double>(i,j);
      }
      cTw.at<double>(i,3) = tvec.at<double>(i);
    }
    
    for (size_t i = 0; i < yellowMarkerPoints.size(); i++) {
      cv::Mat pts3D = (cv::Mat_<double>(4,1) << yellowMarkerPoints[i].x, yellowMarkerPoints[i].y, yellowMarkerPoints[i].z, 1);
      cv::Mat pts3D_cam = cTw * pts3D ;
      double dist_to_cam = sqrt( pts3D_cam.at<double>(0)*pts3D_cam.at<double>(0) + pts3D_cam.at<double>(1)*pts3D_cam.at<double>(1) + pts3D_cam.at<double>(2)*pts3D_cam.at<double>(2) );
    }
    

    相当于:

    enter image description here