在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
无法使用OpenCVconvertTo
函数
我想你的意思是你有一个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());