前言
今天要用到重投影这块的内容,是想把相机坐标系下的一个点投影到像素坐标系下。原理很简单,其实手搓一个函数也完全可以。但是还是想尝试一下用封装好的库函数,这样比较简洁和优雅。
但是使用过程中遇到了一些程序死掉的问题。
代码片段
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
标签:objectPoints,imagePoints,projectPoints,opencv,tVec,使用,cv,point2D From: https://www.cnblogs.com/bozhi233/p/18117805