【发布时间】:2014-07-18 11:36:47
【问题描述】:
我有一个vector 的Point2f 有颜色空间CV_8UC4 并且需要将它们转换为CV_64F,下面的代码是否正确?
points1.convertTo(points1, CV_64F);
更多详情:
我正在尝试使用这个函数通过 5 点算法来计算本质矩阵(旋转/平移),而不是使用 OpenCV 中包含的基于 8 点算法的 findFundamentalMath:
https://github.com/prclibo/relative-pose-estimation/blob/master/five-point-nister/five-point.cpp#L69
如您所见,它首先将图像转换为CV_64F。我的输入图像是CV_8UC4、BGRA 图像。当我测试这个函数时,BGRA 和灰度图像都从数学的角度产生了有效的矩阵,但是如果我传递的是灰度图像而不是颜色,则需要更多的计算时间。这让我觉得在这两种情况之一中我没有正确地做某事。
我读到过,当色彩空间的变化不是线性的(我想在这种情况下,当你从 4 个通道变为 1 个通道时就是这种情况),你应该标准化强度值。那是对的吗?我应该给这个函数哪个输入?
另外注意,在我的代码中函数是这样调用的:
vector<Point2f>imgpts1, imgpts2;
for (vector<DMatch>::const_iterator it = matches.begin(); it!= matches.end(); ++it)
{
imgpts1.push_back(firstViewFeatures.second[it->queryIdx].pt);
imgpts2.push_back(secondViewFeatures.second[it->trainIdx].pt);
}
Mat mask;
Mat E = findEssentialMat(imgpts1, imgpts2, [camera focal], [camera principal_point], CV_RANSAC, 0.999, 1, mask);
事实上我没有传递Mat,而是传递Point2f 的vector,这似乎没有造成任何问题,因为它可以正确编译和执行。
是否应该将匹配项存储在Mat 中?
【问题讨论】:
标签: opencv color-space