在OpenCV中将匹配从8位4通道转换为64位1通道

时间:2014-05-29 03:34:10

标签: opencv color-space

我有一个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_8UC4BGRA图片。当我测试函数时,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

2 个答案:

答案 0 :(得分:0)

不,不是。 std::vector<cv::Pointf2f>无法使用OpenCV convertTo函数。

我认为你的确意味着cv::Mat points1类型为CV_8UC4。请注意,这些值为RxCx4值(RC行数和列数),而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());