【发布时间】:2017-12-01 22:56:30
【问题描述】:
如上所述,我有一个 cv::Point3f 的 std::vector。我有一个转换矩阵。我需要将向量乘以 Mat 的倒数。
我的垫子:(T 是结果转换)
cv::Mat R(3,3,rvec.type());
cv::Rodrigues(rvec, R); // R is 3x3
cv::Mat T(4, 4, R.type()); // T is 4x4
T(cv::Range(0, 3), cv::Range(0, 3)) = R * 1; // copies R into T
T(cv::Range(0, 3), cv::Range(3, 4)) = tvec * 1; // copies tvec into T
float *p = T.ptr<float>(3);
p[0] = p[1] = p[2] = 0; p[3] = 1;
我的矢量:
std::vector<cv::Point3f> objectPoints;
我试过了:
cv::Mat V = T.inv() * cv::Mat(objectPoints, false)
V.copyTo(cv::Mat(objectPoints, false));
(断言失败,类型错误)
for (int i = 0; i < objectPoints.size(); i++)
{
cv::Mat dst = cv::Mat(objectPoints[i], false);
dst = -T*dst; //USE MATRIX ALGEBRA
// cv::Point3f tmp3 = cv::Point3f(dst(0, 0), dst(1, 0), dst(2, 0));
}
(断言失败)
std::vector<cv::Point3f> p3d;
perspectiveTransform(objectPoints, p3d, -T);
(运行,但值非常不正确)
cv::transform(objectPoints, p3d, -T);
(断言错误)
这样做的正确方法是什么(如果有办法!)?
谢谢。
【问题讨论】:
-
所以你想将
std::vector<cv::Point3f>与cv::Mat的倒数相乘,你希望结果是一个Mat 还是没关系? -
理想情况下,结果将是一个新的 std::vector
。感谢您的回复。 -
理想情况下,
cv::Mat V = T.inv() * cv::Mat(objectPoints, false) V.copyTo(cv::Mat(objectPoints, false));应该可以工作。可以添加Mat的类型吗? -
它使用与
rvec相同的类型,我初始化为:cv::Mat rvec(3, 1, cv::DataType<float>::type); -
我认为问题在于你试图将一个 4*4 矩阵与一个 n*3 相乘(
cv::Point3f转换为Mat)这不起作用