Track<cv::Point2d> calibrateAndUndistortTrack(
    const Track<cv::Point2d>& track,
    const CameraProperties& intrinsics) {
  // Calibrate each point, undo intrinsics.
  Track<cv::Point2d> calibrated;
  cv::Mat K_inv(intrinsics.matrix().inv());
  std::transform(track.begin(), track.end(),
      std::inserter(calibrated, calibrated.begin()),
      boost::bind(calibrateIndexedPoint, _1, K_inv));

  // Remove non-undistortable points.
  Track<cv::Point2d> valid;
  std::remove_copy_if(calibrated.begin(), calibrated.end(),
      std::inserter(valid, valid.begin()),
      boost::bind(indexedPointIsNotUndistortable, _1, intrinsics.distort_w));
  DLOG(INFO) << valid.size() << " / " << calibrated.size() <<
      " could be undistorted";

  // Undistort undistortable points.
  Track<cv::Point2d> undistorted;
  std::transform(valid.begin(), valid.end(),
    std::inserter(undistorted, undistorted.begin()),
    boost::bind(undistortIndexedPoint, _1, intrinsics.distort_w));

  return undistorted;
}
示例#2
0
/*!
  Return the inverted camera matrix \f$K^{-1}\f$ given by:

  \f$ K^{-1} = \left[\begin{array}{ccc}
  1/p_x & 0 & -u_0/p_x \\
  0 & 1/p_y & -v_0/p_y  \\
  0 & 0 & 1
  \end{array} \right] \f$

  \sa get_K()
*/
vpMatrix
vpCameraParameters::get_K_inverse() const
{
    vpMatrix K_inv(3, 3, 0.);
    K_inv[0][0] = inv_px ;
    K_inv[1][1] = inv_py ;
    K_inv[0][2] = -u0*inv_px ;
    K_inv[1][2] = -v0*inv_py ;
    K_inv[2][2] = 1.0 ;

    return K_inv;
}