我有一个vector
Point2f
,其颜色空间为CV_8UC4
,需要将它们转换为CV_64F
,以下代码是否正确?
points1.convertTo(points1, CV_64F);
更多详情:
我正在尝试使用此函数通过5点算法计算基本矩阵(旋转/平移),而不是使用OpenCV中包含的findFundamentalMath,它基于8点算法:
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
,而是传递vector
Point2f
,这似乎没有任何问题,因为它可以正确编译和执行。
是否应该将匹配项存储在Mat
?
答案 0 :(得分:0)
不,不是。 std::vector<cv::Pointf2f>
无法使用OpenCV convertTo
函数。
我认为你的确意味着cv::Mat points1
类型为CV_8UC4
。请注意,这些值为RxCx4
值(R
和C
行数和列数),而CV_64F
矩阵中的值为RxC
只要。因此,您需要更清楚地了解如何转换这些值。
您可以points1.convertTo(points1, CV_64FC4)
获取RxCx4
矩阵。
<强>更新强>
更新问题后的一些评论:
请注意,vector<cv::Point2f>
是2D点的矢量,与任何特定颜色空间无关,它们只是图像轴中的坐标。因此,它们代表灰色,rgb或hsv图像中的相同2D点。然后,findEssentialMat
的执行时间不依赖于图像颜色空间。但是,获得积分可能会。
那就是说,我认为你对findEssentialMat
的输入是正确的(函数处理向量并将它们转换为它们的内部表示)。在这种情况下,在图像中绘制点以调试代码非常有用。
答案 1 :(得分:0)
我不确定你是指Point2f的矢量在某些颜色空间中,但如果你想将点矢量转换为另一种类型的点矢量,你可以使用任何标准的C ++ / STL函数,如copy(),assign ()或insert()。例如:
copy(floatPoints.begin(), floatPoints.end(), doublePoints.begin());
或
doublePoints.insert(doublePoints.end(), floatPoints.begin(), floatPoints.end());