opencv的projectPoints的使用

前言

今天要用到重投影这块的内容,是想把相机坐标系下的一个点投影到像素坐标系下。原理很简单,其实手搓一个函数也完全可以。但是还是想尝试一下用封装好的库函数,这样比较简洁和优雅。
但是使用过程中遇到了一些程序死掉的问题。

代码片段

  std::vector<cv::Point3f> objectPoints;
  std::vector<cv::Point2f> imagePoints;

  tVec.x() = tVec.x()/tVec.z();
  tVec.y() = tVec.y()/tVec.z();
  tVec.z() = 1;

  objectPoints.emplace_back(tVec.x(), tVec.y(), tVec.z());

  cv::Mat tvec = (cv::Mat_<float>(1, 3) << 0, 0, 0);
  cv::projectPoints(objectPoints, cv::Mat::zeros(1, 3, CV_64F), tvec, this->camera_matrix_, this->dist_coeffs_, imagePoints);
  cv::Point2d point2D = imagePoints[0];
  if (point2D.x > 0 && point2D.y > 0 && point2D.x < image.cols && point2D.y < image.rows)
      cv::circle(image, point2D, 6, cv::Scalar(255,0,255), -1);

踩的坑

踩坑的原因主要是对于projectPoints函数所传入的参数不熟悉。
比如上文的objectPoints等的类型。
以及rvec,tvec的赋值也要注意,由于我已知相机坐标系下的点的坐标,所以实际是不需要用这两个相机外参的。因此需要赋空值。二者赋空值的方式如上。
奇怪的是,如果像下面这样,编译时会出问题的。必须像上面那样。

  cv::projectPoints(objectPoints, cv::Mat::zeros(1, 3, CV_64F), (cv::Mat_<float>(1, 3) << 0, 0, 0), this->camera_matrix_, this->dist_coeffs_, imagePoints);
  cv::Point2d point2D = imagePoints[0];

参考博客:https://blog.csdn.net/weixin_43297891/article/details/114497700

posted @ 2024-04-06 19:28  BoZhi233  阅读(1080)  评论(0)    收藏  举报