我使用以下代码
提取了图像的一些特征点vector<Point2f> cornersFrame1;
goodFeaturesToTrack( frame1, cornersFrame1, maxCorners, qualityLevel, minDistance, Mat(), blockSize, useHarrisDetector, k );
之后我想读取这些特征点的当前值。所以,我使用以下代码:
for(int i=0; i<cornersFrame1.size(); i++)
{
float frame1 = calculatedU.at<float>( cornersFrame1[i].x, cornersFrame1[i].y );
}
然后我得到了分段错误。
但是,如果我在“For loop”中使用以下代码,那么它可以工作。
float frame1 = calculatedU.at<float>( cornersFrame1[i].y, cornersFrame1[i].x );
我很困惑因为我认为“Point2f”将像素信息存储为(row,col)。不是吗?
答案 0 :(得分:1)
不,不是。 OpenCV中的所有类型的点都是您可以考虑的正常点:(x,y)。在图像中进行坐标时,这意味着'x'是一列,'y'是一行。另一方面,&lt;&gt;需要作为输入(行,列)。这就是你必须提供(y,x)而不是(x,y)的原因。
为了防止将来混淆,使用at&lt;&gt;的方法之一就是这个:
float frame1 = calculatedU.at<float>( cornersFrame1[i] );
这样您就不需要考虑是否应该提供(x,y)或(y,x)。