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

在OpenCV中将匹配项从8位4通道转换为64位1通道,opencv,color-space,Opencv,Color Space,我有一个Point2f的vector,它有颜色空间CV_8UC4,需要将它们转换为CV_64F,以下代码正确吗 points1.convertTo(points1, CV_64F); 更多详细信息: 我尝试使用此函数通过5点算法计算基本矩阵(旋转/平移),而不是使用OpenCV中包含的findFundamentalMath,它基于8点算法: 如您所见,它首先将图像转换为CV\u 64F。我的输入图像是一个CV_8UC4,BGRA图像。当我测试函数时,从数学角度来看,BGRA和灰度图像都会生成

我有一个
Point2f
vector
,它有颜色空间
CV_8UC4
,需要将它们转换为
CV_64F
,以下代码正确吗

points1.convertTo(points1, CV_64F);
更多详细信息:

我尝试使用此函数通过5点算法计算基本矩阵(旋转/平移),而不是使用OpenCV中包含的findFundamentalMath,它基于8点算法:

如您所见,它首先将图像转换为
CV\u 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);
vectorimgpts1,imgpts2;
对于(vector::const_迭代器it=matches.begin();it!=matches.end();++it)
{
imgpts1.push_back(firstViewFeatures.second[it->queryIdx].pt);
imgpts2.push_back(secondViewFeatures.second[it->trainIdx].pt);
}
垫罩;
Mat E=FindSentialMat(imgpts1,imgpts2,[摄像机焦距],[摄像机主点],CV_RANSAC,0.999,1,遮罩);
事实上,我没有传递
Mat
,而是传递
Point2f
vector
,这似乎不会产生任何问题,因为它可以正确编译和执行


如果是这样,我应该将匹配项存储在
垫子中吗?

不,不是。
std::vector
无法使用OpenCV
convertTo
函数

我想你的意思是你有一个
cv::Mat points1
类型的
cv\u 8UC4
。请注意,这些是
RxCx4
值(即
R
C
行数和列数),并且在
CV_64F
矩阵中,您将仅具有
RxC
值。因此,您需要更清楚地了解如何转换这些值

您可以执行
points1.convertTo(points1,cv64fc4)
以获得
RxCx4
矩阵

更新:

更新问题后的一些评论:

请注意,
矢量
是与任何特定颜色空间无关的2D点矢量,它们只是图像轴中的坐标。因此,它们在灰色、rgb或hsv图像中表示相同的2D点。然后,
findesentialmat
的执行时间不依赖于图像颜色空间。不过,获得分数可能会有帮助


也就是说,我认为您对
findesentialmat
的输入是正确的(该函数负责向量并将它们转换为它们的内部表示)。在这种情况下,在图像中绘制点来调试代码是非常有用的。

我不确定你指的是在某些颜色空间中的点2f的向量,但是如果你想将点的向量转换为另一种类型的点的向量,你可以使用任何标准的C++/STL函数,如copy()、assign()或insert()。例如:

copy(floatPoints.begin(), floatPoints.end(), doublePoints.begin());


我在问题中添加了更多的细节,这并不是我想问的问题。请参阅更新。
doublePoints.insert(doublePoints.end(), floatPoints.begin(), floatPoints.end());